AS3性能优化

发布时间:2019-08-25 09:37:59编辑:auto阅读(1196)

    本篇文章用来总结本人对AS3性能优化方面的认识及经验,可能会有一些错误,敬请不吝赐教.如果想了解更多,请参考ADOBE方面的相关只是介绍.

    1,关于显示对象:

        shape -> sprite -> moviechip

    我之所以这样写,是因为: 从shape到moviechip成本逐步增高.如果显示对象不要求是容器,交互对象,最好用shape;moviechip与sprite的区别是,moviechip有一个时间轴的概念.如果不需要动画的话,请使用sprite.

    2,关于集合:

    var $arr : Array = [];
    var $obj : Object = {};

    比:

    var $arr : Array = new Array();
    var $obj : Object = new Object();

    效率更高.另外关于遍历,for each , for  while效率由高到低.

    for( var $key : * in $obj )


    for( var $key : string in $obj )

    的效率高.这里必须指出,i+=1 的效率大于i++ ,int > number > uint.对于while,倒序的效率更高

    var $index : int = $arr.lenght;
    while($index-=1 > -1){
    }

    对于vector,如果存储的数据元素比较大,建议用vector,它的效率最高尤其是存储数量比较多的数据时.另外如果知道要存储多少数据,最好是用:(假设知道有20个MyClass对象)这样效率会进一步提高.

    var $vec : Vector.<MyClass> = new Vector.<MyClass>(20);

    3,关于对象池:

    缓存一些相同的对象,以便于随时调用.这里强调一些事情:

        ①:缓存的对象数目:很对情况下,读段时间这个对象可能要用10个,可能要8个,可能12个...估计一个出现最多的数目.

        ②:一段时间后dispose掉多余的对象,以释放内存.比如你设置缓存10个对象,但是本局破天荒要用15个对象,你new了一些对象以凑成15个对象.但是用完后,要dispose掉5个对象.因为要用15个对象很少出现.

        ③:当不用这些对象时,dispose所有的对象.null掉集合(用来存储这些对象)

    这样可以保证空间和时间的平衡.new的成本太高了.

    4,关于["myChild"]:

        关于"[]"尽量不要用,效率不行,以前用的屁颠屁颠的,哎.使用.或者getChildByName方法就好.嗯,说一下个人的经历:在一个MC上的第n帧有个元件打个比方是mc,此mc从第n帧到第n+m帧做一个补间动画.你用[]的话,只有在n或者n+m(关键帧)上才能获取mc(MC["mc"])但是MC在播放,这玩意很不稳定.用getChildByName在补间动画当中的帧上也能获取到mc.

    5,关于滤镜:

        我把原理说一下:对A进行滤镜.先对A进行副本a,对副本a进行滤镜.30秒后,如果没有对A进行滤镜修改则dispose掉A(这些电脑自动进行).再修改filter,对a计算原件aa,对aa进行滤镜.这回知道滤镜多么的坑爹了吧.如要滤镜效果,还是用Flash做一个,他不会产生多余的东西(副本).

    6,关于自定义事件和CallBack(回调函数):

        首先必须说明CallBack完胜自定义事件.也就是说能用CallBack解决的话,绝对不要用Event.CallBack就是一个类引用了另一个类的方法地址,调用的话,直接上内存.而Event,那么多的参数,触发后还得到处找target(注册目标).但是,你不能满脑子都想用callback,对Event置之不理,有的时候,CallBack无法办到,那还得用Event.

    7,useCapture = true:

        如显示对象不做任何修改,移位,缩放,旋转.用useCapture = true能提高性能.但是如做出修改则适得其反.最好自己做缓存BitMapData

    8,尽量少调用函数:

        getter name() : string 和 settet(value:string):void 比 publie var $name的效率低.调用函数的成本高,当然这更符合OOP的思想,但不利于性能......还是用public字段吧.

    9,关于显示对象的visible

        很多时候,AS3程序员都喜欢把不用的显示对象设为visible = false,这是可以的.但是从Flash Player方面来讲,Visible = false任然值得它去绘制,它比较笨.木有办法,那优化的方案就是,将其移出舞台了.

    10,像素处理优化:

    当绘制像素时,使用BitmapData 类的相应方法即可进行一些简单优化。快速绘制像素的一种方式是使用 setVector() 方法:

    // Image dimensions 
    var wdth:int = 200; 
    var hght:int = 200; 
    var total:int = wdth*hght; 
    // Pixel colors Vector 
    var pixels:Vector.<uint> = new Vector.<uint>(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 p_w_picpathContainer:Bitmap = new Bitmap ( myImage ); 
    // Paint the pixels 
    myImage.setVector ( myImage.rect, pixels ); 
    addChild ( p_w_picpathContainer );
    如果使用的是较慢的方法,如 setPixel() 或 setPixel32(),请使用 lock() 和 unlock() 方法加快运行速度。在以下代码中,使用了
    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 对象更改时进行更新。例如,如果

    Bitmap 对象引用BitmapData 对象,则可以锁定BitmapData 对象,对其更改后再解锁。在BitmapData 对象解锁之前,

    Bitmap 对象不会更改。要提高性能,请在对 setPixel() 或 setPixel32() 方法进行多次调用之前和之后使用此方法及 unlock() 方

    法。调用 lock() 和 unlock() 可防止屏幕进行不必要的更新。

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

    区,则使用 lock() 和 unlock() 不会提高性能。Flash Player 检测到未引用缓冲区,并且位图不会呈现在屏幕上。

    遍历像素的方法 (例如 getPixel()、getPixel32()、setPixel() 和 setPixel32())可能速度很慢,特别是在移动设备上。如果可能,

    请使用在一次调用中检索所有像素的方法。要读取像素,请使用 getVector() 方法,它比 getPixels() 方法速度快。此外,请记

    住,尽可能使用依赖于Vector 对象的API,因为它们的运行速度可能更快。

关键字

上一篇: MySQL总结-3

下一篇: Python与DBA