关于 windows phone 7:如何将 RAM 使用率保持在 90MB 以下? (特别缩放图像)

How to keep RAM usage below 90MB? (Specially scaling images)

我正在为 WP7(用于 Windows Phone RTM 和 WP Emulator 的 VS2010 Express)开发应用程序,但现在我面临与内存使用相关的大问题。
该应用程序本身有大约 12 个视图,其中一些视图可重复使用不同的数据。这是一个新闻阅读器,所以视图主要是列表框(图像缩略图、堆栈面板和文本块)。

第一个视图有一个包含 30 个项目的列表框。这需要大约 20MB 的 RAM,但是当我在视图之间导航时,当前和峰值 RAM 使用量开始上升。嗯,峰值使用量大约为 55MB,我认为还可以,但该应用程序有一个图库部分,在其中选择缩略图后,它会导航到另一个显示下载图像的视图(JPEG,1131 像素?— 1647 像素,~486 KB)但最初适合屏幕。到这里一切都很好,但为了缩放目的,我正在使用 Laurent Bugnion\\'s Multitouch Behavior,问题是当我放大图像时,内存使用量接近 90MB(就像上次我用最大比例测试时的 87MB)大小为 2.5).

此外,在我浏览视图后,当前的 ram 使用量可能会永久达到并保持在 35MB,我相信这是由于设备缓存了一些东西。

所以,正如标题所说,我怎样才能避免如此大量的内存使用?

编辑----
另外我想问一下,在我的应用程序中是否可以从任何视图导航到几乎所有其他视图,并且在两者之间总是有一个页面转换动画(就像测试版工具),可能导致内存使用过多。


好吧,也许我应该研究一下 deepzoom(但当我第一次读到它时,我认为它是用于将它与不同尺寸的相同图像一起使用,例如卫星视图中的谷歌地图),但昨天我通过使用webbrowser 在我的视图中,所以如果我之前有:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<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>

我把它改成了:

1
<phone:WebBrowser Source="{Binding Path=ActualImageSource}" x:Name="wbbigimage"  />

它使用更少的内存并且可以毫无问题地进行缩放。

在检查这个之前,我会等待有更好解决方案的人。


一般来说,您希望图像尽可能小(尺寸和颜色深度,不一定是文件大小)。为了显示图像,设备必须将其解压缩为实际的位图,因此在这种情况下,您正在查看 1131x1647 像素的图像,假设为 16bpp,这意味着您有 3.7MB 的内存占用空间用于图像,而不是486k 文件大小。

根据您的缩放/旋转,可能会有第二个复制缓冲区,因此您可以有效地将其翻倍。以这种速度达到 90MB 并不需要很长时间。我当然会尝试下载较小的图像文件或尝试在本地调整它们的大小,然后使用调整后的图像。


有几点需要注意。首先,确保您在 onNavigatedFrom 方法期间清除了您在页面上使用的所有列表或图像。 WP7 处理图像的方式很"有趣"。我发现有帮助的一件事是在页面未显示时消除任何全景控件的背景。

至于您的具体问题,您是否考虑过使用 MultiScaleImage (Deep Zoom) 来减少内存?

http://msdn.microsoft.com/en-us/library/system.windows.controls.multiscaleimage(VS.95).aspx