4

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

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

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

那么,正如标题所说,我怎样才能避免使用如此巨大的内存呢?

编辑----
另外我想问一下,在我的应用程序中,是否可以从任何视图导航到几乎所有视图,并且在两者之间总是有一个页面转换动画(比如电话列表应用程序模板中的那个) beta 工具),可能会导致内存使用过多。

4

3 回答 3

1

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

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

于 2010-10-06T15:11:07.307 回答
1

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

<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"  />

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

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

于 2010-10-07T16:17:31.260 回答
0

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

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

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

于 2010-10-06T23:28:07.933 回答