D3D11_CREATE_DEVICE_PREVENT_INTERNAL_THREADING_OPTIMIZATIONS的替代方法?

问题描述

这是this有关使用DX11VideoRenderer sample(使用DirectX11而不是EVR的DirectX9的EVR的替代品)问题的后续内容。

我一直试图找出为什么它比EVR使用更多的CPU。任务管理器告诉我,大部分时间是内核模式。

使用分析工具,我发现大量时间花费在无数次调用NtDelayExecution(又称Sleep)上。多少个电话?在约12秒内约100,000。好的,是的,我在这12秒钟内发送了 很多 帧,但这仍然是很多调用,每个调用都需要内核模式转换。 / p>

调用堆栈显示“我”代码中的最后一次调用是对IDXGISwapChain1::Present(0,0)的调用。实际的调用似乎是Sleep(0),并且来自nvwgf2umx.dll(这就是为什么将这个问题标记为NVidia的原因:希望那里的人可以调用代码并查看这种频繁调用背后的逻辑)。

我不太清楚为什么要在Present期间需要/ any /睡觉。就像我们不再等待垂直回溯一样,不是吗?但是使用Sleep的另一个原因与让步其他线程有关。这导致了我一个严重的线索:

如果我使用D3D11_CREATE_DEVICE_PREVENT_INTERNAL_THREADING_OPTIMIZATIONS,则CPU利用率会下降。与其他一些修复程序相比,DX11版本现在更快,并且比DX9版本使用更少的CPU时间(这是我希望/期望的)。分析显示,睡眠从> 30%下降到

很遗憾,this页告诉我:

不建议将该标志用于一般用途。

哦。

那么,关于如何在不使用调试标志的情况下获得良好性能的任何想法?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...