Androidでゲームアプリをcanvasで作るときの注意点 その2

Androidでcanvasを使ってアプリを作ってみて感じたことをまとめてみたその2です。

前回は「canvasでもそれなりに使えるよ」という内容でしたが、今回はcanvasでは厳しくなる点がかなり見えてきたのでその辺りをまとめています。

Androidでゲームを作るときにcanvasにしようかopenGLにしようか迷っている場合は参考になるかもしれません。

 作ったアプリはこちらの「じゃんけんぱずる」です

icon_web

これは「第一回全国統一HTML5実技コンテスト」でGOLDを頂いた「じゃんけん de パズル」を改題してAndroid用に移植したものです。

 javascriptは手軽にプレイできていいのですが、やはりエフェクトや高解像度の画像、音声などいろいろと入れようとすると、モバイルのブラウザでは力不足なので作りなおしてみました。

また、一度作ったものなのでAndroidアプリ制作に慣れるにもAndroid特有の問題に集中できるのでちょうど良かったです。

 おかげさまできっちり動くものが完成し、「週アスPLUS」の「GWアプリコンテスト」で1次審査も通過しました

今回作るにあたって以下の様なことに気にかけています。

1.タブレット・ハンドサイズ両方でなるべく画像が荒れないようにする

2.なるべくエフェクトを入れる

3.Android2.x以上で動く

 結果としてこれらをすべて満たそうとすると、簡単なパズルゲームでも結構canvasでやると難しくなるな、という事がわかりました。

以下、問題点をまとめています。

 1.処理が重い

 エフェクトを入れると描画オブジェクトが多くなるので、やはりcanvasでは重くなります。まだまだ最適化の余地はあると思いますが、にしてもこの程度のパズルで遅くなるのはちょっとつらいですね。

2.キャッシュするとメモリの管理が難しくなる

 今回はタブレットからハンドサイズまで綺麗に画像を出すため、拡大縮小はbitmapではなくdrawableでやっています。しかし、ゲーム中に行うと処理が重いので、ゲームが始まった時にまず必要な画像を拡大縮小してそれをbitmapにキャッシュしています。するとどうしてもメモリの消費量が多くなってしまいます。この場合、特にタブレットのほうが画面サイズが大きいのでメモリの消費が激しく、スペックの低いハンドサイズでうまくいくのに、高スペックのタブレットではメモリ不足でアプリが落ちる、という逆転現象がおこることになってちょっと悩むことになりました。このエラーは必要のないキャッシュはなるべく消すこと、Android3以降で導入された「android:largeHeap=”true”」というフラグをマニフェストで設定するとメモリを多く確保できること、などを利用して回避することができました。しかし、Android2.xではこのフラグはないため、やもなくAndroid2.xでは画質を少し落として容量を節約しています。

 もう一つ、通常javaはガーベージコレクタが不要になったメモリを開放してくれますが、Androidでは画像についてはメモリを管理しているのがOSのため、自力でビットマップの「recycle」というメソッドを呼ばないとメモリが開放されません。これを忘れると、アプリを起動する、落とす、を何度か繰り返すと、だんだんと開放されないメモリがたまっていき、ある時突然アプリが落ちる、という厄介なバグを引き起こします。これの解決方法はBitmap.createBitmapした時やファイルから画像を読み込んだ時には、必ずアプリ停止時に開放する、そして開放したら再起動時には再び初期化することを忘れないようにすることです。

 openGLを使う場合にもこれらの問題は発生しますが、openGLはcanvasより処理が早いためキャッシュの量を減らすことができ、比較的これらの問題が起こりづらくなります。

3.Android2.xでは加算合成が使えない

 Android2.xではcanvasで加算合成が使えないようです。ゲームでは加算合成は非常に重要なエフェクトの一つなので結構痛いです。何か回避策があるのかもしれませんが、openGLでは使えるので加算合成必須ならopenGLを使うしかないかもしれません。

と、いうことで以下の様な条件がある場合はcanvasよりopenGLを使ったほうが良いようです。

 1.エフェクトなどで描画オブジェクトが多くなる場合

2.ハンドサイズからタブレットまで同じコード、画像で画像の劣化を少なくして動かしたい場合

3.Android2.xでも加算合成が使いたい場合

 とはいえ、上の条件はゲームにとって必須とは限らないため、簡単なゲームでは開発の比較的楽なcanvasは重要な選択肢であることに変わりないと思います。

 

Share

コメントする