【问题标题】:how to optimize performance of longlistselector with images on windows phone?如何使用 windows phone 上的图像优化 longlistselector 的性能?
【发布时间】:2013-06-12 16:50:36
【问题描述】:

我有一个包含大约 10 个项目的枢轴的页面,每个枢轴项目包含一个 longlistselector,每个项目有 30 个项目。

每个 longlistselector 项都包含一个图像。

当我浏览页面并翻到下一个数据透视项目时,应用程序在第 4 个数据透视项目崩溃并出现内存异常。

是否有卸载长列表选择器中未显示的图像?

【问题讨论】:

  • 您的图片有多大?它不应该与那么多图像崩溃,除非它们实际上非常大。 Pivot 实际上并不加载所有图像。当您离开时,您始终可以从上一个数据透视页面中删除图像。你从哪里加载图片?
  • 如果是wp8,你试过Virtualization吗?
  • 是的,它们实际上很大,因为我是从网络上获取它们的。
  • @ToniPetrina 如何从上一页删除图像?
  • @ChrisW。没有……有教程吗?

标签: c# wpf xaml windows-phone


【解决方案1】:

我建议重新考虑您的应用布局,10 个数据透视项目对于普通用户导航来说有点太多了,为什么不拥有一个带有“类别”长列表选择器的主页,然后是一个包含 30 个图像的详细信息页面。

但如果你绝对必须这样做,请查看microsoft's photohub source

我个人使用它,在全景项目中加载数百张图像没有问题。

如果您有时间,最好还是做一个内存配置文件并查看膨胀的确切位置,有时它可能是您的应用程序的某些部分占用了内存。

最后,wp 本身会自动缓存图像,但不是每个人都喜欢这种方式(我相信你不喜欢)

看看这个:

图像缓存

这是一个重要的问题,MSDN 目前对此保持沉默。如果您想知道为什么在清除源并从树中删除图像后没有释放图像内存,您很可能会看到图像缓存在起作用。这是一种预期的性能优化,以避免一遍又一遍地(下载)加载和解码相同的图像。相反,我们在内存中保留了一个缓存,我们可以轻松快速地重用它。这不是为了与下载文件的浏览器缓存混淆。

虽然这是一个不错且免费的性能优化,但有时它可能会不必要地破坏您的记忆,尤其是当您循环浏览许多您永远不会回来的图像时。它们的缓存将在您的应用程序的整个生命周期内耗尽内存。好消息是,当您决定不再需要缓存时,可以将其删除:

BitmapImage bitmapImage = image.Source as BitmapImage;
bitmapImage.UriSource = null;
image.Source = null;

聪明一点可以节省相当多的内存使用量,这是手机设备上的宝贵资源。在示例应用程序中,转到“缓存”页面并在显示/清除图像时监控内存使用情况。然后选中该框并重试。在示例案例中,您将看到大约 3MB 的差异。

您可以获取全文here

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-07-01
    • 2015-02-26
    • 2022-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多