Windows phone 7 如何将RAM使用率保持在90MB以下?(特别是缩放图像)
我正在为WP7开发一个应用程序(适用于Windows Phone RTM和WP Emulator的VS2010 Express),但现在我面临一个与内存使用相关的大问题。 该应用程序本身有12个视图,其中一些视图可以与不同的数据一起重用。它是一个新闻阅读器,因此视图主要是列表框(图像缩略图、堆栈面板和文本块) 第一个视图有一个包含30个项目的列表框。这需要大约20MB的RAM,但当我在视图之间导航时,当前和峰值RAM使用量开始上升。峰值使用量约为55MB,我认为还可以,但该应用程序有一个图库部分,在选择缩略图后,它会导航到另一个视图,其中显示下载的图像(JPEG,1131px×1647px,~486KB),但最初适合屏幕。在此之前,一切都很好,但出于缩放目的,我正在使用和问题是当我放大图像时,内存使用量接近90MB(就像上次我测试最大缩放大小为2.5时的87MB) 此外,在浏览视图之后,当前ram使用量可能会永久达到并保持在35MB,我认为这是由于设备缓存了一些东西 因此,正如标题所说,我如何避免如此巨大的ram使用 编辑--Windows phone 7 如何将RAM使用率保持在90MB以下?(特别是缩放图像),windows-phone-7,memory-management,ram,Windows Phone 7,Memory Management,Ram,我正在为WP7开发一个应用程序(适用于Windows Phone RTM和WP Emulator的VS2010 Express),但现在我面临一个与内存使用相关的大问题。 该应用程序本身有12个视图,其中一些视图可以与不同的数据一起重用。它是一个新闻阅读器,因此视图主要是列表框(图像缩略图、堆栈面板和文本块) 第一个视图有一个包含30个项目的列表框。这需要大约20MB的RAM,但当我在视图之间导航时,当前和峰值RAM使用量开始上升。峰值使用量约为55MB,我认为还可以,但该应用程序有一个图库部分
另外,我想问一下,在我的应用程序中,是否可以从任何视图导航到几乎所有其他视图,并且在这两者之间始终有一个页面转换动画(如beta工具中的电话列表应用程序模板),可能是内存使用过多的原因。一般来说,您希望图像尽可能小(尺寸和颜色深度,不一定是文件大小)。为了显示图像,设备必须将其解压缩为实际位图,因此在本例中,您看到的是1131x1647像素的图像,比如16bpp,这意味着您有3.7MB的图像内存,而不是486k的文件大小
根据您的缩放/旋转,可能会有第二个复制缓冲区,因此您可以有效地将其加倍。以这样的速率不需要很长时间就可以达到90MB。我当然会尝试下载较小的图像文件,或者尝试在本地调整它们的大小,然后使用调整大小的图像。需要注意的几点。首先,确保您正在清除onNavigatedFrom方法期间在页面上使用的所有列表或图像。WP7处理图像的方式是“有趣的”。我发现有一件事很有帮助,那就是当页面不显示时,将任何全景控件的背景置零 至于您的具体问题,您是否考虑过使用多尺度图像(深度缩放)来减少内存
也许我应该研究一下deepzoom(但当我第一次读到它时,我认为它是用来处理不同大小的相同图像的,就像卫星视图中的谷歌地图),但昨天我在视图中使用了一个webbrowser解决了这个问题,所以如果之前我有:
<Image x:Name="imgPlaceHolder" delay:LowProfileImageLoader.UriSource="{Binding Path=ActualImageSource}" MaxHeight="800"
MaxWidth="480" >
<interac:Interaction.Behaviors >
<tbeh:MultiTouchBehavior x:Name="ImageMTB" IsScaleEnabled="True"
MinimumScale="0.4"
MaximumScale="2.5"
IsRotateEnabled="False"
IsDebugModeActive="False"
IsTranslateXEnabled="True"
IsTranslateYEnabled="True"
>
</tbeh:MultiTouchBehavior>
</interac:Interaction.Behaviors>
</Image>
我改为:
<phone:WebBrowser Source="{Binding Path=ActualImageSource}" x:Name="wbbigimage" />
它使用更少的内存,并且可以毫无问题地进行缩放
在检查此项之前,我将等待有更好解决方案的人。您是指类似mylistbox.itemsource=null?或者最好将整个datacontext设置为null?我在ViewModel端做得更多,并在页面不再可见时将数据缓存到独立存储中。好吧,我只是发现了一个问题。。。。webBrowser控件捕获操纵事件,因此不能执行诸如触发方法之类的自定义操作。(就像a用来转到下一张和上一张图片的那种)。嗨,@Felipe Guajardo:我对你使用web浏览器控件的解决方案很感兴趣,你如何加载图像并将其绑定到源代码?谢谢,你好。看看上面我自己的答案。首先,我使用(不是纯粹的)MVVM模型,因此在我的viewmodel中,我有一个带有URL(字符串)的属性,在示例中称为ImplementMageSource。第一块代码是使用图像控件和第三方行为来支持多点触摸。我将其更改为第二个代码块,该代码块使用与webbrowser控件相同的RealizeMageSource属性作为源代码(带绑定)。Felipe-如果您仍然必须在webbrowser上使用Manip事件,那么在OS7.5上这是可行的,但方式很糟糕。您必须扫描并进入WebBrowser的子视觉树,并将处理程序附加到那里。如果您必须实现这一目标并且遇到问题,请通知我。