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< 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
说点啥吧
页面
腾讯微博
文章标签
营销 倒计时 avatar 三维数字 homestyler 北大关机门 翻墙 Matrix 收录 正则表达式 apple 图片检索 Adobe WP 31号 成人玩具 代理 roxik shoe obj flower puzzle 源码 google java3d 平面设计 人脸识别 Google Map Flash3D 全景 优化 Away3D Alternativa3D Flash网站 Tips最新评论
- Hsinglin 在 发几个今天在校园里拍的全景图 上的评论
- Rming 在 实验室360全景图 上的评论
- 哪种减肥药效果好 在 发几个今天在校园里拍的全景图 上的评论
- jianhualee 在 新作品flash网站-至尊数码-3D图墙 上的评论
- panda 在 away3d中的obj 上的评论




