フラッシュを作ってる人へ豆知識(FLASH MX 2004)
AS2.0の処理をほんのちょっとだけだけど軽くするための豆知識です。
Math.floor()っていう関数がありますよね? 小数点以下を切り捨てる関数なんですけども、私はよくMath.random()と組み合わせて使っています。
mc.gotoAndPlay(Math.floor(Math.random() * mc.totalframes));
なんていう感じでランダムな数値をgotoAndPlayやswicthに入れる時に使ってます。
でもこれをちょっと書き換えると、ほんのちょっとだけ処理を軽くする事ができます。
mc.gotoAndPlay((Math.random() * mc.totalframes) >> 0);
上記のように0ビットシフトさせるんです。
これだけで小数点を切り捨てる事ができます。四捨五入したい場合は+0.5、切り上げたい場合は+1したりすると応用できます。
で、これがどれくらい効果があるのかというと
var time:Number = getTimer();
var tmp:Number;
for(i=0; i<1000; i++) {
tmp = Math.floor(Math.random * 100));
}
trace(getTimer() - time);
var time:Number = getTimer();
var tmp:Number;
for(i=0; i<1000; i++) {
tmp = (Math.random * 100) >> 0;
}
trace(getTimer() - time);
上記の(1)と(2)でforループを抜け出すまでの時間をtraceすると、
(1)平均 24 ms
(2)平均 15 ms
私のCPU(Intel(R) Pentium(R) 4 CPU 2.60GHz Hyper-Threading)では、0ビットシフトの方がMath.floorより平均 9 ミリ秒(0.009秒)早くなりました。
処理効率で考えると約60%早くなります。
まぁMath.floorに処理を奪われてfpsが下がるとかっていう事は滅多にないとは思いますが…
しかし演出が派手で高いfpsのゲームを作っていれば、処理を1ミリ秒でも早くするために心血を注ぐ人って結構いると思います。
私はO型で大雑把な性格なんですが、なぜかこういうチマチマした軽量化が大好きでこういう事ばっかり勉強しています…w
copyright 2007 yasurageruheya All Rights Reserved.