標籤:
一. 在wp7中,程式所使用記憶體不能超過90M, 否則會自動結束。
二. 如果一個page沒有被釋放,那麼它所包含的所有控制項資源都不會被垃圾收集.
在wp7中操作映像資源是很費記憶體的,而我們在XAML檔案中定義的Image控制項,由於屬於靜態資源。
所以你不可能在後台CS代碼中對它們進行image.source = null 操作。
除非你把Image控制項的定義放在CS代碼中,
這樣你執行image.source = null 操作或者
將Image控制項從LayoutRoot中卸掉:LayoutRoot.Children.Remove(Image),那麼這個image就會被垃圾收集。
因此,對於在XAML檔案中定義的影像控制來說,要想釋放這些映像所佔用的記憶體,唯一時刻只能是離開這個Page的時刻。
所以,一條重要原則:盡量不要將一個包含大量影像控制的page作為你的MainPage,因為這個Page會等到整個程式結束(exit)的時候才會被釋放。
所以建議就是:
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控制台裡看到。
本文來自sphinx007的部落格,原文地址:http://www.cnblogs.com/SphinX/archive/2012/03/12/2391331.html
Windows Phone 7 90M記憶體限制問題及設計原則