as3 代碼優化

1 代碼寫法正則表達式

    1 定義局部變量算法

定義局部變量的時候,必定要用關鍵字var來定義,由於在Flash播放器中,局部變量的運行速度更快,並且在他們的做用域外是不耗佔系統資源的.當一個函數調用結束的時候,相應的局部變量都會被銷燬,而且釋放出他們佔有的系統資源api

    2 申明變量時強制類型數組

     var a:int; 而非 var a;緩存

3  訪問靜態屬性 比 非靜態屬性 慢閉包

4  getter setter 比直接訪問屬性慢app

5  final變量和類效率更高函數

6  申明多個變量時單行效率比多行申明高性能

   for(var i:int=0; i<100000; i++)字體

   { var v1:Number=10, v2:Number=10, v3:Number=10, v4:Number=10;}

7 不要在循環內定義變量

8 刪除沒必要要的導入類

9 as 比 type(value) 轉型要快

10 短變量名比長變量名高效

11  儘可能將代碼內嵌,避免過多的函數調用。(好比用 value > 0 ? value : -value; 來代替 Math.abs())

    調用函數成本很高。嘗試經過移動內聯代碼來減小函數的調用次數

          for (i = 0; i< MAX_NUM; i++)

{

currentValue = arrayValues;

arrayValues = Math.abs ( currentValue );

}

優化代碼以下:運行速度提升四倍以上。

for (i = 0; i< MAX_NUM; i++)

{

currentValue = arrayValues;

arrayValues = currentValue > 0 ? currentValue : -currentValue;

}

    12 if(a.a) 比 if(a.a==null) 快

    13 for..in 效率大於for ,需求證

    14 當用到複雜的條件表達式時。把他們打散成爲嵌套的獨立判斷結構是最佳方案。好比if(a&&b&&c)的效率就低於if(a){if(b){if(c){}}}。

15  對 while 循環使用相反的順序 ( while (--i > -1) { } ) 比for更高效

    16 低階運算效率高於高階運算

unit()--->Math.floor()     更快的算法:var u:uint=1.5>>0;

int()--->Math.ceil()

位運算>乘法>除法 ,但要注意是的有些運算是不能轉換的 13/2 不能轉換成 13<<0;

    17  方法閉包做爲監聽器更方便和高效,由於他不須要活動的對象做爲依賴體.

      class Form

{

function setupEvents()

{

var f = function(event:Event) {

trace(「my handler」);

}

grid.addEventListener(「click」, f);

}

}

優於

class Form

{

function setupEvents()

{

grid.addEventListener(「click」, f);

}

function f(event:Event)

{

trace(「my handler」);

}

}

2 數組等容器

   1  初始化 var a:Array=[]; 效率高於 var a:Array = new Array();

   2 一維數組來代替二維數組

   3 關於Vector和Array

         1在基本數據類型 int number string 時Vector 效率優於Array

         2在Object中,仍是選擇Array,不論是排序仍是大量應用Array,特別在用sortOn時Array比Vector要快.

         3固定長度的 Vector 更快。( Vector 能夠這樣初始化:var coords:Vector.<Number> = Vector.<Number>([132, 20, 46, 254, 244, 100, 20, 98, 218, 254]);)

 

 

4數組循環:

    用局部變量緩存數組長度 ,用uint代替int

        for(var i:uint=0;i<len;i++){

          Var a:Object = arr;

        }

5 重置數組用

   Arr.length=0 效率最快

6 初始化數組

   a[]  比push方法效率高600%

7  儘量少使用方括號操做符訪問 Vector 或 Array 元素,能夠利用一個臨時變量來操做。

    8  Dictionary 弱引用可用來自動銷燬資源.

 

 

3 顯示對象api相關

    1  新的 drawing API 更快,它們是:drawPath, drawGraphicsData, drawTriangles。

2  使用 setVector() 方法來處理像素。

