【问题标题】:Why do my images sometimes reload (and WriteableBitmaps disappear) on resume?为什么我的图像有时会在恢复时重新加载(并且 WriteableBitmap 消失)?
【发布时间】:2013-01-04 04:43:15
【问题描述】:

当我恢复我的应用时,有时它会丢失图像。我什至可以在琐碎的应用程序中重现这一点。

这以两种不同的方式表现出来,具体取决于图像的来源:

  • 如果我执行<Image Source="/Assets/Logo.png"/> 之类的操作(即通过 URI 从我的应用程序包中加载图像),图像将短暂消失,然后重新加载。当屏幕包含许多图像时,这更容易看到;它们按顺序重新加载,因此我可以看到整个屏幕上的图像加载波纹。
  • 如果我创建了一个WriteableBitmap 并将其绑定到 Image.Source,那么位图将完全消失,永远不会返回。

如果只是重新加载图像,我可能会忍受这种情况(尽管涟漪效应令人不快),但我做了很多动态图像生成,而且我的所有 WriteableBitmaps 消失并不酷。

并非每次应用暂停和恢复时都会发生这种情况,只是有时会发生。我还没有确定一个可靠的复制案例,但似乎它被暂停的时间越长,我在此期间做的其他事情就越多(在桌面 Chrome 中浏览网页,玩 TapTiles 和 Microsoft Minesweeper 等全屏 DirectX 游戏) ,越有可能,当我切换回我的应用程序时,图像就会丢失。 (该应用没有被终止并重新启动——它仍然是同一个应用实例。)

我想知道这是否与从视频内存中刷新图像有关。但我不知道如何检验这个假设,所以现在只是一个猜测。

到目前为止,我还没有找到任何方法让我的程序甚至可以告诉 WriteableBitmaps 正在丢失。事件的顺序与正常的挂起和恢复相同:

  • Window.Current.Activated 使用 args.WindowActivationState == Deactivated 触发
  • Window.Current.VisibilityChanged 使用 args.Visible == false 触发
  • Application.Suspending 火灾
  • (时间流逝)
  • Application.Resuming 触发
  • Window.Current.VisibilityChanged 使用 args.Visible == true 触发
  • Window.Current.Activated 使用 args.WindowActivationState == CodeActivated 触发

我没有任何运气找到“顺便说一句,你所有的图片都消失了”事件。 WriteableBitmap 没有事件。 Image 有 ImageOpened 和 ImageFailed 事件,但只有在我从 URI 加载图像时才会触发——当 Source 是 WriteableBitmap 时它们永远不会触发。

我已经能够在琐碎的应用程序中重现此问题,因此它不是由某些第三方库引起的。如果应用程序已暂停一段时间,然后您恢复它,则具有通过 URI 加载的图像的空白页面将再次触发 ImageOpened(并且图像在完成重新加载之前会短暂闪烁)。如果应用程序已暂停一段时间,然后您将其恢复,则带有初始化为 WriteableBitmap 的图像的空白页面将消失。

我怎样才能修复 WriteableBitmaps 的丢失(如果可能,还有 content-URI 图像)? 有什么方法可以防止图像丢失?如果没有,有什么方法可以检测到它们已经丢失,所以我可以重新创建我的 WriteableBitmaps?

(对于奖励积分,我很想知道为什么图像会消失,但这部分完全是可选的。我早就放弃了期待 WinRT 有意义。)

【问题讨论】:

    标签: winrt-xaml writeablebitmap


    【解决方案1】:

    我做了一些实验,清楚地表明 WinRT 只是丢失了 WriteableBitmap 的内容,而不是 WriteableBitmap 本身。 WriteableBitmap 实例仍然可行;如果你给它新的像素数据,它工作正常。只是有时,在应用恢复时,其内容会被一大片透明像素替换。

    我已经能够通过挂钩我的应用程序的 OnResuming 事件并使用该事件来获取我的 WriteableBitmap 的 PixelBuffer.AsStream()、写入新像素并调用 WriteableBitmap.Invalidate() 来解决此问题。如果重新生成图像的代码是同步的,那么当应用程序恢复时,图像甚至不会闪烁。

    我怀疑普通位图(通过源 URI 加载)也会丢失其像素缓冲区,并且必须在应用程序恢复后重新加载其像素。图像加载是异步的,这解释了其内容重新出现之前的延迟/闪烁。

    我还没有找到一种方法来知道图像是否丢失了像素(尽管显然 URI 加载的图像有一些知道的方法,因为它们会自动重新加载)。因此,对于 WriteableBitmaps,最安全的做法似乎是始终在应用恢复时重新填充它们。

    【讨论】:

      【解决方案2】:

      为了在某种程度上取代之前的答案,我发现简单地使 WriteableBitmap 无效就可以解决问题。我建议您在重写图像之前先尝试一下,因为这可能对您的应用程序产生更重大的影响,而不是仅仅使其无效。

      也可以通过强制您的应用程序暂停和恢复来重现此错误。最初我们很难确定何时会发生,因为我们正在等待应用程序暂停。 This is a link 到一篇关于如何在 WinRT 应用程序中模拟挂起和恢复的文章。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-05-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-03-27
        • 2020-05-08
        相关资源
        最近更新 更多