Easy Benchmark with Shape
簡易ベンチマークShapeバージョンです。
ランダムな速度で動くボールを毎フレームごとに10個ずつ追加していき、
直近10秒の平均fpsが10以下になった時点のボールの数をスコアとします。
スコアが出るまで少し時間がかかります。
ちょっと待ってね just a moment!
/*
簡易ベンチマークShapeバージョンです。
ランダムな速度で動くボールを毎フレームごとに10個ずつ追加していき、
直近10秒の平均fpsが10以下になった時点のボールの数をスコアとします。
スコアが出るまで少し時間がかかります。
ちょっと待ってね just a moment!
*/
package {
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.events.MouseEvent;
import flash.net.navigateToURL;
import flash.net.URLRequest;
import flash.text.TextField;
import flash.utils.getTimer;
[SWF(frameRate=60)]
public class EasyBenchmark extends Sprite {
private const W:int = 465;
private const H:int = 465;
private const LIMIT:int = 10;
private const BALLS:int = 10;
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 canvas:Sprite;
public function EasyBenchmark():void {
stage.align = StageAlign.TOP_LEFT;
stage.scaleMode = StageScaleMode.NO_SCALE;
canvas = new Sprite();
addChild(canvas);
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 <= LIMIT) {
removeEventListener(Event.ENTER_FRAME, update);
complete();
return;
}
for (var i:int = 0; i < BALLS; 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++;
canvas.addChild(ball);
}
txtBallCnt.text = "score : " + ballCnt;
for each(ball in balls) {
ball.x += ball.vx;
ball.y += ball.vy;
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 with Shape SCORE : "+ballCnt+" http://wonderfl.net/c/rFdY %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;
}
}
}
import flash.display.Shape;
class Ball extends Shape{
public var vx:Number;
public var vy:Number;
public function Ball(vx:Number, vy:Number) {
this.vx = vx;
this.vy = vy;
this.graphics.beginFill(Math.random() * 0xffffff, 0.5);
this.graphics.drawCircle(0, 0, 2);
this.graphics.endFill();
}
}