Windows 8 WinRt下自定义控件的SurfaceImageSource存在问题

Windows 8 WinRt下自定义控件的SurfaceImageSource存在问题,windows-8,windows-runtime,Windows 8,Windows Runtime,我正在使用“Windows运行时”为Windows 8创建应用程序 我有一个自定义控件,它自己绘制。为了实现这一点,我使用了一个矩形控件,并将其“Fill”属性设置为从SurfaceImageSource派生的ImageBrush,然后使用ID2D1RenderTarget进行绘制。对于绘制位图,我使用ID2D1RenderTarget::CreateBitmapFromWicBitmap并保存返回的ID2D1Bitmap。该控件已设置动画,我创建了所需的所有位图,然后连续绘制场景 这一切在很大

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

我有一个自定义控件,它自己绘制。为了实现这一点,我使用了一个矩形控件,并将其“Fill”属性设置为从SurfaceImageSource派生的ImageBrush,然后使用ID2D1RenderTarget进行绘制。对于绘制位图,我使用ID2D1RenderTarget::CreateBitmapFromWicBitmap并保存返回的ID2D1Bitmap。该控件已设置动画,我创建了所需的所有位图,然后连续绘制场景

这一切在很大程度上都很有效。然而,我发现,在随机的基础上,突然之间,我藏起来的所有ID2D1BITMAP都停止绘制任何东西。我可以跟踪代码,似乎没有什么错误,但是当我调用ID2D1RenderTarget::DrawBitmap时,什么都没有发生。但是,我发现,如果我强制从该文件重新创建ID2D1Bitmap,它将再次正常工作。这几乎就好像位图已无效或其他什么

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

有人能告诉我这里可能发生了什么事吗


谢谢。

经过多次尝试和错误(由于重现问题非常困难,这一点没有帮助),我发现问题的根源在于对ID2RenderTarget::BeginDraw的调用返回DXGI\u error\u DEVICE\u remove。在我基于代码的示例代码中,它显示了为了响应此错误,我需要重新创建上下文,我正在这样做。但是,我并没有删除所有与旧上下文相关联的缓存位图,而且这些位图不能与新上下文一起使用。我修复了这个问题,现在我的应用程序可以从这个错误中恢复


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

我只能建议创建一个小型的独立复制项目,并检查它是否仍然发生,然后在其他设备上进行测试,最后在MSDN论坛上向Microsoft寻求帮助,因为他们可以验证这是否是您的代码或平台中的错误。哦,请尝试更新您的驱动程序。:)谢谢经过多次尝试和错误(由于重现问题非常困难,这一点没有帮助),我发现问题的根源在于对ID2RenderTarget::BeginDraw的调用返回DXGI_error_DEVICE_remove。在我基于代码的示例代码中,它显示了为了响应此错误,我需要重新创建上下文,我正在这样做。但是,我并没有删除所有与旧上下文相关联的缓存位图,而且这些位图不能与新上下文一起使用。我修复了这个错误,现在我的应用程序从这个错误中恢复。很高兴知道。我认为值得把它作为你自己问题的答案。