画像を圧縮するのです。キャッシュを削除するのです。
プログラマの吉田です。
まじょごとブログのほうからブログを書けというプレッシャーを感じましたので心を改めてブログを書かせていただきます。
プログラマな悩みとして発信出来る情報がマニアックになってしまうというのもあるのですが、ゲーム製作の裏側ではそういう葛藤もあるのかと思ってください。
この度 まじょのおしごとの 1.5.3 をリリースさせていただきましたが、1.5.0 で大変出来の悪い状態でリリースをしてしまったため、開いた瞬間に落ちる人が続出してしまい、しっかりDAUも落ちて非常に申し訳ありませんでした。出来の悪いバージョンをリリースするとユーザーが離れていくという事が身に沁みてわかりました。何事も体験してみて成長するものですね。
さてそれをどう改善したのかというお話を今回はさせていただきます。
スマートフォンのゲーム開発でいちばんメモリを使うのは画像です。 ですのでまじょごとの1.5.2 や 1.5.3 では画像の最適化を行いました。 具体的に何を行ったかというと画像のフォーマットを Android では etc1 に、 iOSでは pvr.ccz に変更しました。 png や jpg などと比べてあまり馴染みの無い形式だと思います。
png 形式は iOS でも Android でも使えて非常に便利な画像形式なのですが、 png を使用すると画像サイズの倍以上のメモリを消費してしまいます。これは 画像を描画するハードウェアであるところの GPU の特性です。GPU にもいろいろな種類があるのですが、GPUの支援を受けることができる圧縮方式があり、それが iOS では pvr.ccz であり Android では etc1 です。
詳しく知りたい方は iOS と Android 両方公式のドキュメントがあるのでそちらを参照してください。
Using texturetool to Compress Textures
pvr.ccz への変換は texturetool、 etc1 への変換は etc1tool という公式のツールもあるのですが、 今回は TexturePacker というツールを使用しました。
TexturePacker - Create Sprite Sheets for your game!
TexturePacker を採用した理由はわざわざそれぞれに最適化したオプションを渡さなくてもわりとしっかりやってくれるからです。
TexturePacker は css sprite なども作成出来ますので、web開発者の方も頭にいれておくと良いかもしれません。
画像の圧縮に加えて画像キャッシュの削除も各所に入れました。
cocos2d-x は画像を一度読み込むとメモリ上にキャッシュしておき、二回目移行はその処理を省略して高速になってうれしいように出来ています。ですが、例えばタイトルの画像など、一度見終わってしまったらしばらく見ないであろう画像までキャッシュされてしまうとメモリを無駄に消費してしまうことになります。1.5.2 で部分的に1.5.3 でさらに多くの場面でキャッシュを削除するようにしました。
こういったことを行った結果 iOS では バトルの画面で500MB を超えている時もあったメモリ利用量が 250MB 程度になりました。pvr.ccz よりかは圧縮率が悪いので Android ではもう少し食っていると思います。
また先日不具合の報告でバトルの時に敵のおばけがちゃんと魔法陣のところまで出ないという報告をいただきましたが、おそらくキャッシュを削除してしまったがための画像の再読み込みに時間がかかってるとかで起きているんじゃないかと予想しています。「なうろーでぃんぐ」の時にキャッシュを消して直後に必要な画像を再読み込みすればいけるんじゃないかと予想していますが、僕の予想は外れる事が多いのが特徴なのでがんばって直そうと思います。
そんな感じで今後はちょこちょこ不具合を直しつつ、また新しい機能の追加をやっていくのでご期待ください。
スマホのゲーム開発は初めてでして知っていれば避けられた地雷をがんがん踏みながら進んでおります。 ノウハウもいろいろたまりましたので今後はもっと良くなっていくと思います。 圧倒的成長とは地雷を踏みまくることで為せるものですね。
まじょのおしごとだけではご飯を食べられない状態が続いておりますので、次回作の検討もしています。こちらもご期待ください。 本当に食べるのに困った場合はまたクラウドファンディングでもしますのでその際は是非是非ご協力お願いします。