我想知道是否有任何具体的策略来处理内存,特别是关于Windows Phone上的图像缓存。我有一个非常图形密集型的silverlight应用程序,它需要保持它的图形,它从互联网上检索,它需要能够自由漫游-但内存要求变得相当巨大的几分钟后使用的应用程序。
我已经尝试将图像的UriSource设置为空,但是当我返回页面时,我需要保持图像背景。我不知所措,因为互联网上的信息不多。内置的分析向我展示了“纹理内存占主导地位”,并要求我分析堆内存来解决这个问题,但我仍然对此一无所知。
有什么前进的方向吗?
发布于 2011-12-15 21:15:02
我的答案是一般的--类似于你的问题。我假设您肯定知道问题出在图像上。(因为一个包含几百个文本项的简单ListBox可能要花费您很多MB。)
如果你在网上搜索,你会找到大量的链接,比如this one。但是一般的分析很容易做。
取一张WP7屏幕大小的图像,即480x800。32位位图(我想这是WP7在打开图像时使用的位图)大约需要1.5MB(一个简单的乘法)。
相同的jpg文件的大小可以小10倍(用于高质量压缩),甚至更小。
现在,当您使用构造时,在幕后执行了什么操作
<image source="http://..."/>.(在您没有提供任何信息的情况下,我想这就是您所使用的。)
WP7下载图像并将其添加到缓存中。缓存显然会跟踪指向图像的Uri的使用。
接下来打开图像,即转换为本机图像大小的位图。如果图像超过最大值,则在此过程中对图像进行下采样。WP7纹理大小。
您可以按照here的说明自定义位图大小。如果你关心质量,那么你应该使用缩小因子2、4或8。对于jpeg来说,这些因子代表了迄今为止最快的选择。(在图像加载到image控件之前,我不知道您是否知道图像的分辨率。从jpg文件中获取这些信息并不太难,但现在我不知道如何在WP7上轻松实现。)
如果(我的猜测)如果控件的源代码设置为null,则位图将被释放。当Uri设置为空时,将从缓存中清除下载的映像。(这在网上被报道了很多次。)
如果你获取了所有这些信息,就应该可以(某种程度上)控制你对图像缓存的使用。您可以粗略地估计图像大小,并决定哪些图像保留在缓存中。也许它需要一些技巧,比如将Uri对象存储在您自己的结构中,并根据需要释放它们。我并不是说这很容易做到,但它肯定是可能的。
https://stackoverflow.com/questions/8519133
复制相似问题