在DirectX11中访问CheckDeviceState的正确方法是什么?

问题描述

我已经构建了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 (将#修改为@)

相关问答

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