游戏引擎学习第22天
移除 DllMain() 并成功重新编译
以下是对内容的详细复述与总结:
-
问题和解决方案:
- 在编译过程中遇到了一些问题,特别是如何告知编译器不要退出程序,而是继续处理。问题的根源在于编译过程中传递给链接器的参数设置不正确。
- 原本尝试将一个“斜杠”后跟“l”的参数传递给链接器,但实际上这是一个编译器的选项,而不是链接器的。因此,正确的做法是将该选项作为编译器的开关传递,而不是链接器。
- 经过这个调整,问题得以解决。
-
不再需要的操作:
- 在编译和链接过程中,某些操作被发现是多余的。例如,在
game.cpp
文件的底部,曾插入了一个DllMain
函数。这通常是 Windows 系统加载程序时会调用的函数,用来检查程序是否正常启动。 - 经过检查,发现该
DLLMain
函数不再需要,因此决定删除它。
- 在编译和链接过程中,某些操作被发现是多余的。例如,在
-
构建目录的整理:
- 在完成以上调整后,构建目录得到了整理。对于可能是指构建或处理某些文件这一部分,开发者指出它仍然需要存在,但某些不必要的部分已经被清除。
- 例如,某些与可能是指某个不必要的工具或文件相关的东西不再需要,因此被移除。
-
后续步骤:
- 在进行这些调整后,接下来的目标是进一步优化和清理当前的构建设置,确保没有多余的内容或文件存在,所有操作都与当前的需求保持一致。
总结来说,调整主要集中在编译过程的参数设置以及不再需要的代码删除上,目标是优化构建流程,并清理不必要的部分,使得整个开发环境更加简洁和高效。
演示热重载,并决定减少更新延迟并启用调试
以下是对内容的详细复述和总结:
-
当前进展:
- 昨天的工作使得项目达到了一个相当不错的位置,开发者能够在游戏运行时直接修改游戏行为。例如,可以在游戏中实时改变颜色并看到效果。每次修改后,只需要保存,游戏就会定期重新加载更新内容,尽管存在一定的延迟。
-
存在的问题:
- 游戏的更新和重载有延迟,这是因为游戏仅每隔约两秒钟检查一次是否需要重新加载内容。开发者计划优化这个过程,减少延迟,提高游戏反应速度。
- 另一个问题是,如果在调试模式下运行游戏,尝试编译时会遇到困难。具体问题在于,当游戏正在运行并处于调试状态时,Visual Studio 会锁定调试信息文件,这导致无法编译更新的内容。编译器无法输出新的调试文件,因为它试图覆盖已经被锁定的文件。
-
解决方案的探索:
- 为了解决这个问题,开发者希望找到一种方法,在使用调试器时能够顺利进行编译和运行,而不需要停止调试。目的是能够在不停止调试的情况下继续工作,甚至进行实时代码修改(Live coding)。
-
总结:
- 当前的目标是优化游戏的实时更新机制,减少延迟,并解决在调试模式下无法编译的问题。开发者希望找到一种方法,使得调试和编译可以在不中断运行的情况下顺利进行,从而提升开发效率。
这些问题和解决方案反映了在游戏开发和调试过程中常见的挑战,尤其是在实时修改和调试时需要注意的文件锁定和更新问题。
# CMake 项目的基础配置
# 创建静态库或者共享库,可以选择 comment 出静态库行来生成不同的库类型。
# 如果你想要创建静态库,请取消下面一行的注释:
# add_library(game STATIC "game.cpp") # 生成 game.lib# 创建共享库(DLL)
add_library(game SHARED "game.cpp") # 生成 game.dll# 设置目标属性,手动添加 EXPORT 标志
set_target_properties(game PROPERTIESLINK_FLAGS "/EXPORT:GameUpdateAndRender /EXPORT:GameGetSoundSamples" # 设置导出函数的符号
)# 创建 win32_game 可执行文件,指定源文件
add_executable(win32_game WIN32 "win32_game.cpp")# 为编译器添加定义的全局宏
add_compile_definitions(GAME_SLOW=1 GAME_INTERNAL=1)# 获取当前时间,格式化为 年月日_时分秒
string(TIMESTAMP CURRENT_DATE "%Y%m%d_%H%M%S")
message("Current date and time: ${CURRENT_DATE}")# 为 game 目标设置 PDB 文件路径,包含当前时间戳
# 这会生成动态链接库的 PDB 文件,文件名包括编译时的时间戳
if(MSVC) # 如果使用 Microsoft Visual C++ 编译器target_link_options(game PRIVATE "/PDB:${CMAKE_BINARY_DIR}/game/game_${CURRENT_DATE}.pdb")
endif()# 使用 file(GLOB ...) 查找所有 .pdb 文件,并逐个删除
file(GLOB PDB_FILES "${CMAKE_BINARY_DIR}/game/game_*.pdb")# 创建清理所有 .pdb 文件的自定义目标 clean-all
add_custom_target(clean-allCOMMAND ${CMAKE_COMMAND} -E echo "Cleaning up game.pdb files"
)# 遍历所有 .pdb 文件,并为每个文件添加删除命令
foreach(PDB_FILE ${PDB_FILES})add_custom_command(TARGET clean-allPOST_BUILD # 在构建之后执行COMMAND ${CMAKE_COMMAND} -E remove ${PDB_FILE} # 删除每个 .pdb 文件COMMAND ${CMAKE_COMMAND} -E touch ${CMAKE_SOURCE_DIR}/CMakeLists.txtCOMMENT "removing ${PDB_FILE}" # 注释,说明正在删除的文件COMMENT "Updating CMakeLists.txt timestamp" # 跟新CMakeLists.txt时间戳)
endforeach()# 确保在构建 'game' 之前先执行 clean-all 清理操作
add_dependencies(game clean-all)# 链接 Win32 库到 win32_game
# 这里链接了三个 Windows 库:User32.lib、Gdi32.lib 和 Winmm.lib
target_link_libraries(win32_game PRIVATE User32.lib Gdi32.lib Winmm.lib)# 如果使用 MSVC 编译器,添加编译选项
if(MSVC) # 如果编译器是 MSVC(Microsoft Visual C++)# 设置 C++ 编译选项:# /WX : 将所有警告视为错误(会让编译因警告失败)# /W4 : 设置警告级别为 4,显示大多数警告# /wd4819 : 屏蔽警告 C4819,避免文件编码问题导致的警告# /wd4201 : 屏蔽警告 C4201,避免由于结构体定义引起的警告# /wd4505 : 屏蔽警告 C4505,避免由于不使用的函数引起的警告# /Zi : 生成调试信息# /FC : 显示完整的文件名和行号set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /WX /W4 /wd4819 /wd4201 /wd4505 /Zi /FC")# 设置目标属性,手动关闭增量链接功能(incremental linking),以确保导出函数的符号set_target_properties(win32_game PROPERTIESLINK_FLAGS "-incremental:no" # 禁用增量链接)
endif()# 确保使用 C++20 标准(仅在 CMake 版本大于 3.12 时才有效)
if(CMAKE_VERSION VERSION_GREATER 3.12)set_property(TARGET win32_game PROPERTY CXX_STANDARD 20)set_property(TARGET game PROPERTY CXX_STANDARD 20)
endif()
现在就可以在调试模式下面跟新人更新dll
管道输出 stdout 和 stderr
命令 del *.pdb > NUL 2> NUL
在 Windows 命令行中执行时,具有以下含义:
1. del *.pdb
这是删除当前目录下所有 .pdb
文件的命令。
del
是删除命令。*.pdb
表示当前目录下所有以.pdb
结尾的文件(即所有的 PDB 文件)。
2. > NUL
这是将标准输出(stdout)重定向到 NUL
设备。
>
是重定向操作符,表示将命令的输出写入到指定的位置。NUL
是 Windows 中的特殊设备,类似于 Unix/Linux 系统中的/dev/null
,它表示“丢弃输出”。- 这意味着执行
del *.pdb
时,标准输出(通常是删除的文件名)将被丢弃,而不会显示在命令行窗口中。
- 这意味着执行
3. 2> NUL
这是将标准错误输出(stderr)重定向到 NUL
设备。
2>
是重定向标准错误输出(stderr)的操作符。2
指的是标准错误输出流(stderr)的文件描述符(0 是标准输入,1 是标准输出,2 是标准错误输出)。NUL
再次表示丢弃错误输出。也就是说,如果删除命令遇到错误(比如没有找到任何.pdb
文件),错误信息将不会显示在命令行窗口中。
综合起来:
del *.pdb > NUL 2> NUL
的意思是:
- 删除当前目录下的所有
.pdb
文件。 - 如果删除成功,删除的文件名不会显示在命令行中(因为标准输出被重定向到
NUL
)。 - 如果发生错误(例如没有
.pdb
文件),错误信息也不会显示在命令行中(因为标准错误输出被重定向到NUL
)。
这样使用通常是为了避免在命令执行时看到不必要的输出和错误信息,确保输出干净。
发现热重载仍然存在延迟
这段代码描述了一种通过检查文件的日期戳来减少延迟的优化方法,重点在于通过检查文件的修改时间来确定是否需要重新加载某个文件。这种方法相对简单且高效,可以在每一帧中检查文件的修改日期,从而避免延迟。
主要思路:
-
减少延迟:通过定期检查文件的日期戳来减少性能损失。这种方法通过周期性地检查文件的最后修改时间来确定是否需要重新加载文件,而不需要每次都加载文件,从而减少延迟。
-
文件日期戳:文件系统中每个文件都有一个日期戳,表示文件最后一次被访问、修改或创建的时间。通过获取这些信息,可以判断文件是否发生变化。检查文件的日期戳比打开文件进行读取要更高效,避免了额外的性能消耗。
-
优化实现:
- 文件句柄与日期戳:为了避免打开文件,可以使用文件句柄获取文件的时间信息,如创建时间、最后访问时间和最后修改时间。
- 文件检查函数:使用
FindFirstFile
等API函数可以获取文件的创建、访问和修改时间,通过这些数据判断文件是否需要重新加载。 - 缓存和临时处理:为了避免不必要的重复计算和性能开销,使用缓存技术将文件的日期戳保存并在需要时进行比较,避免每次都重复操作。
-
错误处理与容错:
- 如果文件不存在,程序应该返回一个无效的句柄并进行适当的错误处理,避免程序崩溃。
- 在日期戳检查过程中,如果文件不存在或无法访问,程序会根据需要返回默认值(如0),确保系统继续运行而不被中断。
-
调试与监控:
- 在开发和调试阶段,可能会使用一些调试信息来监控文件的最后修改时间等,帮助开发者识别潜在的问题。
- 这种优化方法并不依赖于非常精确的数据,因此即使日期戳并非完全精确,它仍然能有效减少延迟。
总结:
通过这种方法,开发者能够高效地判断文件是否需要重新加载,减少不必要的计算,并通过检查文件的日期戳来优化性能。这种方法简洁且高效,适用于那些需要频繁加载文件但又不能接受高延迟的系统。
FindFirstFileA
是一个 Windows API 函数,用于查找匹配指定文件名的第一个文件。它返回一个句柄,供后续调用其他函数(如 FindNextFileA
)继续查找。
函数原型:
HANDLE WINAPI FindFirstFileA(_In_ LPCSTR lpFileName,_Out_ LPWIN32_FIND_DATAA lpFindFileData
);
参数说明:
-
lpFileName
(LPCSTR
):- 这是一个指向以 null 终止的字符串的指针,表示要搜索的文件路径。该路径可以包含通配符字符(如
*
或?
)用于匹配多个文件。例如:"C:\\path\\to\\files\\*.txt"
用于查找该路径下的所有.txt
文件。"C:\\path\\to\\files\\*"
用于查找所有文件。
- 这是一个指向以 null 终止的字符串的指针,表示要搜索的文件路径。该路径可以包含通配符字符(如
-
lpFindFileData
(LPWIN32_FIND_DATAA
):- 这是一个指向
WIN32_FIND_DATAA
结构体的指针,FindFirstFileA
函数将文件信息存储到该结构体中。这个结构体包含了文件的各种属性,如文件名、文件类型、大小、最后修改时间等。
WIN32_FIND_DATAA
结构体定义如下:typedef struct _WIN32_FIND_DATAA {DWORD dwFileAttributes; // 文件的属性,如普通文件、目录、只读等FILETIME ftCreationTime; // 文件创建时间FILETIME ftLastAccessTime; // 文件最后访问时间FILETIME ftLastWriteTime; // 文件最后写入时间DWORD nFileSizeHigh; // 文件大小(高位)DWORD nFileSizeLow; // 文件大小(低位)DWORD dwReserved0; // 保留字段DWORD dwReserved1; // 保留字段CHAR cFileName[MAX_PATH]; // 文件名CHAR cAlternateFileName[14]; // 文件的备用名称 } WIN32_FIND_DATAA;
- 这是一个指向
返回值:
- 如果成功,
FindFirstFileA
返回一个有效的搜索句柄(HANDLE
)。该句柄用于后续的查找操作,如FindNextFileA
和FindClose
。 - 如果失败,返回
INVALID_HANDLE_VALUE
。你可以通过调用GetLastError()
来获取更多的错误信息。
常见用法:
FindFirstFileA
通常与 FindNextFileA
配合使用,以便遍历所有匹配的文件。完成搜索后,必须调用 FindClose
来关闭搜索句柄。
示例代码:
#include <windows.h>
#include <iostream>int main() {WIN32_FIND_DATAA findFileData;HANDLE hFind = FindFirstFileA("C:\\path\\to\\files\\*.txt", &findFileData);if (hFind == INVALID_HANDLE_VALUE) {std::cerr << "FindFirstFileA failed!" << std::endl;return 1;}do {// 输出匹配文件的文件名std::cout << "Found file: " << findFileData.cFileName << std::endl;} while (FindNextFileA(hFind, &findFileData) != 0); // 查找下一个文件FindClose(hFind); // 关闭搜索句柄return 0;
}
函数的工作流程:
- 调用
FindFirstFileA
时,它会查找第一个匹配的文件,并将文件的相关信息存储在lpFindFileData
中。 - 如果找到文件,则
FindFirstFileA
返回一个有效的句柄,你可以使用FindNextFileA
来查找后续文件。 - 使用
FindNextFileA
可以继续查找下一个文件,直到没有更多匹配的文件为止。 - 使用
FindClose
关闭句柄,释放资源。
常见错误:
INVALID_HANDLE_VALUE
:如果调用失败,返回这个值。你可以使用GetLastError
获取详细的错误信息。- 路径格式问题:确保传递给
FindFirstFileA
的路径格式正确,并且如果需要,使用双反斜杠(\\
)来表示文件路径。
总结:
FindFirstFileA
是一个非常有用的函数,尤其是用于列出文件或目录内容,支持通配符,并能够返回文件的详细信息。它通常与 FindNextFileA
和 FindClose
结合使用,用于实现文件查找操作。
尝试将工作目录设置为数据目录,发现 Win32GetLastWriteTime() 无法找到我们的 .dll 文件
目前面临的问题是,如何确保程序能够正确加载DLL文件,特别是在特定的构建目录和数据目录之间的路径管理上。之前的做法是在构建目录中加载这些文件,而目标是将它们放回数据目录中。这样做的原因是,所有艺术资产和其他必要的文件都应位于数据目录中。
在程序加载时,Windows系统会自动通过搜索路径来查找执行文件所在目录下的DLL文件,因此当执行文件和DLL文件位于相同目录时,加载库(load library)会成功。这表明文件能在该路径下找到并被正确加载。
然而,问题出现在程序的文件日期检查上。当文件已找到时,日期检查未能通过,可能是由于系统默认只在当前目录下查找文件,而没有扩展到其他目录。这个问题可以通过修改路径设置来解决,让程序能够在任何指定的目录中找到需要的DLL文件,而不仅仅是在执行文件的目录中。
解决方案是,调整文件路径,使得无论实际的路径设置如何,DLL文件都可以在与可执行文件相同的目录下被正确找到。这涉及到创建一个搜索路径,确保DLL文件始终能够被加载,哪怕路径发生了变化。
启用 WinMain() 使用 GetModuleFilenameA() 来定位我们的 .exe 文件
在当前的开发任务中,目标是通过Windows操作系统的函数来查找和确认当前可执行文件的路径。为此,提到了使用Windows API中的 GetModuleFileName
函数,该函数可以帮助我们获取模块(即可执行文件)的路径。
首先,提到的问题是如何准确地找到可执行文件所在的路径。这是关键,因为所有相关的文件(如DLL文件)都需要根据正确的路径来定位。最简单的方法是使用 GetModuleFileName
函数,并且通过传递一个值为零的参数,可以自动获取当前可执行文件的路径,而不需要显式传递模块句柄。这样,可以确认当前执行文件所在的目录,从而在该路径下寻找相关文件。
然而,GetModuleFileName
函数有一些潜在的问题。例如,如果传递的缓冲区大小不足以容纳路径字符串,它可能会截断路径。这意味着,如果缓冲区过小,返回的路径可能会丢失部分信息,导致后续操作失败。因此,最好的做法是确保缓冲区的大小足够大,以容纳完整的路径。
另外,也提到 MAX_PATH
常量,这个常量在Windows中定义了路径的最大字符数,通常为260个字符。但这一限制现在已经不再适用,因为Windows支持更长的路径。因此,使用 MAX_PATH
时应谨慎,避免可能带来的路径截断问题。
综上所述,开发者在处理文件路径时,应该避免使用过时的 MAX_PATH
常量,并确保缓冲区大小足够,避免路径截断带来的潜在问题。同时,使用 GetModuleFileName
是获取可执行文件路径的一种有效方式,但要注意对缓冲区大小的管理。
GetModuleHandle
是一个 Windows API 函数,用于获取一个已经加载的模块(如动态链接库 DLL 或可执行文件)在内存中的句柄。这个句柄可以用来引用该模块,在之后的操作中(如获取模块路径、获取导出的函数等)使用。
发现我们得到了完整路径
相关文章:
游戏引擎学习第22天
移除 DllMain() 并成功重新编译 以下是对内容的详细复述与总结: 问题和解决方案: 在编译过程中遇到了一些问题,特别是如何告知编译器不要退出程序,而是继续处理。问题的根源在于编译过程中传递给链接器的参数设置不正确。原本尝试…...
GitLab|GitLab报错:PG::ConnectionBad: could not connect to server...
错误信息: PG::ConnectionBad: could not connect to server: No such file or directory Is the server running locally and accepting connections on Unix domain socket "/var/opt/gitlab/postgresql/.s.PGSQL.5432"? /opt/gitlab/embedded/service…...
Ray 和 PyTorch
Ray 和 PyTorch 的介绍 Ray 是什么? Ray 是一个用于 分布式计算和机器学习任务 的开源框架,提供了一个高效的、灵活的并行计算平台。它的核心功能是支持分布式计算,帮助开发者以简单的方式扩展 Python 应用程序。 Ray 适用于以下场景&…...
Qt之详解QLockFile 文件锁
文章目录 QLockFile 详解前言什么是 QLockFile?QLockFile 的构造函数和常用成员函数构造函数1. 指定锁文件路径的构造函数 常用成员函数1. lock2. unlock3. isLocked4. setStaleLockTime5. getLockInfo6. removeStaleLock 完整示例代码总结 QLockFile 详解 前言 在…...
从0开始学PHP面向对象内容之常用设计模式(组合,外观,代理)
二、结构型设计模式 4、组合模式(Composite) 组合模式(Composite Pattern)是一种结构型设计模式,它将对象组合成树形结构以表示”部分–整体“的层次结构。通过组合模式,客户端可以以一致的方式处理单个对…...
机械设计学习资料
免费送大家学习资源,已整理好,仅供学习 下载网址: https://www.zzhlszk.com/?qZ02-%E6%9C%BA%E6%A2%B0%E8%AE%BE%E8%AE%A1%E8%A7%84%E8%8C%83SOP.zip...
论文笔记3-XCube: Large-Scale 3D Generative Modeling using Sparse Voxel Hierarchies
目录 Abtract 相关工作 核心算法: 整体流程概述 具体流程解析 1. 输入(Input) 2. 稀疏结构 VAE(Sparse Structure VAE) 3.分层体素潜在扩散(Hierarchical Voxel Latent Diffusion)…...
【组件】前端ElementUi 下拉Tree树形组件 带模糊搜索自动展开高亮功能
【组件】前端ElementUi 下拉Tree树形组件 带模糊搜索自动展开高亮功能 https://live.csdn.net/v/435737 <template><div><el-popoverstyle"overflow-y: auto; "placement"bottom"trigger"click"><el-inputstyle"margi…...
诠视科技受邀出席“中国虚拟现实产学研大会”
2024年11月2-3日,由中国虚拟现实技术与产业创新平台举办的第十届“中国虚拟现实产学研大会” 在北京顺利召开,大会围绕“虚拟现实技术与产业创新融合”这一主题进行深入探讨。诠视科技作为虚拟现实产业的创新领军企业,CEO林瓊受邀参加本次活动…...
【达梦数据库】授权查询
目录 授权查询EXPIRED_DATECLUSTER_TYPE 更换原则更换方法 授权查询 select * from v$license;EXPIRED_DATE 过期日期,如果是正式版会显示NULL CLUSTER_TYPE 授权使用的集群类型CLUSTER_TYPE,格式为字符串“XXXX”, 每一位上 0 表示禁止…...
探索 ZED 双目 3D 相机发展:ZED 2i 的创新功能扩展之路
在科技迅速发展的当下,3D 视觉技术在众多领域的发展中有着重要作用。Stereolabs 公司研发的 ZED 相机受到广泛关注。Stereolabs 于 2010 年在美国旧金山成立,一直专注于立体视觉和 3D 深度相机技术的研究。2015 年推出的 ZED 相机为无人机、机器人等设备…...
基于卷积神经网络的白菜病虫害识别与防治系统,resnet50,mobilenet模型【pytorch框架+python源码】
更多目标检测和图像分类识别项目可看我主页其他文章 功能演示: 白菜病虫害识别与防治系统,卷积神经网络,resnet50,mobilenet【pytorch框架,python源码】_哔哩哔哩_bilibili (一)简介 基于卷…...
计算机网络 | 7.网络安全
1.网络安全问题概述 (1)计算机网络面临的安全性威胁 <1>计算机网络面临的完全性威胁 计算机网络面临的两大类安全威胁:被动攻击和主动攻击 被动攻击 截获:从网络上窃听他人的通信内容。主动攻击 篡改:故意篡改…...
Opencv+ROS自编相机驱动
目录 一、工具 二、原理 代码 标定 三、总结 参考: 一、工具 opencv2ros ubuntu18.04 usb摄像头 二、原理 这里模仿usb_cam功能包对Opencv_ros进行修饰,加上相机参数和相机状态,难点在于相机参数的读取。 对于相机参数话题 camera…...
js---函数参数是值传递还是引用传递
理解1:都是值(基本/地址值)传递 理解2:可能是值传递,也可能是引用传递(地址值) 在JavaScript中,函数参数的传递方式取决于参数的类型: 值传递(Pass by Val…...
如何解决DDoS导致服务器宕机?
分布式拒绝服务攻击(DDoS攻击)是一种常见的网络安全威胁,通过大量恶意流量使目标服务器无法提供正常服务。DDoS攻击可能导致服务器宕机,严重影响业务的正常运行。本文将详细介绍如何检测和防御DDoS攻击,防止服务器宕机…...
临床检验项目指标学习笔记
声明: 家有病人,记录此学习笔记仅为了更好照顾家人。本文不负责内容的准确性和版权。如果存在侵权、或不希望被转载的媒体或个人可与我们联系,我将立即进行删除处理。 血脂四项 [Q&A] 血脂四项 指导意义 测定血清中血脂含量,…...
代码管理之Gitlab
文章目录 Git基础概述场景本地修改未提交,拉取远程代码修改提交本地,远程已有新提交 GitIDEA引入Git拉取仓库代码最后位置 Git基础 概述 workspace 工作区:本地电脑上看到的目录; repository 本地仓库:就是工作区中隐…...
秒杀系统三层架构设计:缓存、消息队列与数据库
秒杀是一种极端高并发场景,短时间内数百万用户涌入,抢购有限库存的商品。为了保证系统稳定性和数据一致性,同时提升用户体验,我们可以设计一个三层架构:缓存层、消息队列层、数据库层。本文将详细设计这一架构并探讨其…...
tauri2.0版本开发苹果ios和安卓android应用,环境搭建和最后编译为apk
官网链接:What is Tauri? | Tauri 初始准备 rust版本一定要1.77.2以上的版本,查看版本和升级版本: 升级命名: rustup update 不然会报错: error: package tauri-plugin-shell v2.0.2 cannot be built because it r…...
SCI论文部分题目
SC20243213 通过氢和氨集成增强Power-to-X灵活性和可持续成本降低:绿色实验室Skive案例研究 SC20243211 分析同时发电的综合系统中的能量和能量效率、环境影响和经济可行性,淡水、热水和天然气凝液 SC20243208 双燃料生物质-天然气系统中的氢、…...
使用PyTorch在AMD GPU上进行INT8量化实现精简化的LLM推理
Leaner LLM Inference with INT8 Quantization on AMD GPUs using PyTorch — ROCm Blogs 随着大型语言模型(LLMs)规模达到数千亿参数,我们在这些庞大模型中表示数据的方式极大地影响了训练所需的资源(例如,用于推理的…...
Solon 拉取 maven 包很慢或拉不了,怎么办?
注意:如果在 IDEA 设置里指定了 settings.xml,下面两个方案可能会失效。(或者直接拿 "腾讯" 的镜像仓库地址,按自己的习惯配置) 1、可以在项目的 pom.xml 添加 "腾讯" 的镜像仓库 "阿里&qu…...
spring的事务隔离?
在Spring中,事务的隔离级别是指在多事务并发执行时,事务之间的隔离程度,隔离级别定义了一个事务可以看到另一个事务的哪些数据,Spring事务管理器允许通过Transactional注解或者xml配置来指定事务的隔离级别。 事务的隔离级别有以…...
13 —— 开发环境调错-source map
问题:代码被压缩后,无法正确定位源代码的位置(行数和列数) source map:准确追踪error和warning在原始代码的位置 —— webpack.config.js配置devtool选项 module.exports { devtool: inline-source-map }; inline-s…...
【大数据分析深度学习】在Hadoop上实现分布式深度学习
【作者主页】Francek Chen 【专栏介绍】 ⌈ ⌈ ⌈智能大数据分析 ⌋ ⌋ ⌋ 智能大数据分析是指利用先进的技术和算法对大规模数据进行深入分析和挖掘,以提取有价值的信息和洞察。它结合了大数据技术、人工智能(AI)、机器学习(ML&a…...
【Linux探索学习】第十六弹——进程地址空间:深入解析操作系统中的进程地址空间
Linux学习笔记: https://blog.csdn.net/2301_80220607/category_12805278.html?spm1001.2014.3001.5482 前言: 进程地址空间是操作系统进程管理的重要概念之一,它定义了进程在执行时所能访问的内存布局。理解进程地址空间不仅有助于掌握操…...
【数据结构与算法】相交链表、环形链表(判断是否有环)、环形链表(返回入环节点)
主页:HABUO🍁主页:HABUO 🍁如果再也不能见到你,祝你早安,午安,晚安🍁 1.相交链表 题目:给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表…...
hubuctf-2024校赛-复现wp
web easyweb1 <?php error_reporting(0); highlight_file(__FILE__);$flag getenv("GZCTF_FLAG");if(isset($_GET[num])){$num $_GET[num];if(preg_match("/[0-9]/", $num)){die("You are failed.");}if(intval($num)){echo $flag;} } 利…...
.NET Core发布网站报错 HTTP Error 500.31
报错如图: 解决办法: 打开任务管理器》》服务》》找到这仨服务,右键启动即可,如果已经启动了就重启:...
RTSP摄像头、播放器为什么需要支持H.265?
H.264还是H.265? 好多开发者在做选RTSP播放器的时候,经常问我们的问题是,用H.264好还是H.265好?本文我们就H.264 和 H.265的主要区别和适用场景,做个大概的交流。 一、压缩效率 H.265 更高的压缩比 H.265 在相同视频…...
brynet源码阅读——解决文件描述符耗尽问题mIdle
1、背景 在高并发服务器程序中,文件描述符资源是有限的。当一个程序同时处理多个网络连接时,每个连接都会占用一个文件描述符。如果系统没有足够的文件描述符可用,调用 accept()(用于接收新的连接)或其他文件操作时可…...
学习Zookeeper
Zookeeper有手就行 1. 初识ZooKeeper1.1 安装ZooKeeper1.2 ZooKeeper命令操作1.2.1 Zookeeper数据模型1.2.2 Zookeeper 服务端常用命令1.2.3 Zookeeper客户端常用命令 2. ZooKeeperJavaAPl操作2.1 Curator介绍2.2 CuratorAPI常用操作2.2.0 引入Curator支持2.2.1 建立连接2.2.2 …...
css效果
css炫彩流光圆环效果 <!DOCTYPE html> <html><head><meta charset"utf-8" /><title></title><style>*{margin: 0;padding: 0;}body{width: 100%;height: 100vh;}.container{position: relative;width: 100%;height: 100vh…...
【Python爬虫五十个小案例】爬取豆瓣电影Top250
博客主页:小馒头学python 本文专栏: Python爬虫五十个小案例 专栏简介:分享五十个Python爬虫小案例 🪲前言 在这篇博客中,我们将学习如何使用Python爬取豆瓣电影Top250的数据。我们将使用requests库来发送HTTP请求,…...
「Mac玩转仓颉内测版25」基础篇5 - 布尔类型详解
本篇将介绍 Cangjie 中的布尔类型,包括布尔值的定义、运算操作符、逻辑运算、布尔类型的常见应用场景及其在条件判断中的应用,帮助开发者理解和使用布尔类型。 关键词 布尔类型定义布尔运算逻辑运算符条件判断常见应用场景 一、布尔类型概述 布尔类型&…...
electron主进程和渲染进程之间的通信
主进程 (main.js) const { app, BrowserWindow, ipcMain } require("electron"); const path require("node:path"); // 导入fs模块 const fs require("fs");const createWindow () > {const win new BrowserWindow({width: 800,height…...
在 Spring Boot 中实现多种方式登录(用户名、手机号、邮箱等)的不正经指南
欢迎来到一场技术与幽默交织的冒险!今天,我们将跳进 Spring Boot 的世界,探索如何通过 用户名、手机号、邮箱 等多种方式实现登录。想象一下,用户在登录时可以随心所欲地选择——就像你今天早上纠结到底是要喝美式咖啡还是拿铁&am…...
JVM标量替换
JVM标量替换 简单来说 JVM 中的标量替换是一种编译优化技术,将未逃逸对象拆解成不能再分,标量在栈帧或寄存器中分配使用。将对象拆解后直接使用标量,不但避免了完整对象的创建和后续回收流程,而且能更快地获取和操作相应的数据&…...
Python深度学习框架:PyTorch、Keras、Scikit-learn、TensorFlow如何使用?学会轻松玩转AI!
前言 我们先简单了解一下PyTorch、Keras、Scikit-learn和TensorFlow都是什么。 想象一下你要盖一座大房子。你需要砖头、水泥、工具等等,对吧?机器学习也是一样,需要一些工具来帮忙。PyTorch、Keras、Scikit-learn和TensorFlow就是四种不同的…...
C语言蓝桥杯组题目
系列文章目录 文章目录 系列文章目录前言题目第一题.1, 2, 3, 4 能组成多少个互不相同且无重复数字的三位数?都是多少?思路 第二题: 一个整数,它加上100后是一个完全平方数,再加上168又是一个完全平方数,请问该数是多少…...
用Matlab和SIMULINK实现DPCM仿真和双边带调幅系统仿真
1、使用SIMULINK或Matlab实现DPCM仿真 1.1 DPCM原理 差分脉冲编码调制,简称DPCM,主要用于将模拟信号转换为数字信号,同时减少数据的冗余度以实现数据压缩。在DPCM中,信号的每个抽样值不是独立编码的,而是通过预测前一…...
真实网络安全面试场景题
1.公司内部搭建了2台DNS服务器做主辅同步,公司的业务官网地址为 www.chinaddic.com。小明作为网络管理员把域名添加至DNS服务器进行测试。 问题1:使用自己电脑可以正常访问刚添加的域名,但处于同样网络环境同事电脑却访问不了。 出现此问题原因…...
速盾:ddos防御手段哪种比较好?高防cdn怎么样?
DDoS(分布式拒绝服务)攻击是一种威胁网络安全的常见攻击手段。为了保护网站和服务器免受DDoS攻击的影响,许多安全专家和公司开发了各种防御手段。在这篇文章中,我们将重点讨论一种常见的DDoS防御手段——高防CDN(内容分…...
【ArcGISPro】Sentinel-2数据处理
错误 默认拉进去只组织了4个波段,但是实际有12个波段 解决方案 数据下载 Sentinel-2 数据下载-CSDN博客 数据处理 数据查看 创建镶嵌数据集 在数据管理工具箱中找到创建镶嵌数据集...
【适配】屏幕拖拽-滑动手感在不同分辨率下的机型适配
接到一个需求是类似下图的3D多房间视角,需要拖拽屏幕 问题 在做这种屏幕拖拽的时候发现,需要拖拽起来有跟手的感觉,会存在不同分辨率机型的适配问题。 即:美术调整好了机型1的手感,能做到手指按下顶层地板上下挪动&…...
谷粒商城-消息队列Rabbitmq
RabbitMq参考文档 在谷粒商城项目中使用消息队列主要有以下几个重要原因: 异步处理提高性能 场景示例:在订单系统中,当用户提交订单后,系统需要完成多个操作,如更新库存、生成订单记录、发送订单通知等。如果这些操作…...
python-爬虫入门指南
前言:由于个人负责的运维组,其中有个同事每回在某个项目发版更新后,需手动在k8s容器平台web界面上复制出几百个微服务的名称以及镜像版本等信息,用来更新微服务清单,个人决定抽时间写个爬虫脚本自动完成手动执行的任务…...
力扣—53. 最大子数组和
53. 最大子数组和 给你一个整数数组 nums ,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。 子数组 是数组中的一个连续部分。 示例 1: 输入:nums [-2,1,-3,4,-1,2,1,-5,4…...
STM32H7开发笔记(2)——H7外设之多路定时器中断
STM32H7开发笔记(2)——H7外设之多路定时器中断 文章目录 STM32H7开发笔记(2)——H7外设之多路定时器中断0.引言1.CubeMX配置2.软件编写 0.引言 本文PC端采用Win11STM32CubeMX4.1.0.0Keil5.24.2的配置,硬件使用STM32H…...