3  使用 setPixel() 和 setPixel32 方法時,要配合使用 lock() 和 unlock() 方法。

    4  儘量在避免在循環內更新 TextField。

    5  位圖仍是矢量圖:

  矢量 :同屏元素較少, 須要放大不失真   ,位圖:須要大量元件,遊戲特效,圖像特效

  矢量平滑處理:減小控制點。可以使幀頻穩定。

選中矢量圖,Ctrl+Alt+Shift+C,減小線條

  位圖壓縮方式 Fireworks 能夠用PNG8格式高效的壓縮帶Alpha通道的圖片

    6 運動物體針對每一個子元件使用 cacheAsBitmap 而不是針對父元件使用。

    7 使用 cacheAsBitmap 和 opaqueBackground 參數能夠改進渲染性能(包含 TextField )。

    8   stage3d在旋轉、縮放和alpha混合方面頗有優點,這塊是位圖的軟肋,位圖只有在原始狀態下渲染是最快的,想要不影響效率就得預先緩存出各類狀況,會耗費掉大量內存,所以在這方面stage3d的性能更增強大 ,能夠用3d來作2d加速

9  使用 TextField 時,appendText() 方法比 += 操做符要快。

    10  使用 TextLine 處理靜態文本比 TextField 快並且使用更少的內存

    11 對文本基本搜索和提取時,使用 String 類方法而非正則表達式

   12 當某個實例透明度小於1時,也會對播放速率形成影響。低透明度的可設置visable爲flase

   13 不要用masks 應該用 scrollRect來作遮罩效果

   14 使用適當的DisplayObject

      * Shape – 沒有交互(佔內存少)

      * Sprite – 有交互(佔內存多)

      * MovieClip – 有時間線(佔內存更多)

   15 減小重繪區域

      顯示重繪區域:flash.profiler.showRedrawRegions (true,0x33ff00);

   

   16 儘量禁用鼠標交互。obj.mouseEnabled = false; obj.mouseChildren = false;

   17 激活和停用事件

   使用 Event.ACTIVATE 和 Event.DEACTIVATE 事件檢測後臺是否處於非活動狀態,並相應地優化應用程序。對於移動設備很重要,例如後臺運行air時,可將其幀頻減少。

   18 回調方法 要比 event 快並且消耗更少的內存

   

4   資源

      對象緩存池

      減小文件大小 (嵌入字體少用,用濾鏡而非位圖)

      合理加載,要用時加載資源

      列表和列表數據分開加載

      數據分頁

      分次請求

      

資源銷燬   

     1 釋放內存 – 將全部對象的引用設置爲 null

2 bitmap bitmapData 不用時  dispose();並將引用設置爲null

3 卸載從外部裝載的內容時,使用loader.unloadAndStop(),而不要使用 loader.unload()。

4 xml對象會比字符串佔用內存增大20倍,可用System.disposeXML()來斷開程個xml對象鏈接銷燬xml對象.

5 URLLoader.close();URLStream.close();加載素材時可用這兩個加載再用Loader.loadbytes。由於  Loader.load會展開swf文件,內存比壓縮的流數據佔用內存大.

6 適當使用事件冒泡,若有大量子對象須要添加事件監聽器時,能夠添加在父窗口中,冒泡實現 。

,大量事件冒泡是沒必要需的,可中止冒泡.事件記得移除監聽

7 不可見mc ,先stop,再移除監聽,再從舞臺上remove.

8 若是以前使用了ExternalInface.callBack("APIName", functionName)聲明瞭一個API,則可使用ExternalInface.callBack("APIName", null)取消該API

總結:

     移除監聽

     管理intervals timeout timer

     卸載swf

     中止聲音視頻

     移除顯示對象

     中止時間幀

     關閉鏈接 LocalConnections NetConnection NetStream

     沒有攝像頭和麥克風處理的處理

     釋放位圖數據

   

      

Janitor類  

http://gskinner.com/talks/resource-management/source.zip

參考:

http://gskinner.com/talks/resource-management/

http://www.rozengain.com/blog/2007/05/01/some-actionscript-30-optimizations/

編譯原理:

相關文章
相關標籤/搜索