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 から容易に扱えるようになっています。
こちらも後ほど試してみたいと思っています。