nazolabo

フリーランスのWebエンジニアが近況や思ったことを発信しています。

AS3のBitmapData描画速度比較

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フレームが無難か。