夏までにiPhone アプリつくってみっか!

趣味でiPhone/Androidアプリを開発し、日々勉強した事を書いています。オープンワールド系レースゲームをUnityで開発中です。

PVRTC4形式でテクスチャーを圧縮してメモリ使用量とアプリサイズを大幅削減

ゲーム用のテクスチャアトラスの作成にTexturePackerというツールを愛用しています。
これまでテクスチャフォーマットは.png, イメージフォーマットにはRGBA8888という形式を使っていました。
この設定だとテクスチャのクオリティは最高なのですが、実行時のメモリ容量をかなり喰ってしまうようです。

f:id:takujidev:20140725204414j:plain

1面のデータを読み込んだ状態で75.2MB喰っています。
また、アプリのサイズは27.6MBです。

現在開発中のゲームでは、面が進む毎に新しい面のテクスチャーファイルを読み込み、前の面のテクスチャデータは破棄するつもりだったので、これまでメモリ使用量はあまり気にしていませんでした。
しかし、面切り替えの処理をテストしてみると1フレームも落とさずにデータを読み込むのはなかなか難しい事がわかりました。テクスチャの裏読みを試してみましたが、裏読みした新しいテクスチャーを初めてを使うときに明らかに止まっているのがわかるくらいの時間フレームを落としてしまいます。

このフレーム落ちをどうやっても直す事が出来なかったので、全てのテクスチャーをゲーム開始時にメモリに読み込むように方針を変更しました。
そうなるとメモリをあまり使わないように工夫する必要があります。

そこで、テクスチャの圧縮方式をPVRTCに変更し、メモリの節約を行ってみました。

TexturePackerのテクスチャフォーマットを.pvr.ccz、イメージフォーマットをPVRTC4に設定すればOKです。また、プリマルチプライアルファをチェックします。
TexturePackerの使い方はここを参考にさせて頂きました。
この設定をするだけでテクスチャが使用するメモリを1/8に削減できます。

早速メモリ使用量を計測してみます。
f:id:takujidev:20140725211113j:plain
31.2MBと、44MBも節約できました。
アプリのサイズは17.4MBと、約10MBの削減となりました。

最終的に何面まで作るかは決めていませんが、全テクスチャデータをメモリに常駐させても問題はなさそうな感じです。

気になるのは画像の品質です。
iPhoneの画面でゲームをしている限りは全くRGBA8888とPVRTC4の違いがわかりません。
しかし、スクリーンショットを撮って拡大してみると・・・

RGBA8888
f:id:takujidev:20140725214250p:plain

PVRTC4
f:id:takujidev:20140725214318p:plain

PVRTC4ではキャラクターの周囲がもわっと滲んだ感じにぼけているのがわかります。
しかしゲームプレイ環境で気にならなければOKなので、私はPVRTC4で行きたいと思います。

あと犠牲にしなければならない事がもう一つありました。
TexturePackerでのテクスチャアトラスを書き出す時間がかなり長くなります。

.pngファイルを書き出すのに6秒だったのが.pvr.cczだと53秒になってしまいました。

MacBook Procore i7がフル稼働してCPU負荷が800%でこの時間です。
かなり重い処理なのでしょう。
https://itunes.apple.com/jp/app/travelshooting-jp-toraberushutingu/id917570972?mt=8&uo=4&at=10laCt
https://itunes.apple.com/jp/app/beecluster-wu-liaono-zongsukurorushutingugemu/id663801586?mt=8&uo=4&at=10laCt