對於 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/
。