Wednesday, March 6, 2013

When is SetPixel32 Faster than CopyPixels?

package 
{
    
    //Common knowledge is SetPixel32 is slower that CopyPixels.
    //What I want to know however is... What is the equivalency ratio?
    //Meaning:
    //Does using setPixel32 100 times take the same amount of time as CopyPixels for a (100x100) (10,000 pixel area)? Or something like that?
    //If you are going to use particles that use the "setPixel32" command... We need to know.
    //Compare setting pixel32 to usingCopyPixels on ONE pixel and see the speed difference.
    
    import flash.display.BitmapData;
    import flash.display.Sprite;
    import flash.events.Event;
    import flash.geom.Point;
    import flash.geom.Rectangle;
    import flash.utils.Timer;
    import flash.utils.getTimer;
    
    /**
     * ...
     * @author JMIM
     */
    public class Main extends Sprite 
    {
        
        public function Main():void 
        {
            if (stage) init();
            else addEventListener(Event.ADDED_TO_STAGE, init);
        }
        
        private function init(e:Event = null):void 
        {
            removeEventListener(Event.ADDED_TO_STAGE, init);
            // entry point
            
            for (var i:int = 1; i < 100; i++)
            {
                pixelTest(i);
            }
            
        }
        
        public function pixelTest(inRecSize:int):void
        {
            trace("rec size == " + inRecSize + "--------::");
            
            var t1:Number;
            var t2:Number;
            var tt:Number;
            var counter:int;
            var counterMax:int = 98765;
            
            var theBm:BitmapData = new BitmapData(500, 500, true, 0x00);
            var copyFromBm:BitmapData = new BitmapData(500, 500, true, 0x00);
            var ZZ:Point = new Point(0, 0);
            var rec1x1:Rectangle = new Rectangle(0, 0, inRecSize, inRecSize);
            
            var setPixelCount:int = 0;
            var setPixelTimes:int = (inRecSize * inRecSize);
            
            t1 = getTimer();
            counter = 0;
            do
            {
                counter++;
                if (counter > counterMax) { break; }
                
                setPixelCount = 0;
                do {
                    setPixelCount++;
                    if (setPixelCount > setPixelTimes) { break;}
                    theBm.setPixel32(10, 10, 0x88FF);
                }while (true);
                
                
                
            }while (true);
            t2 = getTimer();
            tt = t2 - t1;
            trace("setPixel32 time:: tt==" + tt);

            t1 = getTimer();
            counter = 0;
            do
            {
            counter++;
                if (counter > counterMax) { break;}
                
                theBm.copyPixels(copyFromBm, rec1x1, ZZ, null, null, true);
                
            }while (true);
            t2 = getTimer();
            tt = t2 - t1;
            trace("copyPixels time:: tt==" + tt);
        }
        
    }//class
}//package
//OUTPUT:
rec size == 1--------::
setPixel32 time:: tt==50
copyPixels time:: tt==160
rec size == 2--------::
setPixel32 time:: tt==130
copyPixels time:: tt==160
rec size == 3--------::
setPixel32 time:: tt==270
copyPixels time:: tt==170
rec size == 4--------::
setPixel32 time:: tt==470
copyPixels time:: tt==170
rec size == 5--------::
setPixel32 time:: tt==680
copyPixels time:: tt==170
rec size == 6--------::
setPixel32 time:: tt==980
copyPixels time:: tt==180
rec size == 7--------::
setPixel32 time:: tt==1320
copyPixels time:: tt==170
rec size == 8--------::
setPixel32 time:: tt==1730
copyPixels time:: tt==180
rec size == 9--------::
setPixel32 time:: tt==2150
copyPixels time:: tt==190
rec size == 10--------::
setPixel32 time:: tt==2690
copyPixels time:: tt==190
rec size == 11--------::
setPixel32 time:: tt==3220
copyPixels time:: tt==190
rec size == 12--------::

....

//Personally interested in this one, because my tilemap uses 16x16 tiles:
rec size == 16--------::
setPixel32 time:: tt==6830
copyPixels time:: tt==210

No comments:

Post a Comment