我正在写一个软渲染器,其中用到了tbb库来加速光栅化的过程,具体代码如下:
if (multiThread)
{
tbb::parallel_for(tbb::blocked_range<size_t>(0, triangleList.size()),
[&](tbb::blocked_range<size_t> r)
{
for (size_t i = r.begin(); i < r.end(); i++)
ProcessTriangle(triangleList[i]);
});
}
在最开始的时候,程序能够正常运行。但当我逐渐完善代码,加入一些其他功能后,渲染的时候就开始报错,报错信息如下:
onecore\com\combase\objact\dllcache.cxx(2057)\combase.dll!00007FFD8C295887: (caller: 00007FFD8C178A79) ReturnHr(1) tid(22bc) 8007045A 动态链接库(DLL)初始化例程失败。
onecore\com\combase\objact\dllcache.cxx(1967)\combase.dll!00007FFD8C2957C9: (caller: 00007FFD8C177D31) ReturnHr(2) tid(22bc) 8007045A 动态链接库(DLL)初始化例程失败。
0x00007FFD8B4E40AC (KernelBase.dll)处(位于 TinyRenderTest2.exe 中)引发的异常: 0x000006BA: RPC 服务器不可用。。
onecore\vm\dv\storage\plan9\rdr\dll\util.cpp(99)\p9np.dll!00007FFD72C7A09E: (caller: 00007FFD72C7EC3A) LogHr(1) tid(36f4) C0000034 Msg:[瑎牃慥整楆敬☨敤楶散奓䍎剈乏婉ⱅ☠瑡牴扩瑵獥椦卯慴畴ⱳ渠汵灬牴䥆䕌䅟呔䥒啂䕔也剏䅍ⱌ⠠䥆䕌卟䅈䕒剟䅅⁄⁼䥆䕌卟䅈䕒坟䥒䕔簠䘠䱉彅䡓剁彅䕄䕌䕔Ⱙ䘠䱉彅偏久䥆䕌卟乙䡃佒低单䥟彏低䅎䕌呒畮汬瑰Ⱳ〠)]
线程 0x36f4 已退出,返回值为 0 (0x0)。
onecore\com\combase\dcomrem\security.cxx(3022)\combase.dll!00007FFD8C1BA150: (caller: 00007FFD63DB2BF6) ReturnHr(3) tid(241c) 80010117 调用结束后,无法访问调用上下文。
onecore\Base\AppModel\Runtime\Src\PackagePath.hpp(78)\kernelbase.dll!00007FFD8B4B7B43: (caller: 00007FFD8B4B729E) ReturnHr(1) tid(22bc) 80070490 找不到元素。
onecore\Base\AppModel\Runtime\Src\PackagePath.hpp(78)\kernelbase.dll!00007FFD8B4B7B43: (caller: 00007FFD8B4B729E) ReturnHr(2) tid(195c) 80070490 找不到元素。
onecore\Base\AppModel\Runtime\Src\PackagePath.hpp(78)\kernelbase.dll!00007FFD8B4B7B43: (caller: 00007FFD8B4B729E) ReturnHr(3) tid(195c) 80070490 找不到元素。
onecore\Base\AppModel\Runtime\Src\PackagePath.hpp(78)\kernelbase.dll!00007FFD8B4B7B43: (caller: 00007FFD8B4B729E) ReturnHr(4) tid(195c) 80070490 找不到元素。
“TinyRenderTest2.exe”(Win32): 已加载“C:\Windows\System32\Windows.StateRepositoryClient.dll”。
onecore\Base\AppModel\Runtime\Src\PackagePath.hpp(78)\kernelbase.dll!00007FFD8B4B7B43: (caller: 00007FFD8B4B729E) ReturnHr(5) tid(195c) 80070490 找不到元素。
onecoreuap\internal\shell\inc\private\SharedStorageSources\fileicon.cpp(1506)\SHELL32.dll!00007FFD8D76F329: (caller: 00007FFD8D5F0002) ReturnHr(1) tid(195c) 8007000E 内存资源不足,无法完成此操作。
CallContext:[\ExtractIconW]
onecoreuap\internal\shell\inc\private\SharedStorageSources\fileicon.cpp(1517)\SHELL32.dll!00007FFD8D76F34B: (caller: 00007FFD8D5F0002) ReturnHr(2) tid(195c) 8007000E 内存资源不足,无法完成此操作。
CallContext:[\ExtractIconW]
onecore\Base\AppModel\Runtime\Src\PackagePath.hpp(78)\kernelbase.dll!00007FFD8B4B7B43: (caller: 00007FFD8B4B729E) ReturnHr(6) tid(2668) 80070490 找不到元素。
onecore\Base\AppModel\Runtime\Src\PackagePath.hpp(78)\kernelbase.dll!00007FFD8B4B7B43: (caller: 00007FFD8B4B729E) ReturnHr(7) tid(2668) 80070490 找不到元素。
onecore\Base\AppModel\Runtime\Src\PackagePath.hpp(78)\kernelbase.dll!00007FFD8B4B7B43: (caller: 00007FFD8B4B729E) ReturnHr(8) tid(2668) 80070490 找不到元素。
onecoreuap\internal\shell\inc\private\SharedStorageSources\fileicon.cpp(1506)\SHELL32.dll!00007FFD8D76F329: (caller: 00007FFD8D5F0002) ReturnHr(3) tid(2668) 8007000E 内存资源不足,无法完成此操作。
CallContext:[\ExtractIconW]
onecoreuap\internal\shell\inc\private\SharedStorageSources\fileicon.cpp(1517)\SHELL32.dll!00007FFD8D76F34B: (caller: 00007FFD8D5F0002) ReturnHr(4) tid(2668) 8007000E 内存资源不足,无法完成此操作。
CallContext:[\ExtractIconW]
使用和关闭多线程的运行结果如下:
我已经尝试过重新构建项目,使用不同版本的tbb库,在vs中启用大地址等方法,但都不起作用,希望得到高人指点。
环境:
Win11,i7-9750H CPU @ 2.60GHz 2.59GHz,8G内存,64位操作系统
Visual Studio 2019 版本16.11.21
Qt6.2.4,MSVC 2019 64bit,Qt Creator 9.0.1
参考GPT和自己的思路,这个错误似乎与tbb库无关,而是与系统调用相关,可能是因为您的代码中引入了一些不兼容的库或调用,导致程序异常。建议您排除一些常见问题:
1 检查是否有使用过期或无效的库文件,例如使用32位库文件而编译为64位程序。
2 检查代码中是否有内存泄漏或越界访问等问题,这可能导致程序在执行时崩溃或出现异常。
3 检查您的操作系统和编译器是否支持tbb库,并确保您使用的版本是最新的。
4 尝试使用调试器查看错误发生的位置和原因,以便更好地定位和解决问题。
希望这些提示能够帮助您解决问题。
该回答引用ChatGPT
从报错信息中看,这个问题可能与内存资源不足有关。可能是因为渲染过程中需要大量的内存,而同时使用了多线程导致内存占用过高,从而出现内存不足的情况。
您可以尝试减少使用的线程数,或者在每个线程中减少内存占用量。可以使用调试工具来检查内存占用情况,定位出具体的问题所在。如果需要,还可以使用内存泄漏检查工具来帮助您找到内存泄漏的问题。
此外,您还可以尝试在每个线程中分配固定大小的内存池,这样可以减少内存分配和释放的次数,从而降低内存占用量。另外,您还可以使用一些内存管理库来帮助您更好地管理内存资源,如Boost.Pool等。
TBB库是一个针对多核处理器优化的并行计算库,一般用于加速多核CPU上的并行计算。如果您在使用TBB库渲染模型时出现异常,可能是因为以下几个原因:
TBB库的版本不兼容。不同版本的TBB库在接口和实现上可能存在不同,如果您使用的TBB版本与您的代码不兼容,则可能会出现异常。
TBB库的使用不正确。TBB库需要正确使用才能有效提高并行计算的效率。如果您的代码中存在TBB库使用不当的问题,可能会导致程序异常。
模型数据异常。如果您的模型数据存在异常或损坏,可能会导致渲染时出现异常。
解决这些问题的方法有以下几种:
检查TBB库的版本是否正确,并确定您的代码与该版本的TBB库兼容。
检查您的TBB库使用是否正确,可以参考TBB库的官方文档或者相关教程进行学习和调试。
检查您的模型数据是否正常,可以使用其他工具或者库进行检测和修复。例如,使用Assimp库进行模型数据的导入和检测,或者使用其他渲染库进行模型渲染。
同时,建议您在出现异常时,查看异常信息并进行详细分析,以便更好地定位问题。可以使用调试工具或者日志记录等方式进行异常信息的查看和分析。