日本Androidの会2009年5月(11日)のイベント、
株式会社タイトー山田俊一様の発表資料「Android Game Programing Tips」の中で興味深い内容がありました。
アーケード・コンシューマは30fps or 60fps
携帯アプリは10~30fps
傍目に見てカクカクが目立つのは8fps 以下
TVアニメは24fpsで製作
※同資料の3ページ目から引用タッチパネル
・重い!激重!
※同資料の13ページ目から引用
fpsというのは、Frame Per Secondのことで、1秒間にどれだけのループ(フレーム描画)処理できているかという指標で、
例えば、10fpsだと、1秒間に10フレーム描画できているということで、1フレームあたり100ミリ秒で処理できていることになります。
では、いったいAndroidの実機では、どんなもんだろう?ということで、私の方でも実際に試してみました。
試してみた環境は、
「Android Dev Phone1(1.5Firmware)」
+
「Android 1.5 SDKサンプルのApiDemos - Graphics - OpenGL ES - Sprite Text」
です。
このサンプルは、OpenGL ESのサンプルであり、実行してみると、
下図のように、三角形のテクスチャとテキストが、フレーム毎に回転描画され、
加えて、1フレームあたりの処理時間もミリ秒(ms/f)で表示されます。
端末を操作しない状態では、瞬間的に17ms/fが表示されることもありましたが、
平均すると、下図キャプチャのように、23ms/f前後でした(このサンプルでの話)。
![]()
ms/fの算出方法としては、
最初のフレーム描画後のシステム時間と、12フレーム描画した後のシステム時間との差分を、12で割ることで算出しています。
この12というのは、適当なサンプル間隔であり、
値が小さいと、結果にばらつきが生じますし、値が大きいほど、結果は正確になりますが、収集に時間がかるため、フィードバックが遅くなる、
ということで、12は、その中間の「ほど良い値」といったところでしょうか。
また、このサンプルでは、ms/fという記事冒頭のfpsとは単位が異なるので、
ソースコードを修正して、fps表示してみました。
ms/f から fps(f/s) への変換は単純で、y[f/s] = 1000[ms/s] / x[ms/f] で算出でき、このサンプルだと、だいたい43fps前後でした。
参考までに、修正したソースコードの箇所は、ApiDemos\src\com\example\android\apis\graphics\spritetext\SpriteTextRenderer.java
の、drawMsPF()でms/fを計算している箇所と、onSurfaceCreated()で"ms/f"単位表示している箇所だけです。
ちなみに、このサンプルで画面をタッチ操作してみると、システムがタッチ処理に応答してしまうためか、描画が遅くなり、
冒頭資料の描画表現でいうところの「カクカク」、「タッチパネル激重」につながります。
※この時、このサンプルのms/f(修正したfps)表示では、ms/fが小さい値(fpsは大きい値)というように、
逆にパフォーマンスが良い値となってしまうので、このあたりは修正の余地がありそうです。。。
最後になりますが、セミナーの予習として、以下のまとめ記事をアップしていましたので、参考になれば幸いです。
→「Androidゲームプログラミングの情報源は - 逆引きAndroid入門」
