Flash應用程序的內存管理機制和優化方法

1.Flash 應用程序的 性能優化建議 SGF 談熠
2.GC ( Garbage Collector )是什麼
FP 的內存通過 GC 自動管理
GC 是一段自動執行的邏輯,通過回收程序中 無用的對象 來釋放內存
3.那什麼是“無用的對象”?
對於原生數據類型( Boolean, String, Number, uint, int )而言:就是被刪除了的數據
對於非原始數據類型:不再被 “引用” 的對象
4.被“取消引用” vs 被“刪除” // 創建一個對象,並將對象的引用指向 a var a: Object = {foo:" bar "} // 把對象的應用複製給 b var b: Object = a; // “ 刪除” a 的引用 delete (a); // 這是對象仍然被 b 引用 trace (b.foo); // 輸出結果: “ bar”, 對象依舊存在
5.GC 如何判斷無用對象
很早以前: GC 採用簡單的計件法
var a: Object = {foo:" bar "} // 這個對象現在 1 個引用( a ) 計數: 1 var b: Object = a; // 現在有 2 個引用 (a 和 b) 計數: 2 delete (a); // 只是剩一個引用 (b) 計數: 1 delete (b); // 麼有引用了,可以安全釋放 計數: 0
6.“ 計件法”的無奈
但“計件法”遇到循環引用的時候
var a: Object = {} ; // 創建對象 b ,幷包含引用到對象 a var b: Object = {foo:a}; // 然後讓 a 引用 b ,此時 a,b 各記被引用一次 a.foo = b; // 在程序刪除 a,b ,由於 a,b 都有計數,因此不會被 GC delete (a); delete (b);
7.現在的 GC 採用標記法
標記法 遍歷所有對象 ,對無根的對象進行標記
然後 釋放被標記的對象
8.有了 GC ,爲什麼還會內存泄漏?
GC 的觸發不是根據程序的清除指令來執行,而是根據內存分配情況來執行的。內存空間越緊俏, GC 才工作越勤快。
GC 只管標記,而且內存釋放是異步執行的
整個過程極不透明
未被釋放的內存對象將一直被執行直到釋放爲止
9.常見的內存漏洞情況
動態內容,比如:
從顯示列表中被移除的現實對象
忘記移除監聽器的跟隨鼠標的現實對象
10.GC 的非典型情況
Timer 對象一定要採用弱引用 , 否則在 Timer 結束之前,存在引用的對象不會被 GC 。
在一個類 內部 ,對類內的對象添加 eventlistener ,即便採用弱引用,這個類的實例不會被 GC ,直到那個 eventlistener 被移除之後。
從一個類的 外部 ,對這個類的實例添加 eventlistener ,不管是強 / 弱引用,這個實例都能被 GC 。
11.強制 GC 進行一次完整清掃
try {
new LocalConnection (). connect (' foo ');
new LocalConnection (). connect (' foo ');
} catch (e:*) {}
// 強迫 GC 進行一次完整的標記和內存清掃
12.幀頻
13.FP 實際幀頻的由來 多線程的 AVM 來實現單線程的 SWF 內容執行 Flash Player 加載的 swf AVM Marshal
14.SWF 幀頻的處理原理 一個完整的 marshal 週期所執行的內容 Marshal 的執行週期和 swf 設定 幀頻的匹配
15.Marshal 的執行優先級
聲音
視頻
動畫
邏輯
FP 會用盡一切資源來滿足這兩項的執行需求! 邏輯排在最後,真是杯具… .
16.關於實際幀頻的一些硬指標
在一般 PC 上
Marshal 的最短週期是 17ms ,相當於 60 fps
Marshal 的最長週期是 100ms
如果 SWF 所求幀頻低於實際幀頻,則 FP 自動降頻優化
在 MAC 上
Marshal 週期長度爲固定的 19ms
17.程序設計
18.簡化 Flex 程序的界面結構 AS 3 的事件廣播原理
19.簡化 Flex 程序的界面結構 /Stage + Container 1 + Container 1.1 + Container 1.1.1 + Container 1.1.1.1 + Button 1 + Button 2 + Button 3 /Stage + Button 1 + Button 2 + Button 3 + Textfield 1 + Textfield 2
20.採用 IDisposable 接口
GC 不是內存管理!
在每個模塊中實現自我清理:
21.採用層疊清除機制 Container 1 Container 1.1 Container 1.1.1 … child.dispose() child.dispose() child.dispose() 清除
22.充分使用 FP 10.1
23.FP 的版本模式
SWF 的發佈版本決定了 FP 對其的執行模式
FP10.1 FP10 FP9 FP8 …
24.FP10.1 採用 Nanojit 內核
更高效的字符串處理
可深入控制的圖像解壓,和針對圖像優化的 GC
25.使用 FP10.1 的全局異常處理 try { 你的整個程序! } catch …
26.謝謝

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章