在我的应用程序中,我使用direct2d写入共享(d3d11 / d3d10)纹理。这是我的应用程序中使用的唯一一种渲染目标。由于设备可能在direct2d中丢失(D2DERR_RECREATE_RENDER_TARGET),因此存在大量代码来抽象和/或重新创建依赖于设备的资源。但是,我还没有看到这种情况真的发生了,我很好奇我是否在浪费精力。渲染目标实际上是否会在这种情况下丢失,或者我是否受到保护,因为纹理是通过d3d11创建的(虽然与d3d10共享)?如果是这样,有没有人知道一种可重现的,简单的方法导致渲染目标丢失,所以我至少可以测试处理这种情况的代码?
答案 0 :(得分:4)
这不是浪费精力。许多情况可能会导致设备丢失。将其用于测试目的的一种简单方法是更新图形驱动程序。您的应用程序应该优雅地处理它。如果您的图形驱动程序崩溃或Windows Update在后台安装新版本,它也可能在幕后发生。还有其他情况,但这些可能是最常见的。
您可以使用设备管理器快速回滚和更新驱动程序。
答案 1 :(得分:0)
当另一个程序使用任何版本的D3D API进行全屏和返回时,D2D窗口渲染目标将始终丢失(独占模式,而不是自D3D10 / 11以来支持的新窗口模式)。在D3D11中,我认为您必须更改D2D渲染目标的分辨率更改。
因此,如果在这种情况下没有得到D2DERR_RECREATE_RENDER_TARGET HRESULT,那么在向纹理渲染目标呈现时,可能您不需要重新创建渲染目标,但我仍然会处理D2DERR_RECREATE_RENDER_TARGET。要测试它,您可以在开发期间用窗口渲染目标替换纹理渲染目标。