微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

D3D11_CREATE_DEVICE_PREVENT_INTERNAL_THREADING_OPTIMIZATIONS的替代方法?

如何解决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 举报,一经查实,本站将立刻删除。