处理像素
使用setVector()方法绘制像素。
var wdth:int = 200;var hght:int = 200;var total:int = wdth*hght;// Pixel colors Vectorvar pixels:Vector. = new Vector.(total, true); for ( var i:int = 0; i< total; i++ ){ // Store the color of each pixelpixels[i] = Math.random()*0xFFFFFF;} // Create a non-transparent BitmapData objectvar myImage:BitmapData = new BitmapData ( wdth, hght, false );var imageContainer:Bitmap = new Bitmap ( myImage );// Paint the pixelsmyImage.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 updatebuffer.lock();var starting:Number=getTimer(); for (var i:int = 0; i<2000000; i++){ // Random positionspositionX = Math.random()*200;positionY = Math.random()*200;// 40% transparent pixelsbuffer.setPixel32( positionX, positionY, 0x66990000 );} // Unlock updatebuffer.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 2";} 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 += "ActionScript 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< 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. = new Vector.(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++ ){ 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