AS3のBitmapDataの通常矩形描画手法をいろいろ計ってみた。32x32のBitmapDataを10000回ループで描画して調査。
結果(PentiumM 1.1GHzにて)
- copyPixels:104 (ms)
- getPixel/setPixel:3551 (ms)
- getPixels/setPixels:1578 (ms)
- draw:426 (ms)
ソース:http://highfreq.net/dev/speedtest.zip
これからわかること
- drawはcopyPixelsの約4倍遅い
- getPixelで1px毎に描画するのは絶望的に遅い(まあ当たり前か)
- どうしても1px毎の描画が必要な場合は、あらかじめgetPixelsで全領域を取得しておいて、そのByteArrayに対して操作し、最後にsetPixelsで上書きする。
- 回転処理はcopyPixelsで部分領域を取得したあとにdrawがいい
まあdrawはネイティブコードだと思うから、AS上で動かすよりは速いってのは当たり前だよなー。自前描画はよほどのことがない限りしないほうがいいかも。
試したソースが前エントリのライブラリを使ってるからオーバーヘッドも結構あるけど、そこまで極端に変わるもんじゃないと思う。
ところで10000回ループでこの速度ってことは、1/60フレーム中にcopyPixelsなら約1600回、drawなら約400回描画が可能という計算になる。まあ実際はロジック部分が入るからそうはいかないけど。20x15(+1x1)マップチップの描画は大体336回=3.36msかかるという計算。なかなか厳しい気がする。30フレームが無難か。