• 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
  • 相关阅读:
    Facebook的体系结构分析---外文转载
    简易的IOS位置定位服务
    【简易版】IOS仿periscope自制狂赞飘桃心
    The Linux Programming Interface
    freeswitch嵌入lua脚本
    Epoll Tutorial – epoll In 3 Easy Steps!
    基于freeswitch的webrtc与sip终端呼叫
    buildroot添加第三方库
    rfc
    TCP/UDP Server-Client implementation in C
  • 原文地址:https://www.cnblogs.com/youlechang123/p/2914028.html
Copyright © 2020-2023  润新知