天天看點

代碼級優化

Loader的當機,flash player 9采用unload就行當機,flash player10引入了一個新的方法

unloadAndStop()

進行當機,該方法會解除安裝SWF檔案,自動當機SWF中的每個顯示對象并強制運作垃圾回收。

關于MovieClip和Sprite的滑鼠事件,當不需要滑鼠事件的時候将 mouseEnabled 和 mouseChildren 設為false. 不斷的檢測滑鼠互動事件會消耗CPU,尤其是大量互動對象重疊的情況。

對于執行時間太長的非動畫内容,優先選擇計時器,而不是 Event.ENTER_FRAME 事件。

var obj:Object = {};  比  

var obj:Object = new Object(); 好

var arr:Array = []; 比  var arr:Array = new Array(); 好   * 循環測試1000,0000次 ,  []比new快3倍

for (var i:int=0, len=arr.length; i<len; i++) 比 (頭一次看到這種寫法  經測試 效率是下面的2倍  ) for (var i:int=0; i<arr.length; i++) 好

if (myObj != null)  比  if (myObj)  快 

for ( var i:*        in  myObj )  比 for ( var i:String in  myObj )  快;

如果不是為了儲存顔色值請不要适用uint這個類型,他的速度比起 int要慢多了;

Array的周遊要比Object或者Dictionary的枚舉要快得多。

Dictionary當 weak key設定為 true 的時候要比 false 慢;

var myText:String = “a” + “b” + “c”;

var myText2:String = [ "a", "b", "c" ].join(”");

在JavaScript裡面在IE下後者要更快,但是在AS裡面,前者更快!

在循環體内聲明變量和在循環體外聲明變量其實速度上不會有太大的差別。

4、小心Flash的重繪

如果你使用的是Flash Player 的Debugger版本,那麼請在檢查性能瓶頸的時候不要忘記打開顯示重繪區域的功能,這将幫你迅速定位到舞台上有那些地方被重繪了,找出沒有顯示任何東西卻不斷重繪的地方,這些地方肯定是有問題的。Flash Player很笨,不會說你把一個DisplayObject的visible設定成false就放棄重繪那個顯示對象。是以請保證你的 MovieClip在visible=false的時候為停止狀态。有一點很有意思,假設兩個現實物體存在 hitTest = true 這樣的關系,那麼重繪的區域的面積很有可能 > 兩者的面積總和!

小心使用useBitmapCache = true

一般情況下除非你确定這個顯示對象不可能發生變化那麼用用也無妨,不過我更推薦自己手動的用BitmapData将該對象Draw一遍,然後讓這個對象徹底消失。否則每次的變動都是巨大的性能消耗。

5. 乘法運算 比 除法 快 “兩” 倍: x=(stage.stageWidth/2);與x=(stage.stageWidth*0.5);的結果是一樣的,但是乘法的運算效率要比除法快兩倍(測試為真)。

6. 避免頻繁的建立和删除對象動作:對于要從舞台中删除的對象,如果稍後還會再用到這個對象的話,使用visibility=false将其“删除”,而不是使用removeChild把它從顯示清單中删除。因為Flash Player中重建對象要比隐藏對象複雜的多。

7.使用對象池:在遊戲初始化時,把所有需要的對象存放到一個數組中。當需要删除和重建對象是,隻需要聲明一個對象引用數組中的這個對象即可。這比重新new一個對象出來要快多了。

8 . 位運算有時候會更快:位運算的計算方法和CPU的處理資料本質上是一緻的,跟CPU講它的“母語”,它“了解”起來,做起來自然就更快了!

9.使用Vector類存儲一組相同類型的資料:Flash player10引入了Vector類。除了要求存儲資料必須是同一種類型外,它的功能和Array類完全一緻。但是如果當需要存儲不同類型的資料時,Array的運作效率還要比Vector勝出一籌的。

10. 用uint代替Math.floor:要對一個小數進行四舍五入,你第一時間可能會想到Math.floor方法,比如 Math.floor(9.3213);而将這個數字強制轉換為uint類型,可以得到相同個結果:uint(9.3213);更重要的是Flash Player處理uint的速度要比Math.floor快的多。   11. 使用适當的Display Object

          o Shape – 沒有互動(占記憶體少)

          o Sprite – 有互動(占記憶體多)

          o MovieClip – 有時間線(占記憶體更多)

    * 盡可能重用對象,而不要重新建立

    * 強制類型轉換int(exp)要比Math.floor()和Math.ceil()快很多

    * 使用對象池技術重用對象

    * 釋放記憶體 – 将所有對象的引用設定為null

    * 盡可能重用BitmapData

    * Callback要比event快而且消耗更少的記憶體

2. 減少CPU使用率

    * 即便将一個 Display Object從stage上移除了(removeChild)甚至是已經将它的引用設定為null,它依然有可能在消耗CPU。是以要在其移出 display list時将其完全停下來(比如mc.stop())。

    * 解除安裝從外部裝載的内容時,使用loader.unloadAndStop(),而不要使用loader.unload()。

    * 盡可能禁用滑鼠互動。obj.mouseEnabled = false; obj.mouseChildren = false;

    * Timer在某些情況下比ENTER_FRAME要好。

    * 減少tweening的使用。

3. ActionScript性能

盡可能使用Vector替代Array。 固定長度的Vector更快。(  Vector可以這樣初始化: var coords:Vector.<Number> = Vector.<Number>([132, 20, 46, 254, 244, 100, 20, 98, 218, 254]);)

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

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

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

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

    * 盡可能在避免在循環内更新TextField。

    * 盡可能少使用方括号操作符通路Vector或Array元素,可以利用一個臨時變量來操作。

    * 盡量将代碼内嵌,避免過多的函數調用。(比如用 value > 0 ? value : -value; 來代替Math.abs())

    * 代碼量過大也會造成性能的降低。盡量少使用大型第三方庫(Flex, TLF)。

    * 避免在循環内使用evaluating statements(myArray.length)。用臨時局部變量來操作。

4. 渲染性能

    * 盡可能避免使用alpha參數。

    * 适當的使用cacheAsBitmap可以大幅提高性能。(對于變化少的矢量元件)

    * 針對每個子元件使用cacheAsBitmap而不是針對父元件使用。

    * 使用TextLine處理靜态文本比TextField 快而且使用更少的記憶體。

    * 使用cacheAsBitmap和opaqueBackground參數可以改進渲染性能(包含TextField)。

繼續閱讀