关于WP7中的90M内存限制问题及设计原则

一. 在wp7中,程序所使用内存不能超过90M, 否则会自动退出

二. 如果一个page没有被释放,那么它所包含的所有控件资源都不会被垃圾收集.

     在wp7中操作图像资源是很费内存的,如果内存超过90M,你的程序就挂了,而我们在XAML文件中定义的Image控件,由于属于静态资源,所以你不可能在后台CS代码中对它们进行image.source = null 操作,我试过,没有用,除非你把Image控件的定义放在CS代码中,这样你执行image.source = null 操作或者将Image控件从LayoutRoot中卸掉:LayoutRoot.Children.Remove(Image), 那么这个image就会被垃圾收集。

因此,对于在XAML文件中定义的图像控件来说,要想释放这些图像所占用的内存,唯一时刻只能是离开这个Page的时刻。所以,一条重要原则就是尽量不要将一个包含大量图像控件的page作为你的MainPage,因为这个Page会等到整个程序结束(exit)的时候才会被释放,你想想,在整个程序运行过程中,这些内存一直被占用着,一旦你再开一个包括许多图像的page,或者你load了其他东西到内存里,你的内存使用很可能会超过90M。

所以建议就是:

  1.如果程序有主界面的话,尽量不要在主界面上放太多图像控件。或者说不要将一个拥有大量图像的page作为main page。

  2.尽可能将需要播放动画并包含大量图像的page单独做成一个page,播放完毕或者用完就离开这个page

  3.Panorama 的background 如果设置成图像image的话,会消耗大量内存,一般24M左右,而且跟是否是jpg或png, 跟图像大小和复杂度也没关系, 我做过试验,唯一能降低内存消耗的方法是讲panorama的高度(height)减小,比如减小一般,那么内存消耗也会减小一般,因为它只绘制了一半在界面上嘛。

   你可能会想到将panorama的背景设置成渐变,我试过,这样也会消耗17M内存。如果设置成单色(solid color brush),大约消耗2-3M左右。 唯一不会消耗内存的就是:no background.

   因此,请在选用Panorama之前,好好检查一下你的程序当前已经消耗了多少内存。余下的内存还够不够你load 一个panorama大胃王。

  4.听说Pivot也是个让人又爱又恨的东西,在你加了很多tab到一个pivot中,而且图像又太多时,它也可能挂。 不过具体情况我还没试,以后再说。

 

另外,附送一段代码,让你知道在WP7中,如何让你知道每个Page何时被释放?

        #if(DEBUG)
        /// <summary>
        /// Add a finalizer to check for memory leaks
        /// </summary>
        ~YourPage()
        {
            System.Diagnostics.Debug.WriteLine("Finalizing " + this.GetType().FullName);
        }
        #endif

你可以将这段代码添加到你的每一个page中,记得修改这个析构函数的名称哦。 那么当这个page被析构的时候,就会在output控制台里看到。

 

看来很多同学都想知道为什么会有这个限制,那么我就补充一下吧:

这是因为Windows Phone 7的应用程序认证要求规定的,5.2.5规定,任何应用程序不得使用超过90 MB的内存,除非手机的可用内存超过256 MB。

下面是英文详细说明:

5.2.5 Memory Consumption
An application must not exceed 90 MB of RAM usage, except on devices that have more than 256 MB of memory. You can use the DeviceExtendedProperties class to query the amount of memory that is available on the device and modify the application behavior at runtime to take advantage of additional memory. For more information, see the DeviceExtendedProperties class in MSDN.
The DeviceTotalMemory value returned by DeviceExtendedProperties indicates the physical RAM size in bytes. This value is less than the actual amount of device memory. For an application to pass certification, Microsoft recommends that the value returned by ApplicationPeakMemoryUsage is less than 90 MB when the DeviceTotalMemory is less than or equal to 256 MB.

所以说这个脑残的规定实际上是防止你的程序无限制的使用内存从而拖慢整个系统的运行,包括多个程序之间的切换,微软这次就是想让windows phone 7的用户体验更加流畅,由于目前推出的所有型号的wp7手机的RAM都是256MB, 因此如果以后出的手机RAM增加了,可能就不会有这个限制了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值