我正在使用'Windows运行时'为Window 8创建一个应用程序。
我有一个自定义控件可以自己绘画。为了实现这一点,我使用一个Rectangle控件并将它的'Fill'属性设置为从SurfaceImageSource派生的ImageBrush,然后使用ID2D1RenderTarget进行绘制。对于绘制位图我使用ID2D1RenderTarget :: CreateBitmapFromWicBitmap并保存返回的ID2D1Bitmap。控件是动画的,我创建了我需要的所有位图,然后不断地绘制场景。
这一切在大多数情况下运作良好。然而,我发现在随机的基础上,突然间我所有的ID2D1Bitmaps都停止画任何东西。我可以浏览代码,似乎没有任何错误,但是当我调用ID2D1RenderTarget :: DrawBitmap时,没有任何反应。但是,我发现如果我强制从文件中重新创建ID2D1Bitmap,那么它再次正常工作。这几乎就像位图已经失效一样。
这种位图的丢失很少发生并且似乎是随机的,但我几乎可以保证它会在一小时左右的时间内失败。我很确定它不是内存泄漏,因为我可以一次运行几个小时的应用程序,而不会增加使用的内存。此外,如果我强制重新加载位图,我可以继续,好像什么也没发生过。
任何人都可以告诉我这里可能发生的事情吗?
感谢。
答案 0 :(得分:2)
经过多次试验和错误(由于很难重现问题而没有帮助),我发现问题的根源是对ID2DRenderTarget :: BeginDraw的调用返回了DXGI_ERROR_DEVICE_REMOVED。在我基于我的代码的示例代码中,它表明,为了响应这个错误,我需要重新创建我正在做的上下文。但是,我没有删除与旧上下文关联的所有缓存位图,并且这些位图不适用于新上下文。我解决了这个问题,现在我的应用程序从这个错误中恢复了。
虽然这解决了这个问题,但我仍然不确定我理解为什么我在播放时随机出现“设备删除”错误。另外,不用说,在播放过程中重新加载所有图形显示为令人讨厌的延迟故障。幸运的是它很少发生,所以我想我将不得不忍受它。