我正在为WP7开发一个应用程序(VS2010 Express用于Windows Phone RTM和WP模拟器),但现在我面临与内存使用情况有关的大问题。该应用本身具有12个视图,其中一些视图与不同的数据重复使用。这是一个新闻阅读器,因此视图主要是列表框(图像缩略图,stackpanels和textblocks)。

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

同样,在我浏览视图之后,当前的RAM使用可能会在35MB上延伸并停留,我相信这是由于设备缓存了一些东西。

因此,正如标题所说的那样,我如何避免使用如此巨大的RAM使用呢?

编辑 - -
另外,我想问一下,在我的应用程序中,一个人可以从任何视图导航到几乎每个视图,并且在两者之间总是有一个页面过渡动画(例如Beta工具中的电话列表应用程序模板的一个页面),可能有助于过度的内存使用。

有帮助吗?

解决方案 2

好吧,也许我应该研究deepzoom(但是当我第一次阅读它时,我认为它是为了在不同尺寸的情况下使用相同的图像,例如卫星视图中的Google Maps),但是昨天我通过在我的内部使用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"  />

它使用较少的内存,并没有任何问题来照顾变焦。

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

其他提示

一般而言,您想保持图像尽可能小(在尺寸和颜色深度,不一定是文件大小)中。为了显示图像,该设备必须将其解压缩到实际的位图,因此在这种情况下,您要查看1131x1647pixel图像,例如在16BPP上,意味着您的图像具有3.7MB的内存足迹,而不是图像486K文件大小。

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

有几件事要注意。首先,请确保您要清除在按OnnavigatedFrom方法的页面上使用的所有列表或图像。 WP7处理图像的方式是“有趣的”。我发现要帮助的一件事是在没有显示页面时将任何全景控制的背景删除。

至于您的特定问题,您是否考虑过使用多幕图(Deep Zoom)来减少内存?

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top