• DIrect12光追问题


    关注 码龄 粉丝数 原力等级 -- 被采纳 被点赞 采纳率 JmCk 2024-06-15 16:06 采纳率: 25% 浏览 4 首页/ 编程语言 / DIrect12光追问题 c++图形渲染 执行 commandList4->DispatchRays(&dispatchDesc);后调用 swapChain1->Present(1, 0);出现以下错误: 0x00007FFAC434BA99 处(位于1.exe 中)引发的异常: Microsoft C++ 异常: std::bad_alloc,位于内存位置 0x000000684ECFBAF8 处。 onecore\windows\feedback\core\werdll\lib\reportstore.cpp(618)\wer.dll!00007FFAC1C6B51F: (caller: 00007FFAC1CBB65A) LogHr(1) tid(30fc) 80004001 尚未实现 Msg:[CReportStore::Prune: MaxReportCount=500 MaxSizeInMb=0] [CReportStore::Prune] onecore\windows\feedback\core\werdll\lib\reportstore.cpp(700)\wer.dll!00007FFAC1C6B694: (caller: 00007FFAC1CBB65A) LogHr(2) tid(30fc) 80004001 尚未实现 Msg:[Deleting report. Path: \\?\C:\ProgramData\Microsoft\Windows\WER\ReportArchive\NonCritical_PerfWatsonTcdb_688f135dd185f2a8133a474a2518efc6ce6cc4a_00000000_5cee84ff-8a5b-42a8-9cac-ecbe186d3ed7] [CReportStore::Prune] onecore\windows\feedback\core\werdll\lib\reportstore.cpp(1194)\wer.dll!00007FFAC1C6345B: (caller: 00007FFAC1C784E8) LogHr(3) tid(30fc) 80004001 尚未实现 Msg:[Report key is: '\\?\C:\ProgramData\Microsoft\Windows\WER\ReportArchive\NonCritical_PerfWatsonTcdb_688f135dd185f2a8133a474a2518efc6ce6cc4a_00000000_5cee84ff-8a5b-42a8-9cac-ecbe186d3ed7', subpath is 'NonCritical_PerfWatsonTcdb_688f135dd185f2a8133a474a2518efc6ce6cc4a_00000000_5cee84ff-8a5b-42a8-9cac-ecbe186d3ed7'] [CReportStore::StoreKeyToStorePathSafe] onecore\windows\feedback\core\werdll\lib\reportstore.cpp(1152)\wer.dll!00007FFAC1C787F7: (caller: 00007FFAC1C6B6C6) ReturnHr(1) tid(30fc) 80070005 拒绝访问。 [CReportStore::DeleteReportFromStore] onecore\windows\feedback\core\werdll\lib\reportstore.cpp(757)\wer.dll!00007FFAC1C6B7B6: (caller: 00007FFAC1CBB65A) LogHr(4) tid(30fc) 80070005 拒绝访问。 [CReportStore::Prune] onecore\windows\feedback\core\werdll\lib\reportstore.cpp(700)\wer.dll!00007FFAC1C6B694: (caller: 00007FFAC1CBB65A) LogHr(5) tid(30fc) 80004001 尚未实现 Msg:[Deleting report. Path: \\?\C:\ProgramData\Microsoft\Windows\WER\ReportArchive\NonCritical_PerfWatsonTcdb_688f135dd185f2a8133a474a2518efc6ce6cc4a_00000000_de511427-2916-4bfa-ae30-c7990d398564] [CReportStore::Prune] onecore\windows\feedback\core\werdll\lib\reportstore.cpp(1194)\wer.dll!00007FFAC1C6345B: (caller: 00007FFAC1C784E8) LogHr(6) tid(30fc) 80004001 尚未实现 Msg:[Report key is: '\\?\C:\ProgramData\Microsoft\Windows\WER\ReportArchive\NonCritical_PerfWatsonTcdb_688f135dd185f2a8133a474a2518efc6ce6cc4a_00000000_de511427-2916-4bfa-ae30-c7990d398564', subpath is 'NonCritical_PerfWatsonTcdb_688f135dd185f2a8133a474a2518efc6ce6cc4a_00000000_de511427-2916-4bfa-ae30-c7990d398564'] [CReportStore::StoreKeyToStorePathSafe] onecore\windows\feedback\core\werdll\lib\reportstore.cpp(1152)\wer.dll!00007FFAC1C787F7: (caller: 00007FFAC1C6B6C6) ReturnHr(2) tid(30fc) 80070005 拒绝访问。 [CReportStore::DeleteReportFromStore] onecore\windows\feedback\core\werdll\lib\reportstore.cpp(757)\wer.dll!00007FFAC1C6B7B6: (caller: 00007FFAC1CBB65A) LogHr(7) tid(30fc) 80070005 拒绝访问。 [CReportStore::Prune] onecore\windows\feedback\core\werdll\lib\reportstore.cpp(700)\wer.dll!00007FFAC1C6B694: (caller: 00007FFAC1CBB65A) LogHr(8) tid(30fc) 80004001 尚未实现 Msg:[Deleting report. Path: \\?\C:\ProgramData\Microsoft\Windows\WER\ReportArchive\Critical_10.0.19041.3025__2013ccf7dd2c6a38017706ea8bcb9e9b5a68d_00000000_193833f9-bc4a-45e7-bf59-56fbeb4117d4] [CReportStore::Prune] onecore\windows\feedback\core\werdll\lib\reportstore.cpp(1194)\wer.dll!00007FFAC1C6345B: (caller: 00007FFAC1C784E8) LogHr(9) tid(30fc) 80004001 尚未实现 Msg:[Report key is: '\\?\C:\ProgramData\Microsoft\Windows\WER\ReportArchive\Critical_10.0.19041.3025__2013ccf7dd2c6a38017706ea8bcb9e9b5a68d_00000000_193833f9-bc4a-45e7-bf59-56fbeb4117d4', subpath is 'Critical_10.0.19041.3025__2013ccf7dd2c6a38017706ea8bcb9e9b5a68d_00000000_193833f9-bc4a-45e7-bf59-56fbeb4117d4'] [CReportStore::StoreKeyToStorePathSafe] onecore\windows\feedback\core\werdll\lib\reportstore.cpp(1152)\wer.dll!00007FFAC1C787F7: (caller: 00007FFAC1C6B6C6) ReturnHr(3) tid(30fc) 80070005 拒绝访问。 [CReportStore::DeleteReportFromStore] onecore\windows\feedback\core\werdll\lib\reportstore.cpp(757)\wer.dll!00007FFAC1C6B7B6: (caller: 00007FFAC1CBB65A) LogHr(10) tid(30fc) 80070005 拒绝访问。 [CReportStore::Prune] …… 展开全部 收起 写回答 好问题 0 提建议 追加酬金 关注问题 微信扫一扫 点击复制链接 分享 邀请回答 编辑 收藏 删除 结题 收藏 举报 追加酬金 (90%的用户在追加酬金后获得了解决方案) 当前问题酬金 ¥ 0 (可追加 ¥500) ¥ 15¥ 20¥ 50¥ 100¥ 200 支付方式 扫码支付 二维码出错 点击刷新 支付金额 15 元 提供问题酬金的用户不参与问题酬金结算和分配 支付即为同意 《付费问题酬金结算规则》 结题 再想想 删除 再等等

    3条回答 默认 最新

    • 专家-赤兔[在线] 全栈领域优质创作者 2024-06-15 16:06
      关注

      引自免费微信小程序:皆我百晓生

      遇到std::bad_alloc异常通常意味着在尝试分配内存时失败了,这可能是由于系统内存不足、内存碎片化严重或是分配请求过大导致的。在DirectX 12的光线追踪场景下,这个问题可能与资源(如Shader Resource Views, Unordered Access Views等)的创建和管理有关,尤其是当大量资源同时存在时。

      解决方案

      1. 检查资源管理

      确保你正确地管理了所有资源的生命周期。释放不再使用的资源可以减少内存压力。例如,在每次渲染结束后,检查并释放任何不再需要的缓冲区或纹理。

      2. 优化资源使用

      • 重用资源:尽可能重用现有的资源,而不是在每次渲染帧时都创建新的资源。
      • 减少纹理和缓冲区大小:检查是否可以降低纹理分辨率或减少不必要的顶点数据。
      • 使用适当的格式:选择更节省空间的纹理格式,比如压缩格式。

      3. 增加交换链缓冲区数量

      尝试增加swapChain1->Present方法中的缓冲区数量,从默认的1增加到更高的值(例如2或3),这可以提供更多的回旋余地,尤其是在多线程渲染或高负载情况下。

      4. 内存分析

      使用内存分析工具(如Visual Studio的Performance Profiler或第三方工具如Valgrind)来检查你的应用程序是否存在内存泄漏或过度消耗的问题。

      5. 调整光线追踪设置

      • 减少光线发射数量:如果光线追踪算法过于复杂,考虑减少每像素发射的光线数量。
      • 优化命中程序:确保命中程序尽可能高效,避免不必要的计算或资源读取。

      6. 硬件限制

      确认你的GPU是否有足够的VRAM来处理光线追踪任务,以及CPU是否有足够的RAM来支持操作系统和其他运行的应用程序。

      7. 代码示例

      对于资源管理的部分,你可以考虑使用以下伪代码来指导你的资源释放逻辑:

      // 在渲染循环结束时
      for (auto& resource : resourcesToRelease) {
          resource->Release();
      }
      resourcesToRelease.clear();
      
      // 在需要的地方添加资源到释放列表
      void addResourceToRelease(ID3D12Resource* resource) {
          resourcesToRelease.push_back(resource);
      }
      

      这个列表应该在每个渲染帧开始时清空,并且在适当的位置添加资源到释放队列中。

      8. 日志和调试信息

      关于提供的日志,它们主要涉及到Windows错误报告(WER)服务试图清理旧的错误报告,但遇到了权限问题。这通常与应用程序崩溃无关,而是操作系统内部的清理过程。然而,如果你的程序频繁崩溃,这可能会导致WER服务的文件管理出现问题。确保你的程序尽可能稳定,减少崩溃的发生。

      如果上述步骤都不能解决问题,你可能需要进一步细化你的问题描述,包括但不限于你的系统配置、使用的DirectX版本、以及任何特定的编译器或运行时设置。这样能帮助更精确地定位问题所在。

      展开全部

      评论 编辑记录
    • 阿里嘎多学长 2024-06-15 16:06
      关注

      以下内容由CHATGPT及阿里嘎多学长共同生成、有用望采纳:


      遇到 std::bad_alloc 异常通常意味着程序在尝试分配内存时失败了。在 DirectX 12 光追渲染中,这可能是由于多种原因造成的,比如显存不足、内存泄漏、或者驱动程序问题等。以下是一些可能的解决方案和建议:

      1. 检查显存使用情况:确保你的显卡有足够的显存来处理当前的渲染任务。如果显存不足,可能需要优化你的渲染场景或者降低渲染质量。

      2. 更新显卡驱动:确保你的显卡驱动是最新的,因为旧的驱动可能不支持某些 DirectX 12 特性或者存在已知的 bug。

      3. 内存泄漏检测:使用内存分析工具检查你的程序是否存在内存泄漏。

      4. 优化资源使用:检查你的资源绑定和释放逻辑,确保没有不必要的资源占用。

      5. 调整 DispatchRays 参数:可能需要调整 DispatchRays 调用的参数,以减少对显存的需求。

      6. 使用 Fallback 机制:如果你的硬件不支持 DirectX Raytracing,可以考虑使用 Fallback Layer 来模拟光追效果。

      7. 错误处理:在调用 Present 之前,添加错误处理逻辑,捕获并处理可能的异常。

      8. 调试工具:使用 DirectX 12 的调试工具,如 GPUView 或 RenderDoc,来监控和分析渲染过程中的资源使用情况。

      关于代码实现,以下是一个基本的 DirectX 12 光追渲染流程的示例代码:

      // 创建并初始化 Direct3D 设备、命令队列、交换链等资源
      // ...
      
      // 创建光追加速结构(BLAS 和 TLAS)
      // ...
      
      // 创建光追着色器表
      // ...
      
      // 录制命令列表
      ID3D12GraphicsCommandList* commandList = commandQueue->GetCommandList();
      commandList->BeginCommandList();
      
      // 设置光追相关的状态和绑定
      // ...
      
      // 执行光追渲染
      commandList->SetPipelineState1(pRaytracingPipelineState);
      commandList->DispatchRays(&dispatchDesc);
      
      // 执行其他渲染命令
      // ...
      
      // 提交命令列表并呈现结果
      commandList->Close();
      commandQueue->ExecuteCommandLists(&commandList);
      swapChain->Present(1, 0);
      
      // 等待GPU完成操作
      // ...
      
      // 清理资源
      // ...
      

      请注意,这只是一个示例流程,具体的实现细节会根据你的应用程序需求而有所不同。

      至于参考资料,你可以参考以下链接:

      这些资料提供了关于 DirectX 12 和光追渲染的详细信息,以及如何解决内存不足等常见问题。

      展开全部

      评论 编辑记录
    • 关注

      下午好🌅🌅🌅
      本答案参考ChatGPT-3.5

      这个问题非常简单,就是将数组中的所有元素都按照升序排列好。

      评论
    编辑
    预览

    报告相同问题?

  • 相关阅读:
    计算机操作系统学习(三)处理器管理(1)
    现代卷积网络实战系列6:PyTorch从零构建ResNet训练MNIST数据集
    专业运动耳机哪个品牌好?运动蓝牙耳机推荐
    Node编写重置用户密码接口
    RAMday9
    论文笔记: 多标签学习 DM2L
    TTS 擂台: 文本转语音模型的自由搏击场
    怎样建立实战化的安全体系
    如何轻松学习Java
    软考高项考试历程回顾
  • 原文地址:https://ask.csdn.net/questions/8118996