1

我正在使用“Windows 运行时”为 Window 8 创建一个应用程序。

我有一个自定义控件,它可以自己绘画。为此,我使用 Rectangle 控件并将其“Fill”属性设置为从 SurfaceImageSource 派生的 ImageBrush,然后使用 ID2D1RenderTarget 进行绘画。对于绘制位图,我使用 ID2D1RenderTarget::CreateBitmapFromWicBitmap 并保存返回的 ID2D1Bitmap。控件是动画的,我创建了我需要的所有位图,然后不断地绘制场景。

在大多数情况下,这一切都很好。然而,我发现在随机的基础上,突然间,我已经隐藏的所有 ID2D1Bitmaps 都停止了绘制任何东西。我可以追溯代码,似乎没有任何问题,但是当我调用 ID2D1RenderTarget::DrawBitmap 时,什么也没有发生。但是,我发现如果我强制从文件中重新创建 ID2D1Bitmap,它就会再次正常工作。就好像位图已经失效或什么的。

这种位图丢失的情况很少发生,而且似乎是随机的,但我几乎可以保证它会在播放后的一个小时左右内失败。我很确定这不是内存泄漏,因为我可以一次运行应用程序数小时而不会增加使用的内存。另外,如果我强制位图重新加载,我可以继续,就好像什么都没发生一样。

谁能给我一个关于这里可能发生的事情的线索?

谢谢。

4

1 回答 1

2

经过多次试验和错误(由于很难重现问题而没有帮助),我发现问题的根源在于对 ID2DRenderTarget::BeginDraw 的调用返回 DXGI_ERROR_DEVICE_REMOVED。在我的代码所基于的示例代码中,它表明为了响应这个错误,我需要重新创建我正在做的上下文。但是,我并没有删除与旧上下文关联的所有缓存位图,并且这些位图不适用于新上下文。我修复了这个问题,现在我的应用程序从这个错误中恢复了。

虽然这解决了问题,但我仍然不确定我为什么在玩游戏时会随机出现“设备已删除”错误。此外,不用说,在播放过程中重新加载所有图形显示为令人讨厌的延迟故障。幸运的是它很少发生,所以我想我将不得不忍受它。

于 2013-02-13T15:57:56.520 回答