Androidでアクションゲームを作る!?

Androidでアクションゲームなどの「動きの激しい」ゲームを作る際には、どうしても、パフォーマンスの問題がつきまといます。

前作「SpaceDefender」は、SurfaceViewにBitmapDrawableを描画し、ゲーム画面を作りました。
今新しく作っているゲームでは、GLSurfaceViewを使ってOpenGLで画面を描画しようとしています。

手元には、実機がX06HT(HTC Desire)しかないので、これでの検証になってしまうのですが、ゲーム画面を描画しながら、ゲーム内オブジェクトを動かそうとすると、30fps程度が安定して更新可能な限界になってしまいます。

描画する画像や、描画手法を工夫することなどで、なんとかこの安定して描画可能なfpsを大きくしようと努力していたのですが、この考えを改めさせる記事がありました。

Android でリアルタイムゲームの開発方法 : Google Developer Day 2009 Japan
ワンダのレプリカ島自体は、実機を手に入れた直後に遊んでみたはずなのですが、ゲームを作る側として改めて見てみると、特にゲーム内オブジェクトの管理と描画について、非常に参考になりました。

ポイントは、

  • Androidは、マルチプロセスなので、自分のゲームがCPUを独占できるわけではない。このため、実行中何らかの原因で、CPUリソースを奪われ、パフォーマンスが低下する可能性がある。

ということです。

今までの方法では、これを考慮しないでなんとかCPUを占有しようとしていたために、安定したフレームレートが得られず、カクカクした動きになってしまっていました。
この考えを改め、

  • フレーム~フレーム間の経過時間を計測し、その時間内に何が起こるかを処理する。

とすると、いつ画面が描画されたとしても、プレーヤー側からは一連のスムーズな流れと認識されるという仕組みです。

これを実現するために、ゲーム内を3つのスレッドで構成します。

  • メインスレッド
     メインスレッドでは、UIやIOなどを処理する
  • レンダリングスレッド
     レンダリングスレッドは、設定したfpsで画面描画を行うが、フレームレートは一定でなくてもかまわない。
  • ゲームスレッド
     ゲームスレッドは、フレーム~フレーム間の経過時間を計測し、その時間内に起こる変化でゲーム内オブジェクトを更新する。

この方法でいけば、レンダリングスレッドがいつ画面更新を行っても、一定の時間経過でゲームが進行することになるという訳です。

う~ん、奥が深い。

ワンダのレプリカ島は、オープンソースとなっているので、Subversionを使って、ソースコードを取得することができます。
(svn checkout http://replicaisland.googlecode.com/svn/trunk/ replicaislandとかでOK)

Leave a Reply

This blog is kept spam free by WP-SpamFree.