Direct2D Direct3d11互操作 - 设备是否会丢失?

3
在我的应用程序中,我使用direct2d来写入共享的(d3d11/d3d10)纹理。这是我的应用程序中唯一使用的渲染目标类型。由于在direct2d中设备可能会丢失(D2DERR_RECREATE_RENDER_TARGET),因此存在大量代码来抽象和/或重新创建依赖于设备的资源。然而,我还没有看到这种情况实际发生过,我很好奇是否浪费了努力。在这种情况下,渲染目标是否真的会丢失,或者由于纹理是通过d3d11创建的(虽然与d3d10共享),我受到保护?如果是这样,是否有人知道一种可重现、简单的方法来导致渲染目标丢失,以便我至少可以测试处理此条件的代码?

你尝试过更改桌面分辨率吗? - kerim
谢谢您的建议,但是是的 - 渲染目标仍然没有丢失。我还尝试过从全屏切换到窗口模式,调整窗口大小以及锁定/解锁桌面。 - Krazzy
将电脑设置为睡眠/休眠模式,也许可以解决问题? - kerim
哇 - 无论是睡眠还是休眠,都不会导致丢失渲染目标。 - Krazzy
还有两个 - 分离辅助显示器和设备驱动程序更新。 - kerim
显示剩余2条评论
2个回答

4

这并不是徒劳无功的。许多情况可能导致设备丢失发生。一个简单的测试方法是更新您的图形驱动程序。您的应用程序应该优雅地处理这种情况。如果您的图形驱动程序崩溃或Windows更新在后台安装新版本,也可能在幕后发生。还有其他情况,但那些可能是最常见的。

您可以使用设备管理器快速回滚和更新驱动程序。


0

当另一个程序使用任何版本的D3D API进入全屏模式并返回(独占模式,而不是自D3D10/11以来支持的新窗口模式)时,D2D窗口渲染目标将始终丢失。在D3D11中,我认为您必须引起分辨率更改才能使D2D渲染目标丢失。

因此,如果在向纹理渲染目标呈现时没有收到D2DERR_RECREATE_RENDER_TARGET HRESULT,则可能不需要重新创建渲染目标,但我仍然会处理D2DERR_RECREATE_RENDER_TARGET。为了测试它,您可以在开发过程中将纹理渲染目标替换为窗口渲染目标。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接