Unityが発行するeBook"Optimize Your Mobile Game Performance"の読み解き企画、前回のProject Configuration編に引き続き、今回はAssets編です。
多種多様なアセットが組み合わされてゲームは作られているので、アセットをどう扱うかは、Unityを使う上でも重要なテーマになっていると思います。それでは行ってみましょう!
Assets
アセット・パイプラインは、アプリケーションのパフォーマンスに劇的な影響を与える可能性があります。
熟練のテクニカルアーティストは、あなたのチームがアセットのフォーマット、仕様、インポート設定を定義、運用できるように手助けしてくれます。
デフォルト設定に頼らないでください。プラットフォーム毎のオーバーライド設定タブを使って、テクスチャやメッシュなどのアセットを最適化しましょう。
不適切な設定は、ビルドサイズを肥大化させたり、ビルド時間を長くしたり、メモリを圧迫したり、ということを引き起こしかねません。
プロジェクトに適した設定にするために、基準となる設定のカスタマイズに役立つプリセット機能を使うことを検討してください。
アセットのインポートに関してのガイド、やUnity Learnにおける3D Art Optimization for Mobile Applicationを確認しましょう。
テクスチャを正しくインポートする
あなたのメモリのほとんどはテクスチャに使われることになります。なので、インポート設定は非常に重要です。一般的に次のようなガイドラインに従いましょう。
・最大サイズを下げる
視覚的に耐えうる最低限の設定を使おう。これは非破壊設定で、素早くメモリサイズを減らすことが出来ます。
・POT(2のべき乗)を使う
Unityはモバイル用のテクスチャ圧縮設定のために、テクスチャの解像度が2のべき乗であることが必要です。
・テクスチャのアトラス化
複数のテクスチャを一つのテクスチャにまとめることで、ドローコールを減らし、処理スピードを上げることが出来ます。Unity SpriteAtlasやTexture Packerを使おう。
・Read/Write enabledを無効化
これが有効な時、このオプションはCPUとGPUどちらメモリにもコピーを置いて、データを重複させてしまいます。
多くの場合、これを無効化するようにしてください。ランタイム中にテクスチャを作成する場合、Texture.Applyで、makeNoLongerReadableをtrueにするようにしてください。
・必要のないミップマップの無効化
2DスプライトやUIグラフィックのようなスクリーン上で一定のサイズを保つテクスチャにミップマップは必要ありません。
(カメラとの距離が変わる3Dモデルについてはミップマップを有効にしたままにしましょう)
テクスチャを圧縮する
同じテクスチャとモデルを使った次の二つの例を見てください。
左側の設定は右側よりも約8倍もメモリを使っているのに、視覚的なクオリティの違いがほとんどありません。
Adaptive Scalable Texture Compression(ATSC)をAndroidとiOS上で使いましょう。開発中のゲームの大多数は、ATSCフォーマットをサポートしている最小スペックのデバイスをターゲットにしています。
数少ない例外は・・・
A7デバイスとそれより古い世代(iPhone5, 5Sなど)のiOSゲームはPVRTCを使う
2016年以前のAndroidゲームはETC2(Ericsson Texture Compression)を使う
もしPVRTCやETCの圧縮品質が十分ではない場合、目標のデバイスがASTCを完全サポートしていない場合、32bitテクスチャではなく、16bitテクスチャを使うことを試してみましょう。
Recommended texture compression format by platformは更なる情報が掛かれたマニュアルです。
メッシュのインポート設定を適切に
テクスチャとほとんど同様に、メッシュも気をつけてインポートしないとメモリを無駄に消費してしまう可能性があります。メッシュによるメモリ消費を最小化するために・・・
・メッシュを圧縮する
積極的な圧縮はディスクの容量を減らします。(ただし、実行時のメモリには影響ありません)メッシュのクオンタイゼーションは、不正確さを引き起こす場合があるため、実際にどのように機能するかを結果を見ながら試してみましょう。
・Read/Writeを無効化
このオプションを有効化すると、メモリのメッシュを複製して、ひとつをシステムメモリーに保存して、もうひとつはGPUメモリに置くようになります。多くの場合、これは無効化するべきです。(2019.2から以前のUnityでは、デフォルトでオンになってしまっています)
・リグとブレンドシェイプを無効化
もし、そのメッシュに骨格やブレンドシェイプ・アニメが必要ない場合、可能な限り無効化しましょう。
・法線とタンジェントを無効化しよう
もし、法線やタンジェントをマテリアルが使わない、ということが確実ならば、これらの項目を無効にしましょう。
ポリゴン数をチェックしよう
高解像度のモデルはつまり、より多くメモリを消費し、より長いGPU処理時間が掛かる、ということを意味します。
背景のジオメトリに50万ポリゴンも必要でしょうか?あなたの選択したデジタル・ツールでモデルを削減することを考えてみてください。カメラから見えないポリゴンを削除しましょう。
高密度なメッシュの代わりに、細かい部分を表現するのにテクスチャと法線マップを使いましょう。
AssetPostprocessorを使ってインポート設定を自動化
AssetPostprocessorでアセットをインポートする時にスクリプトを実行することが出来ます。これにより、モデルやテクスチャ、オーディオ、あるいはそれ以外をインポートする前、した後の設定をカスタマイズすることが出来るようになります。
Addressable Asset Systemを使う
Addressable Asset Systemによって、”アドレス”やアライアスでアセットバンドルをロードしたり、コンテンツを管理するのが単純化されます。
この統一されたシステムによって、各々のローカル・パスからロードしたり、content delivery networkをリモートします。
もし、モデルやテクスチャ、プレハブといった非コード・アセットをアセットバンドルに分けた場合、それらをダウンロードコンテンツとして、分離することが出来ます。
そして、よりサイズの小さな基礎ビルドを作るためにAddressableを使いましょう。Cloud Content Deliveryでゲームの進行度に従って、プレイヤー達にゲームコンテンツを配信することが可能になります。
Addressable Asset Systemで、どのようにしてアセット管理の苦痛を取り除くことが出来るのか、Simplify Your Content Management With Addressableを読みましょう。
というわけでAssets編でした。ゲーム制作においても目立たない、細かい部分ではありますが、きっちりと押さえておきたい内容だったと思います。
これで本書のおおよそ半分の内容について扱ったことになります。ほぼほぼ翻訳みたいな形になってきてしまっていますが、それだけ省く内容が少ない良書、だということだと思うので、まだ時間が掛かりますが全ての章を見ていきたいです。
次回はGraphics and GPU optimization編になります。