其他最佳化

對於 TextField 物件,請使用 appendText() 方法來取代 += 運算子。

使用 TextField 類別的 text 屬性時,請使用 appendText() 方法以取代 += 運算子。使用 appendText() 方法可改善效能。

例如,下列程式碼使用 += 運算子,而該迴圈需花費 1120 毫秒才能完成:

addChild ( myTextField ); 
  
myTextField.autoSize = TextFieldAutoSize.LEFT; 
var started:Number = getTimer(); 
  
for (var i:int = 0; i< 1500; i++ ) 
{ 
    myTextField.text += "ActionScript 3"; 
} 
  
trace( getTimer() - started ); 
// output : 1120 

在下列範例中,會將 += 運算子取代成 appendText() 方法:

var myTextField:TextField = new TextField(); 
addChild ( myTextField ); 
myTextField.autoSize = TextFieldAutoSize.LEFT; 
  
var started:Number = getTimer(); 
  
for (var i:int = 0; i< 1500; i++ ) 
{ 
    myTextField.appendText ( "ActionScript 3" ); 
} 
 
trace( getTimer() - started ); 
// output : 847 

程式碼現在花費 847 毫秒完成。

盡可能在迴圈之外更新文字欄位。

這段程式碼可以使用簡單的技術來進一步最佳化。在每個迴圈中更新文字欄位需要使用非常多的內部處理。只要使用字串並將它指定給迴圈外面的文字欄位,執行程式碼的時間就會大幅縮短。程式碼現在只需花費 2 毫秒即可完成:

var myTextField:TextField = new TextField(); 
addChild ( myTextField ); 
myTextField.autoSize = TextFieldAutoSize.LEFT; 
 
var started:Number = getTimer(); 
var content:String = myTextField.text; 
  
for (var i:int = 0; i< 1500; i++ ) 
{ 
    content += "ActionScript 3"; 
} 
  
myTextField.text = content; 
  
trace( getTimer() - started ); 
// output : 2 

使用 HTML 文字時,過去的方法因太過於緩慢,導致 Flash Player 在某些情形下擲回 Timeout 例外。例如,如果執行的硬體速度太慢,即有可能會擲出例外。

備註: Adobe® AIR® 不會擲出此例外。
var myTextField:TextField = new TextField(); 
addChild ( myTextField ); 
myTextField.autoSize = TextFieldAutoSize.LEFT; 
  
var started:Number = getTimer(); 
  
for (var i:int = 0; i< 1500; i++ ) 
{ 
    myTextField.htmlText += "ActionScript <b>2</b>"; 
} 
 
trace( getTimer() - started ); 

透過將值指定至迴圈外面的字串,程式碼只需要 29 毫秒即可完成:

var myTextField:TextField = new TextField(); 
addChild ( myTextField ); 
myTextField.autoSize = TextFieldAutoSize.LEFT; 
  
var started:Number = getTimer(); 
var content:String = myTextField.htmlText; 
  
for (var i:int = 0; i< 1500; i++ ) 
{ 
    content += "<b>ActionScript<b> 3"; 
} 
  
myTextField.htmlText = content; 
  
trace ( getTimer() - started ); 
// output : 29 
備註: 在 Flash Player 10.1 與 AIR 2.5 中,已經改良 String 類別,使字串使用較少的記憶體。
盡可能避免使用方括弧運算子。

使用方括弧運算子會使效能降低。您可以將參考儲存在區域變數中,以避免使用它。下列程式碼範例示範無效率的方括弧運算子使用方式:

var lng:int = 5000; 
var arraySprite:Vector.<Sprite> = new Vector.<Sprite>(lng, true); 
var i:int; 
  
for ( i = 0; i< lng; i++ ) 
{ 
    arraySprite[i] = new Sprite(); 
} 
  
var started:Number = getTimer(); 
  
for ( i = 0; i< lng; i++ ) 
{ 
    arraySprite[i].x = Math.random()*stage.stageWidth; 
    arraySprite[i].y = Math.random()*stage.stageHeight; 
    arraySprite[i].alpha = Math.random(); 
    arraySprite[i].rotation = Math.random()*360; 
} 
  
trace( getTimer() - started ); 
// output : 16 

下列最佳化的版本可減少使用方括弧運算子:

