问题描述
我已经构建了DX11VideoRenderer sample(使用DirectX11而不是EVR的DirectX9的EVR的替代品),并且可以正常工作。问题是,它不能很好地工作。 EVR对相同视频使用的CPU时间是它的两倍(更多信息请参见下一个问题)。
自从有了源代码之后,我决定对其进行概要分析,以查看发生了什么。 (除其他事项外)这导致我:
HRESULT DX11VideoRenderer::CPresenter::CheckDeviceState(BOOL* pbDeviceChanged)
我不是DirectX专家(实际上我根本不是一个),但是当监视器被拔出,窗口被FullScreened,关闭等时,窗口句柄似乎可能失效。对我来说很有意义。
但是。
当我查看CheckDeviceState的代码时,它所做的第一件事就是调用SetVideoMonitor,这似乎很奇怪。
SetVideoMonitor类似于您首次初始化演示者(或更改目标窗口)时调用的例程,而不是您反复调用以“检查”设备状态的例程。
实际上,SetVideoMonitor调用TerminateDisplaySystem,然后调用InitializeDisplaySystem。我可以在启动时看到一次,但是这些功能被称为每帧一次。那不对。
我可以在CheckDeviceState(或实际上是CheckDeviceState的所有)中注释掉对SetVideoMonitor的调用,并且代码继续正常运行(预计速度会更快)。但是后来我不再检查设备状态了。
试图找出检查DX11中状态变化的正确方法,这给我带来了here的启发,其中涉及仅检查IDXGISwapChain :: Present和ResizeBuffers的返回码。那应该怎么做?因为那样看来,整个例程似乎是DX9的一部分(在该版本中,它仍然执行得不好)。
在DX11中检查设备状态的正确方法是什么?这甚至是东西了吗?
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)