- 2008年8月22日 01:06
- ActionScript 3.0 | Flash
今現在徹夜で資料作ってて、行き詰まってきたもんだから
ふとなんと無しにその辺のAS3.0の本読んだら
今まで自分、相当損してたことに気がついた。気がついてしまったんです。
まあ、損というより無駄な労力。
でもその労力は実は無駄にしないほうがいい・・・かも
今日はそんなお話です。
ふとなんと無しにその辺のAS3.0の本読んだら
今まで自分、相当損してたことに気がついた。気がついてしまったんです。
まあ、損というより無駄な労力。
でもその労力は実は無駄にしないほうがいい・・・かも
今日はそんなお話です。
どういう話かといいますと
円グラフ作るときとかにけっこう下記のようなことやってたんですよ
// 半径を定義
var radius:uint = 20;
// 描画
graphics.moveTo( 0, 0 );
for( var i:uint = 0; i < 360; i++ ){
var radian:Number = i * Math.PI / 180;
graphics.lineTo(
radius * Math.cos( radian ),
radius * Math.sin( radian )
);
}
でもこれってよく考えたら 毎回 Math.cos とか書かなくても
// 半径を定義
var radius:uint = 20;
// 描画
graphics.moveTo( 0, 0 );
for( var i:uint = 0; i < 360; i++ ){
var pt:Point = Point.polar( radius, i * Math.PI / 180 );
graphics.lineTo( pt.x, pt.y );
}
でええわけですよ。
別にたいした差は無いじゃないか、記事にすることか?という方もいるでしょう
ええ、まあ記事かいてて僕もそう思いましたよw
でも、若干有益な情報を書くので許してください
転んでもタダでは起きません。毎度おなじみ速度検証を行いました。
方法は、Math を使う前者と Point.polar を使う後者で
半径20pxの円を1000個作るのに何ミリ秒かかるかを調べるというものです。
結果は・・・
-----------------------------------------------------------------------------
■ Math で普通に計算した場合
375 ミリ秒
■ Point.polar を用いた場合
828 ミリ秒
-----------------------------------------------------------------------------
でました。ダブルスコアですよ。
まあだいたい予想はついてたけども、まさかここまで遅いとは思わなかった
どっちかっつーとPoint自体がそこまで早くないのかも
Point は便利だけどむやみやたらに使わんほうがいいかもという感じ?
ちなみに試してみたい方は以下のコードをタイムラインに書いて実行です
var radius:uint = 20;
var now:Number;
graphics.clear();
now = new Date().getTime();
for( var ii:uint = 0; ii < 1000; ii++ ){
graphics.beginFill(0x000000);
graphics.moveTo( 30*ii, 100 );
for( var i:uint = 0; i < 360; i++ ){
var pt:Point = Point.polar( radius, i * Math.PI / 180 );
graphics.lineTo( pt.x + ( 30 * ii ), pt.y + 100 );
}
graphics.endFill();
}
trace("Point.polar を用いた場合 : " + ( new Date().getTime() - now ) + " ミリ秒");
graphics.clear();
now = new Date().getTime();
for( var jj:uint = 0; jj < 1000; jj++ ){
graphics.beginFill(0x000000);
graphics.moveTo( 30*jj, 100 );
for( var j:uint = 0; j < 360; j++ ){
var radian:Number = j * Math.PI / 180;
graphics.lineTo( radius * Math.cos( radian ) + ( 30*jj ), radius * Math.sin( radian ) + 100 );
}
graphics.endFill();
}
trace("Math で普通に計算した場合 : " + ( new Date().getTime() - now ) + " ミリ秒");
さて、仕事の続きをせねば・・・
- Newer: AS3.0 Bitmap処理を思い出すの面倒だからまとめておく
- Older: AS3.0 setTimeoutのスコープではまった