日別アーカイブ: 2011年10月25日

Android 3.x 描画 API の比較

Canvas など Android の画面は CPU でレンダリングされています。
画面全体を常に書き換えているアプリは、解像度が上がるほど速度が
落ちていく可能性があります。

SurfaceView を使ったゲームアプリなど、スマートフォンではスムーズに
動いていたのに Tablet では極端に遅くなることがありました。
最近はスマートフォンの解像度も HD 化しており、Tablet と同じくらい
描画が負担になっていると考えられます。

大画面前提の Tablet 向け Android 3.x では 2.x と比べて色々と改良が
施されているようです。
その一つが 2D 描画のハードウェアアクセラレーションです。

使えるコマンドは限られますが Canvas のレンダリングも GPU による描画が
行われます。AndroidManifest.xml に android:hardwareAccelerated=”true”
を追加するだけです。

Optimus Pad L-06C (Tegra 250) Android 3.1

View(SW)         15.0fps      24x24 x  1600個   13.8Mpix/sec
View(HW)         27.8fps      24x24 x  1600個   25.6Mpix/sec
SurfaceView      16.3fps      24x24 x  1600個   15.0Mpix/sec
GLSurfaceView    12.8fps      24x24 x 30000個  221.2Mpix/sec
GLSurfaceView    20.6fps      12x12 x 50000個  148.3Mpix/sec

256×256 pixel のテクスチャ画像から 24×24 pixel を切り出して、
24×24 dot の小さい正方形として描画します。
これを 1600個、ばらばらに動かしています。

SurfaceView ではハードウエアアクセラレーションが有効とならなかったため
速度が逆転しています。HW が有効なら View + onDraw() の方が高速に
描画できています。

それでも OpenGL とは比較になりません。

GLSurfaceView は Java 上で OpenGL ES 2.0 を利用しています。
速すぎて 1600個では測定出来なかったため 30000個に増やしています。
当然かもしれませんがゲームは OpenGL を使った方がよさそうです。

以下 Android 2.3 との比較。

                    View(SW)  View(HW)  SurfaceView  GLSurfaceView
            OS      x1600     x1600     x1600        x30000
------------------------------------------------------------------
OptimusPad  A3.1    15.0fps   27.8fps   16.3fps      12.8fps
HTC EVO 3D  A2.3    20.2fps   --        26.4fps      16.5fps
Galaxy S2   A2.3    31.8fps   --        44.8fps      28.1fps

今後登場する Android 4.0 (Ice Cream Sandwich) では、スマートフォンも
GPU による描画に対応します。
1280×720 など画面解像度が高い機種ほど 2.3→4.0 の差が大きいかもしれません。

Android 3.x には他にも RenderScript があります。
NDK + OpenGL ES の上位ライブラリに近く、機能が限られる代わりに
Java から容易に扱えるようになっています。
こちらも後ほど試してみたいと思っています。