ひつじのにっき

mhidakaのにっきです。たまに長文、気が向いたとき更新。

【AN-5】Android でリアルタイムゲームを開発する方法:リベンジ - クリス プルエット

Androidでのゲーム開発手法、プランニング、Android Marketなどの説明です。
クリスのAndroidゲーム「ワンダのレプリカ島」をリリースしてから参考になったことを含めてセッションで話したい。"楽しいゲームには「革新」より「面白さ」のほうが大事である"

開発者の気になるポイント

  • 端末の種類が多いこと。
  • パフォーマンスが出ないと困るのがゲーム。

それぞれの端末への対応は?と心配になることが多い。

今までのAndroidは2つの世代に分かれる。

第1世代と第2世代

  • 第1世代:HT-03A,CPU 400MHz,MSM7200Aなどが多い。グラフィックスはOpenGL ES1.0
  • 第2世代:Xperia,CPU 1GHz,Snapdragon/OMAP3など。グラフィックスはOpenGL ES2.0


→第2世代では30FPS以内で3万頂点を描画できる程度の処理能力。

端末の特徴

インプットが豊富:トラックボール十字キー、キーボード、マルチタッチ、すべて使える
Android十字キーがなくても、インプットは成り立つ。

OpenGL

テクスチャフォーマットは端末によって変わる。
クアルコムのCPUはATITCに対応しているが、PVRTCは非対応など端末差がある。
第2世代はETC1が全端末で利用可能なのでお勧め。ただしアルファブレンディングは対応していない。
AndroidでのOpenGL ESのバージョンは1.0と2.0系に分類される

現在のAndroid端末のバージョン分布

  • Android 2.2が3割、2.1が4割、Android 1.xが残り3割
  • OpenGL2.0やマルチタッチAPIがほしいときはAndroid 2.0以上がターゲットになる

Android端末のパフォーマンスを高める方法

Android用のベンチマークソフト

30FPSを下回ると、ユーザが反応遅いと感じてしまう。

Xperiaは画面描画に同期が入っているため、30FPSで固定されている。
30FPSを守ろうとすると処理限界は大体3万頂点程度。

LODの価値


Level of Detailのこと。視点からの距離に応じて描画する。
遠くのものほど簡単に描画ことで描画コストを稼ぐ技術。手前に細かく、後ろは粗くなる。

Vertex Buffer Object(VBO)


VBOは、通常のメモリではなくビデオメモリ(VRAM)にテクスチャを保存。
GPUのそばに描画資源をおくので、転送に時間がかからない。実測でスピード向上率は3割を超える。
一般的にOpenGLはState変更が時間がかかる。VBOは必ず使ったほうがいいが、VBO数を減らす努力を。

浮動小数点数の頂点を利用

テクスチャコンプレッション(テクスチャーに必要なメモリーの使用量および帯域幅を削減するという手法)なら
テクスチャフォーマットはETC1を使う。
2DならOpenGLのdraw_textureエクステンションを使えば高速。
いずれも30FPSを切らずに遊べるようにプランニングすることが大事。

  • 第1世代から第2世代まで対応するならランタイムでスケールさせる。判定にはGL_EXTENSIONが役に立つ
  • 第2世代のみの端末専用ゲームならOpenGL ES2.0を利用すればOK

スレッド分割


処理の効率化を図る上でスレッド分割が不可欠。
ActivityをGameThreadとRenderingThreadに分割する。
XperiaだとRenderingThreadが描画命令発行後、32msは帰ってこない。

GLSurfaceViewを使うのがとても簡単。


NDKを使ってもよい。重いコードはC/C++に移植してしまえば高速化できる

EGL Context And Pausing

環境依存の部分をまとめたインターフェイスがEGL。
OpenGL ES自体は環境に依存しない標準APIの集まりなので、環境依存の部分を集めておく。
EGLのContextを失うタイミングがあり、それは新たなActivityの生成時である。
しばらくしてから元のゲームに戻るとVRAMが初期化されてしまう、といった問題が発生する。
「ワンダのレプリカ島」では、キャラクターの会話するウィンドウ(TextBox)を別のActivity化している。
人がしゃべるタイミングでVRAMが解放されてしまうと困るので、
GLSurfaceViewを細工してVRAMを解放しないようにした。

プランニング

ワンダのレプリカ島の最初の4カ月、100日で100万ダウンロード
一番大事なのが操作システムのセッティングが必要ということ。
ユーザの好み、操作感が大切。変更ができるように、柔軟な設計を。
→ Input Interfaceを用意して変換するなど新しいインターフェイスを定義した。

(Input Interfaceを追加した図)

開発のためのエディタなどPHPJavaで作ったがマップ作成などが面倒。
今回は"クソコード"(会場笑い)なマップエディタなどでやり過ごすことができたが…
悩ましい部分。

ユーザデータの活用

プレイヤーデータは取得したほうがいい。アクションゲームであればユーザ死亡位置などが解析に役立つ

デスマップの紹介(死んだ位置が分かる)
ユーザデータを収集することで一目瞭然。難易度調整など容易になる。

最適化手法

最適化のためにでは、アプリケーションの中にWebサーバーを作成した。
USB経由でPCとつながり、PCのほうではPC側のPortアクセスを転送する。
AndroidのWebServerの中では文字列を受け取ることができ、それらStringデータはソースコードを記述する。
グラフィックス制御に関するダイナミックなコンパイル(OpenGLの機能)が行えるので、
サーバー用途じゃないけど追加した。いつでも設定変更→反映画面の確認ができるようになってとても便利。


WebServerからコードを書き換えられる
Android以外では非常に困難なデバッグ・調整方法ではないか。

Android Marketについて

楽しいゲームには「革新」より「面白さ」のほうが大事である。
何がおもしろいのか、よく考えること。

AndroidMarketのゲームダウンロード数
ゲームはAndroidユーザが一番興味がある分野。ユーザランキングでも第2位。