处理像素
使用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< 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< 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