开发者社区 问答 正文

DX12中的效率问题

各位大神请教一个问题,最近编写了了一个dx12的例子发现效率明显没有dx11效率高,基本上差了5倍左右。研究了很久不知道是什么导致的。 效率偏低的api调用显示cpu占用时间过高,GPU占用时间基本是一致的。 占用较高的API如下:

dx12: ExecuteCommandLists 平均占用 0.08MS Present平均占用 0.34MS pCommandList->Reset() 0.06MS

dx11: Present占用 0.11MS DrawIndex占用0.02MS

明显dx12的调用占用时长比dx11要搞很多,各位有没有遇到同样的问题呢?请不吝赐教。

展开
收起
深水清道夫 2020-09-08 14:01:21 463 分享 版权
阿里云 AI 助理回答

您好!看起来您在比较DirectX 12 (DX12) 和 DirectX 11 (DX11) 的性能时遇到了一些问题。DX12 相较于 DX11,设计上给予了开发者更多的底层控制权,这意呀着虽然它有潜力提供更高的效率和性能,但同时也要求开发者做更多手动管理,比如资源管理和命令列表的调度。如果使用不当,确实可能导致性能不如预期。

针对您提到的几个API调用耗时较长的问题,这里有一些可能的原因和建议:

  1. ExecuteCommandLists:在DX12中,执行命令列表通常需要更精细的管理,包括显式同步和资源屏障的使用。确保您的应用正确地组织和复用了命令列表,避免不必要的重复创建或重置操作。同时,检查是否有过多的等待(如 fences 或 semaphores)导致CPU等待GPU完成工作。

  2. Present:DX12中的Present API相比DX11可能包含了更多同步开销,尤其是当涉及到多缓冲或多窗口呈现时。检查您的交换链设置,确保它们是针对性能优化的,例如考虑使用Flip Model模式以减少延迟。

  3. pCommandList->Reset():频繁重置命令列表会增加CPU负担。尝试重用命令列表而不是每次绘制都创建新的,这样可以减少这部分开销。

  4. DrawIndexed vs ExecuteCommandLists:DX12中,每个Draw调用可能对应一个或多个命令列表的提交,这自然增加了CPU上的处理时间。确保您有效地批处理绘制调用,尽量通过合并小的绘制指令到更大的批次来减少调用次数。

  5. 异步计算与并行性:DX12的一大优势在于其对并行性的支持。检查是否充分利用了多核心CPU来并行准备渲染命令、管理资源等,这可以显著降低CPU瓶颈。

  6. 工具辅助诊断:使用图形调试工具,如Visual Studio的图形诊断工具或者NVIDIA Nsight、AMD Radeon GPU Profiler等,可以帮助您更深入地分析具体瓶颈所在,包括GPU利用率、内存带宽、缓存命中率等方面。

  7. 学习最佳实践:查阅官方文档和社区分享的经验,了解如何高效地使用DX12的特性,比如捆绑包(Bundles)、状态对象(State Objects)等,这些都能帮助提升性能。

总之,DX12的性能优势往往需要更细致的优化策略来实现,而直接对比DX11的简单调用模式可能会显得DX12“更慢”,但实际上这是由于两者的使用模型差异造成的。希望上述建议能帮助您找到性能瓶颈并进行相应的优化。

有帮助
无帮助
AI 助理回答生成答案可能存在不准确,仅供参考
0 条回答
写回答
取消 提交回答
问答分类:
问答地址: