package { import com.bit101.components.Label; import com.bit101.components.NumericStepper; import flash.display.Bitmap; import flash.display.BitmapData; import flash.display.Sprite; import flash.display.StageAlign; import flash.display.StageScaleMode; import flash.events.Event; import flash.filters.GlowFilter; import flash.geom.Point; import flash.geom.Rectangle; import net.hires.debug.Stats; [SWF(frameRate = "60", width = "720", height = "480", backgroundColor = "#000000")] public class BitmapDataPerformance extends Sprite { public static const FIRST_NUM:uint = 1000; private static const STAGE_H:int = 480; private static const STAGE_W:int = 720; private var bitmapData:BitmapData; private var first:Particle; private var ns:NumericStepper; private var texture:BitmapData; public function BitmapDataPerformance() { stage.align = StageAlign.TOP_LEFT; stage.scaleMode = StageScaleMode.NO_SCALE; texture = new BitmapData(16, 16, true, 0xFFFF0000); texture.fillRect(new Rectangle(1, 1, 14, 14), 0x0); bitmapData = new BitmapData(STAGE_W, STAGE_H, false, 0x0); addChild(new Bitmap(bitmapData)); addEventListener(Event.ENTER_FRAME, enterFrameHandler); addChild(new Stats()); var label:Label = new Label(this, 80, 0, "BitmapData.copyPixels() Test"); label.scaleX = label.scaleY = 2; label.filters = [ new GlowFilter(0xFFFFFF, 1, 4, 4, 20)]; ns = new NumericStepper(this, 85, 40, changeHandler); ns.minimum = 250; ns.value = FIRST_NUM; ns.step = 250; reset(FIRST_NUM); } private function changeHandler(e:Event):void { reset(ns.value); } private function reset(numObj:uint):void { var old:Particle; for (var i:int = 0; i < numObj; i++) { var p:Particle = new Particle(); p.point = new Point(); p.point.x = STAGE_W * Math.random(); p.point.y = 0; p.vx = 0; p.vy = 10 * Math.random(); p.bitmapData = texture; if (old) old.next = p; if (i == 0) first = p; old = p; } } private function enterFrameHandler(event:Event):void { bitmapData.lock(); bitmapData.fillRect(bitmapData.rect, 0xFF000000); var p:Particle = first; while (p.next) { p.point.x += p.vx; p.point.y += p.vy; if (p.point.x < 0) p.point.x = STAGE_W; else if (p.point.x > STAGE_W) p.point.x = 0; if (p.point.y < 0) p.point.y = STAGE_H; else if (p.point.y > STAGE_H) p.point.y = 0; bitmapData.copyPixels(p.bitmapData, p.bitmapData.rect, p.point); p = p.next; } bitmapData.unlock(); } } } import flash.display.BitmapData; import flash.geom.Point; internal final class Particle { public var bitmapData:BitmapData; public var next:Particle; public var point:Point; public var vx:Number; public var vy:Number; }