AS3优化性能笔记二

处理像素

使用setVector()方法绘制像素。

var wdth:int = 200;
var hght:int = 200;
var total:int = wdth*hght;
// Pixel colors Vector
var pixels:Vector. = new Vector.(total, true);
 
for ( var i:int = 0; i< total; i++ )
{
// Store the color of each pixel
pixels[i] = Math.random()*0xFFFFFF;
}
 
// Create a non-transparent BitmapData object
var myImage:BitmapData = new BitmapData ( wdth, hght, false );
var imageContainer:Bitmap = new Bitmap ( myImage );
// Paint the pixels
myImage.setVector ( myImage.rect, pixels );
addChild ( imageContainer );

如果用的是较慢的方法,如setPixel()或者setPixel32(),请使用lock()和unlock()方法加快运行速度。

var buffer:BitmapData = new BitmapData(200,200,true,0xFFFFFFFF);
var bitmapContainer:Bitmap = new Bitmap(buffer);
var positionX:int;
var positionY:int;
// Lock update
buffer.lock();
var starting:Number=getTimer();
 
for (var i:int = 0; i<2000000; i++)
{
// Random positions
positionX = Math.random()*200;
positionY = Math.random()*200;
// 40% transparent pixels
buffer.setPixel32( positionX, positionY, 0x66990000 );
}
 
// Unlock update
buffer.unlock();
addChild( bitmapContainer );
trace( getTimer () - starting );
// output : 670

BitmapData类的lock()方法可以锁定图像,并防止引用该图像的对象在BitmapData对象更改时进行更新。

注:如果处理的是位图(而不是显示列表)中的像素(双缓动),有时该技术不会提高性能。如果位图对象没有引用位图缓冲区,则使用lock()和unlock()不会提高性能。

遍历像素的方法(例如getPixel()、getPixel32()、setPixel()、setPixel32()可能速度很慢,特别是移动设备上。如果可能,则使用在一次调用中检索所有像素的方法。要读取像素,使用getVector()方法,它比getPixels()方法速度快。尽可能使用依赖于Vector对象的API,因为它们的运行速度可能会更快。

TextField优化

使用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.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

在每个循环中更新文本字段会使用很多内部处理。通过仅连接一个字符串并将其分配给循环外的文本字段,可大大减少运行代码所需的时间。

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文本时,前一种方法速度更慢,易造成Timeout异常,如果基础硬件速度太慢,则可能会引发异常。

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 <strong>2</strong>";
}
 
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&lt; 1500; i++ )
{
content += "<strong>ActionScript</strong> 3";
}
 
myTextField.htmlText = content;
trace ( getTimer() - started );
// output : 29

尽可能避免使用中括号[]运算符

使用中括号运算符可能会降低性能,以下代码演示了使用中括号运算符的效率很低:

var lng:int = 5000;
var arraySprite:Vector. = new Vector.(lng, true);
var i:int;
 
for ( i = 0; i&lt; lng; i++ )
{
arraySprite[i] = new Sprite();
}
 
var started:Number = getTimer();
 
for ( i = 0; i&lt; 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. = new Vector.(lng, true);
var i:int;
 
for ( i = 0; i&lt; lng; i++ )
{
arraySprite[i] = new Sprite();
}
 
var started:Number = getTimer();
 
for ( i = 0; i&lt; 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
原文地址:https://www.cnblogs.com/youlechang123/p/2914028.html