GDD2010:Android でリアルタイムゲームを開発する方法: リベンジ

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

クリスさん
  • 「ワンダのレプリカ島」というゲームを開発
端末の種類
  • ゲームアプリは、パフォーマンスが気になる。端末重要。
    • 端末が多くなると、対応が難しいのではないか?
      • 端末の種類が多いが、大きく分けると2つの世代に分かれる。

   第1世代(古い端末)HT-03A相当
    だいたいQualcommMSM7200A 400MHzぐらい
    HVGA
    OpenGLES1.0
    30ヘルツないに5000頂点
    60ヘルツで1024頂点は問題ない

   第2世代
     500-1000MHz
     OpenGL2.0
      2.0になるとシェダーが使える
      ハードウェア補助
     WVGA
     30ヘルツ 3万頂点
     30ヘルツを超えられない端末も存在。

端末の特徴
  • 画面サイズ、解像度
  • インプット機能
    • トラックボール十字キー、キーボード、マルチタッチ
    • API的に対応しやすい
      • モーションイベントかキーイベントでくるので、
      • 比較的簡単に全端末対応できる。
  • OpenGL
    • テクスチャフォーマット:ATITC? PVRTC? ETC1?
      • 端末によって対応が違う
      • ほとんどのテクスチャはETC1で対応してるのでお勧め
    • OpenGLバージョン
      • AndroidのManifestで記述できるので、対応してない端末をはじける
    • GL_EXTENSIONS
      • OpenGLのバージョンによって機能を増やす方法。
      • ランタイムに確認できる。
Android端末のバージョン
  • ほとんどが2.1か2.2
  • マルチタッチ(2.1〜)などの機能要件によって、対応バージョンが決まる。
  • 1.6から画面サイズ対応
  • クリスさんのゲームは、1.5ベースで開発して、全バージョンに対応するのはそれほど難しくなかった。
  • HightMap Profiler
    • レンダリングにかかった時間などをプロファイルできる。
    • プロファイルでベンチマークとった
      • HT-03Aは頂点の数が増えるほど描画に時間がかかってくる
      • 秒間、30フレームを確保できないと、ゲームとしてはストレスを感じる
      • Xperiaはどんなに描画しても、画面のSyncにあわせて表示しているので、頂点の数が変わってもパフォーマンスがかわらない。ただし、30ヘルツを超えることができない。
LODの価値
  • 奥のものを簡単に描画するテクニック
  • 描画数を大幅に減らせるので、パフォーマンスを稼げる。
  • ゲーム会社は普通に使ってる技。
  • かなりきれいな画面が作れるはず。
パフォーマンスを高める方法
  • ★必ずVBOを利用
    • パフォーマンスが大きく上がる。
  • VBOの数を減らす
  • テクスチャコンプレッションならETC1
  • 2DならOpenGLのdraw_textureエクステンション
  • 30ヘルツで遊べるようにプランニング
  • 第一世代端末から第2世代端末までランタイムでスケール
    • GL_EXTENSIONSは役立つ
  • 第2世代のみの端末を狙うゲームならGLES2.0を利用
"ワンダ"の実装事例
  • キャラクスクリプトは draw_textureを利用
  • タイルをひとつのVBOからタイルのスキャンラインにした。
  • 2つのスレッドの仕組み
    • ゲームスレッドで当たり判定、操作を担当
    • レンダリングスレッドで描画に集中
      • Xperiaなどは、描画APIをたたいてから帰ってくるのに30ms絶対かかるので、CPUパワーを有効活用できる。
  • GLSurfaceViewが便利
  • NDKで高速化
  • アプリがポーズしたときの対策
    • ゲーム中にRAMがクリアされたときの対策が必要
    • 中断してほしくない場面は、GLSurfaceViewをいじって復帰対策をした。
学んだこと
  • 操作設定は必要
    • キーコンフィグレーション
      • 端末ごとについてるボタンが違うので、これをつけると好評だった。
      • 最初から考慮しておかないと、あとからつけるのは大変だと思う。
  • InputSystemを、InputInterfaceクラスと分離することで、設定を分離した。
    • ゲーム側のコードを変えずに入力の幅を広げられる
  • これって面白いだろうか?
    • プレイヤーが死んだポイントで、サーバーにデータを送る仕組みを入れた。
    • プレイヤーが死んでるところをマッピングすると、難しい箇所がわかるようになった。
    • 20万人ぐらいのデータをとったら面白い。
    • Androidはサーバーにデータを送るのはすごく簡単!
  • Webサーバーをつけた
    • デザインをちょこっと変えたいときに、シェーダーのデータを流し込めるようにする。
ゲームを作るにあたって
  • ”楽しいゲームには「革新」より「面白さ」のほうが大事”
    • Jonathan Blow, author of Braid
Androidマーケット上のゲームダウンロード回数
  • 5月からゲームのダウンロード回数が大幅に増えた
    • ダウンロードラインキングは全ジャンル中2位
    • Androidユーザーの一番関心があるのがゲーム。
    • Liteバージョンがほとんどの場合用意してある。
Useful Links
  • SpriteMethodTest HightMapProfiler
  • http;//replicaisland.net