var lng:int = 5000; 
var arraySprite:Vector.<Sprite> = new Vector.<Sprite>(lng, true); 
var i:int; 
  
for ( i = 0; i< lng; i++ ) 
{ 
    arraySprite[i] = new Sprite(); 
} 
  
var started:Number = getTimer(); 
var currentSprite:Sprite; 
  
for ( i = 0; i< lng; i++ ) 
{ 
    currentSprite = arraySprite[i]; 
     currentSprite.x = Math.random()*stage.stageWidth; 
     currentSprite.y = Math.random()*stage.stageHeight; 
     currentSprite.alpha = Math.random(); 
     currentSprite.rotation = Math.random()*360; 
} 
  
trace( getTimer() - started ); 
// output : 9 
盡可能內嵌程式碼,可減少在程式碼中函數呼叫的次數。

呼叫函數可能會耗費很多資源。請嘗試將程式碼移動為內嵌,以減少呼叫函數的次數。將程式碼移動成內嵌,是單純將效能最佳化的好方法。不過,請記住內嵌程式碼會使您的程式碼變得不易重複使用,而且可能會增加 SWF 檔案的大小。有些函數呼叫 (例如 Math 類別方法) 可以輕易地移動成為內嵌。下列程式碼會使用 Math.abs() 方法來計算絕對值:

const MAX_NUM:int = 500000; 
var arrayValues:Vector.<Number>=new Vector.<Number>(MAX_NUM,true); 
var i:int; 
  
for (i = 0; i< MAX_NUM; i++) 
{ 
    arrayValues[i] = Math.random()-Math.random(); 
} 
  
var started:Number = getTimer(); 
var currentValue:Number; 
  
for (i = 0; i< MAX_NUM; i++) 
{ 
    currentValue = arrayValues[i]; 
    arrayValues[i] = Math.abs ( currentValue ); 
} 
  
trace( getTimer() - started ); 
// output : 70

Math.abs() 所執行的計算可以手動完成且移動成內嵌:

const MAX_NUM:int = 500000; 
var arrayValues:Vector.<Number>=new Vector.<Number>(MAX_NUM,true); 
var i:int; 
  
for (i = 0; i< MAX_NUM; i++) 
{ 
    arrayValues[i] = Math.random()-Math.random(); 
} 
  
var started:Number = getTimer(); 
var currentValue:Number; 
  
for (i = 0; i< MAX_NUM; i++) 
{ 
    currentValue = arrayValues[i]; 
    arrayValues[i] = currentValue > 0 ? currentValue : -currentValue; 
} 
  
trace( getTimer() - started ); 
// output : 15

將函數呼叫移動成內嵌,會讓程式碼執行速度超過四倍。這個方法在許多情況下都很有用,請注意它對於可重複使用性與維護性的影響。

備註: 程式碼的大小對於整體播放程式執行而言影響相當重大。如果應用程式包含大量的 ActionScript 程式碼,則虛擬機器會花費大量的時間來進行程式碼驗證和 JIT 編譯。因為繼承層次較深,且內部快取較為零散,所以屬性查詢也會變得較為緩慢。若要縮小程式碼的大小,請避免使用 Adobe® Flex® 架構、TLF 架構元件庫,或任何大型協力廠商 ActionScript 元件庫。
避免在迴圈中評估陳述式。

不要在迴圈內部評估陳述式是另一個最佳化的方式。下列程式碼會重複執行陣列,但並沒有最佳化,因為會在每個次循環時評估陣列長度:

for (var i:int = 0; i< myArray.length; i++) 
{ 
}

將值儲存起來並重複使用是比較好的方式:

var lng:int = myArray.length; 
 
for (var i:int = 0; i< lng; i++) 
{ 
}
使用反向順序的 while 迴圈。

反向順序的 while 迴圈速度比正向迴圈來得快:

var i:int = myArray.length; 
 
while (--i > -1) 
{ 
}

這些秘訣提供一些最佳化 ActionScript 的方式,您只需要一行程式碼即可影響效能和記憶體。還有許多可最佳化 ActionScript 的方式。如需詳細資訊,請參閱下列連結: http://www.rozengain.com/blog/2007/05/01/some-actionscript-30-optimizations/