Beautifl - Flash Gallery

Preview

Easy Benchmark
ton 2010年3月4日 All rights reserved
?
簡易ベンチマークです。  
ランダムな速度で動くボールを毎フレームごとに100個ずつ追加していき、  
直近10秒の平均fpsが30以下になった時点のボールの数をスコアとします。  
スコアが出るまで少し時間がかかります。  
ちょっと待ってね just a moment!
      /*
簡易ベンチマークです。
ランダムな速度で動くボールを毎フレームごとに100個ずつ追加していき、
直近10秒の平均fpsが30以下になった時点のボールの数をスコアとします。
スコアが出るまで少し時間がかかります。
ちょっと待ってね just a moment!
*/
package {
    import flash.display.Bitmap;
    import flash.display.BitmapData;
    import flash.display.Sprite;
    import flash.events.Event;
    import flash.events.MouseEvent;
    import flash.net.navigateToURL;
    import flash.net.URLRequest;
    import flash.text.TextField;
    import flash.utils.getTimer;
    [SWF(frameRate=240)]
    public class EasyBenchmark extends Sprite {
        private const W:int = 465;
        private const H:int = 465;
        private const MAX_V:int = 10;
        private const MIN_V:int = 3;
        
        private var balls:/*Ball*/Array = [];
        private var frameRates:/*int*/Array = [];
        private var index:int = 0;
        private var ave:int = 120;
        
        private var ballCnt:int = 0;
        private var txtBallCnt:TextField;
        
        private var frameCnt:int = 0;
        private var txtFrameCnt:TextField;
        private var oldTimer:int;
        
        private var bmd:BitmapData;
        private var bmp:Bitmap;
        
        public function EasyBenchmark():void {    
            bmd = new BitmapData(W, H, false);
            bmp = new Bitmap(bmd);
            addChild(bmp);
            
            txtBallCnt = new TextField();
            txtBallCnt.autoSize = "left";
            txtBallCnt.background = true;
            addChild(txtBallCnt);
            
            txtFrameCnt = new TextField();
            txtFrameCnt.autoSize = "left";
            txtFrameCnt.background = true;
            txtFrameCnt.y = 30;
            addChild(txtFrameCnt);
            
            oldTimer = getTimer();            
            addEventListener(Event.ENTER_FRAME, update);
        }
        
        private function update(e:Event):void {
            updateFrame();
            if (ave <= 30) {
                removeEventListener(Event.ENTER_FRAME, update);
                complete();
                return;
            }
            
            for (var i:int = 0; i < 100; i++){
                var ball:Ball = new Ball(randomRange(MAX_V, MIN_V), randomRange(MAX_V, MIN_V));
                ball.x = Math.random() * W;
                ball.y = Math.random() * H;
                balls.push(ball);
                ballCnt++;
            }
            txtBallCnt.text = "score : " + ballCnt;
            
            bmd.fillRect(bmd.rect, 0xffffff);
            for each(ball in  balls) {
                ball.x += ball.vx;
                ball.y += ball.vy;
                bmd.setPixel(ball.x, ball.y, 0xff0000);
                if (ball.x <= 0 || ball.x >= W) {
                    ball.vx *= -1;
                }
                if (ball.y <= 0 || ball.y >= H) {
                    ball.vy *= -1;
                }
            }
        }
        
        private function complete():void{
            var tf:TextField = new TextField();
            tf.autoSize = "left";
            tf.text = "YOUR SCORE : " + ballCnt;
            tf.scaleX = tf.scaleY = 3;
            tf.x = W / 2 - tf.width / 2;
            tf.y = H / 2 - tf.height;
            addChild(tf);
            
            var button:TextField = new TextField();
            button.background = true;
            button.backgroundColor = 0xcccccc;
            button.autoSize = "left";
            button.selectable = false;
            button.text = "twitterに投稿";
            button.scaleX = button.scaleY = 2;
            button.x = W / 2 - button.width / 2;
            button.y = H / 2;
            button.addEventListener(MouseEvent.CLICK, function():void {
                navigateToURL(new URLRequest("http://twitter.com/?status=Easy Benchmark SCORE : "+ballCnt+" http://bit.ly/a6B5Er %23wonderfl"));
            });
            addChild(button);
            
        }
        
        private function updateFrame():void {
            frameCnt++;
            if (getTimer() - oldTimer >= 1000) {
                frameRates[index] = frameCnt;
                index = ++index % 10;
                ave = average.apply(null, frameRates);
                txtFrameCnt.text = "fps : " + frameCnt + "/" + stage.frameRate + "\nave : " + ave;
                frameCnt = 0;
                oldTimer = getTimer();
            }            
        }
        
        private function average(... rest):Number {
            var sum:Number = 0;
            for each(var n:Number in rest) sum += n;
            return sum / rest.length;
        }
        
        private function randomRange(max:Number, min:Number):Number {
            return Math.random()*(max - min) + min;
        }
        
    }
    
}

class Ball {
    public var x:Number;
    public var y:Number;
    public var vx:Number;
    public var vy:Number;
    
    public function Ball(vx:Number, vy:Number) {
        this.vx = vx;
        this.vy = vy;
    }
}