Unityでインディゲームを作る!

Unityでのゲーム制作を目指し、それに関わる話題についてのブログ

Audio編 Unity eBook "Optimaize Your Mobile Game Performance" を読み解く

Optimize_Your_Mobile_Game_Performance

 Unityが無料で発行しているeBook "Optimize Your Mobile Game Performance"を読み解いていこう!というこの企画もいよいよ後半戦!今回はAudio編です。

 

Audio

 通常、オーディオがパフォーマンスのボトルネックになることは無いのですが、それでもメモリを節約する最適化を行うことは出来ます。

 

可能ならば、サウンド・クリップをモノラル化する

 もし、あなたが3D空間オーディオを利用している場合、サウンド・クリップをモノラル(1ch)とするか、Force To Mono設定を有効にするかしてください。

 実行時に位置情報的に使われているマルチ・チャンネルはモノ音源に押しつぶされ、これはCPUのコストを増やし、メモリも無駄使いしてしまいます。

 

出来る限り、ソース・アセットとして非圧縮のオリジナルwavファイルをインポートする

 もし、MP3やVorbisのような圧縮フォーマットを使用している場合、Unityはビルド時に音源を解凍した後で再圧縮することになります。

 この結果、二度もデータを損失する工程を経てもたらされるのが、最終的なクオリティの劣化です。

 

クリップを圧縮して、圧縮ビットレートを下げる

圧縮によって、クリップのサイズとメモリの使用率を減らそう。

・大体のサウンドにはVerbisを使う。(非ループ音源にはMP3)

 

・短くて、頻繁に使用される音源にはADPCMを使う。(足音や銃声など)

 ADPCMは非圧縮のPCMに比べると圧縮されていますが、再生時に素早くデコードされます。

 

 多くの場合、モバイル・デバイスでのサウンドエフェクトは22,050Hzであるべきです。(※おそらく周波数帯域のこと?)

 低設定を使っても、最終的なクオリティにそれほど影響は与えませんが、しかし自分の耳で判断してください。

 

適切なロード・タイプを選択しよう

クリップのサイズごとに設定は変わります。

・小さなクリップ(200KB以下)はDecompress on Loadにする。これは16bitのPCMに解凍する際にCPUとメモリに負荷を発生させるので、短い音にだけ望まれる。

 

・中くらいのクリップ(200KB以上)にはCompress in Memory

 

・大きなクリップ(BGM)はStreamingに設定する。さもなくば、一度にそのオーディオ・クリップ全体がメモリに読み込まれることになります。

 

ミュートされたAudio Sourceはメモリからアンロードする

 ミュート・ボタンを実装した時に、単純にボリュームをゼロにする、ということはしないでください。

 Audio SourceコンポーネントをDestroyすることで、メモリからアンロードすることが出来ます。これにより、プレイヤーが頻繁にオンとオフを切り替える必要が無くなります。

 


 

 というわけで、Audio編でした。オーディオ・アセットのインポート設定が良く分かっていなかったので、細かい部分ですが助かりました。

 

次回はAnimation編です。

 

User interface編 Unity eBook "Optimaize Your Mobile Game Performance" を読み解く

Optimize your mobile game performance

 Unityが無料で発行している公式eBook "Optimize Your Mobile Game Performace"の読み解き企画!今回はユーザー・インターフェイス編となります。

 

 UIは2Dレンダリングを含み、GPUは2Dレンダリングが意外と負荷になるようなので気をつけていきたい部分です。

 

User interface

 UnityUI(UGUI)は往々にしてパフォーマンス上の問題の原因となります。キャンバス(Canvas)・コンポーネントは、UI要素のためのメッシュを生成と更新、GPUに対するドローコールの発行を行います。

 この機能はとてもコストが高く、UGUIで作業する際には、各要因について把握するように気をつけてください。

 

キャンバスを分割しよう

 数千の要素を持つ、巨大な一つのキャンバスの場合、ある一つのUI要素を更新しようとするのに伴い、キャンバス全体の更新も強制され、それが潜在的にCPUスパイクを発生させます。

 

 複数キャンバスをサポートする、UGUIの能力の優位点を活用しましょう。各UI要素をそれぞれの求められる更新頻度によって分割してください。

 静的なUI要素はそれ用のキャンバスに隔離し、同時に更新される動的要素は小さめのサブ・キャンバスに置くようにしましょう。

 

 各キャンバス内の全ての要素が同じZ値、マテリアルとテクスチャを持つようにしてください。

 

見えないUI要素を隠す

 あるタイミングでしか表示されないUIがあるかもしれません。(ダメージを受けた時にのみ表示される体力バーなど)

 

 そうした見えないUIがアクティブだと、表示されていなくてもドロー・コールを使用している場合があります。

 明示的にそうした見えないUIコンポーネントを無効化し、必要になったら再アクティブ化するようにしてください。

 

 キャンバスの可視性を切れさえすればいい場合は、ゲームオブジェクトではなくキャンバス・コンポーネントを無効しましょう。これによって、メッシュと頂点の再構築を抑えられます。

 

GraphicRaycasterを制限し、Raycast Targetを無効化する

 スクリーンタッチやクリックのような入力イベントにはGraphicRaycasterコンポーネントが必要です。これはスクリーン上の各入力ポイントを巡る単純なループで、UnityのRectTransform内にそのポイントがあるかをチェックします。

 

 親ヒエラルキーにあるキャンバスにデフォルトで装着されているRaycasterは削除してください。代わりに相互作用が必要な個別のUI要素ごとにそれぞれRaycasterを装着するようにしましょう。

 また、操作が必要ない全てのUIテキストや画像のインスペクター上で、Raycast Targetの項目を無効にしてください。

 もし、UIが多くの要素を持ち複雑な場合は、こうした小さな変更の積み重ねによって、不要な計算を減らすことが出来ます。

 

Layout Groupを避ける

 Layout Groupは非効率的に更新されるので、使うならほどほどに。あなたのコンテンツが動的でないなら、完全に避けましょう。均一なレイアウトをするには、代わりにアンカーを使ってください。

 あるいは、UIをセットアップした後にLayout Groupを無効にするコードを書いてください。

 

 もし、あなたが動的な要素にLayout Group(横方向、縦方向、グリット状)を使う必要がある場合、ネストを取り除いてパフォーマンスを改善させましょう。

 

巨大なリスト表示、グリッド表示を避ける

 巨大なリスト、グリット表示はコストが高いです。数百のアイテムが並ぶ、巨大な装備品画面のようなリスト、グリッド表示を作る必要がある場合、アイテムごとにUI要素を作るかわりに、保有する小さなUI要素を再利用する、ということを考慮してください。

 スクロール・リストのサンプルを確認してみてください。

 

要素を何枚もたくさん重ねない

 多くのUI要素を重ねると、オーバー・ドローが発生します。(カードゲームにおけるカードの積み上げ、など)

 ゲーム実行時に、重ねられた要素を少数の要素、batchに統合できるようコードをカスタマイズしてください。

 

複数の解像度やアスペクト比を使う

 モバイルごとに最良の体験が得られるように、別々の違う解像度、アスペクト比を使って、UIの別バージョンを作りましょう。

 

 デバイス・シミュレーターを使って、サポートするデバイス全域に渡り、UIを確認してください。XcodeAndroid Studioを使って、ヴァーチャル・デバイスを作ることが出来ます。

 

全画面UIを使う時はその他は全て隠す

 シーン上で、ポーズ画面やスタート画面がその他全てを覆うならば、3Dシーンのカメラのレンダリングを無効にしてください。同様に、トップにあるキャンバスによって隠される背景のキャンバスも無効化しましょう。

 

 全画面UIを表示している間、60FPSも必要無いので、Application.targetFrameRateを使って、FPSを下げるということも考えてみてください。

 

カメラをワールド空間とカメラスペース・キャンバスにアサインする

 キャンバスのインスペクターにおいて、Event CameraあるいはRender Cameraの欄を空欄のままにすると、Unityにメインカメラを使わせることを強制しますが、これは不必要にコストが高いです。

 もし可能であるなら、キャンバスのRenderModeにはScreen Space - Overlayを使用してください。このモードはカメラが不要です。

(World Space Render Modeを使う場合、Event Cameraの欄はきちんと入力する)

 


 

 というわけで、ユーザー・インターフェイス編でした。今回も細かいながらも重要な情報ばかりではなかったでしょうか。

 これ以降の章は短いものばかりになりますが、一つずつ記事にしていきたいと思います。ラストまでもう少し!走り切るぞい!!

 

次回はAudio編です。

 

Graphics and GPU optimization編 Unity eBook "Optimaize Your Mobile Game Performance" を読み解く

Optimize_Your_Mobile_Game_Performance

 Unityが発行する無料eBook"Optimize Your Mobile Game Performance"を読み解いていこう!というこの企画も折り返し地点に到達しました。(前回はAssets編

 今回のGraphics and GPU optimization編は山場になるでしょう。2Dだろうが3Dだろうが、グラフィックスはゲームにとって最も重要な要素の一つです。特に3Dレンダリングは適切に行われないとゲームのパフォーマンスに大きな悪影響を与えかねません。

 

 今回の章では、グラフィックやGPUに関する最適化テクニックが解説されていくので、しっかりと学んでいきたいです!

 

Graphics and GPU optimization

 毎フレームごとにUnityはどのオブジェクトが描画されるべきかを決定し、Draw callを発行します。

 Draw call(ドローコール)とは、オブジェクトを描画するためのグラフィックスAPIに対して行われるコール(命令呼び出し)で、batchとは一緒に実行されるDraw callのグループを意味します。

 

 あなたのプロジェクトがより複雑になるにつれて、GPUの作業を最適化するパイプラインが必要になるでしょう。ユニバーサル・レンダーパイプラインは現在、シングルパスのフォワード・レンダラーを使用しており、モバイル・プラットフォームにおいて高品質のグラフィックをもたらします。(※2021.2以降、Deferred Rendererも使えるようになりました)

 スマートフォンタブレットに合わせる形で、コンソールやPCゲームで使われるのと同じ物理Lightingやマテリアルを使うことも出来ます。

 

 以下のガイドラインが、あなたのグラフィックを高速化するのに役立つでしょう。

 

ドローコールをまとめよう!

 同時に描画されるオブジェクトを一括化(batching)することで、それぞれのオブジェクトを描画する際に必要な状態遷移を最小化します。これによりレンダリングする際のCPUのコストを減らすことで、パフォーマンスを改善する方向に向かわせられます。

 Unityはいくつかのテクニックによって、複数のオブジェクトを少数のbatchに融合させることが出来ます。

 

・動的一括化 (Dynamic Batching)

 小さなメッシュにおいて、頂点をCPU上でグループ化し変換することが出来、一度にすべてを描画します。ただし、これは十分にポリゴンの少ないメッシュにのみ利用可能です。

 Dynamic batcherは300頂点以上のメッシュを一括化することが出来ません。なので、有効にすると、batchingするために小さなメッシュを探して、毎フレームCPUの処理時間を無駄にしてしまうでしょう。

・静的一括化 (Static Batching)

 動かないジオメトリにおいて、Unityは同じマテリアルを共有するメッシュに対するDraw callを減らすことが可能です。これはDynamic Batchingよりも効率的ですが、メモリ使用率が増加します。

GPUインスタンシング

 大量の同一オブジェクトがある場合、GPUを利用することで、より効率的にそれらを一括化します。

・SRP batching

 ユニバーサル・レンダーパイプラインのAdvanced項目で、SRP batcherを有効化しよう。シーンによりますが、これにレンダリング時におけるCPUの処理を軽くすることが出来ます。

SRP batcher : Speed up your rendering

 

フレーム・デバッガーを使おう

 フレーム・デバッガーは、個別のドローコール群から、どのように毎フレームの画が組み上げられるかを表示します。

 これはシェーダーのプロパティに関するトラブルシューティングの際にかけがえのないツールで、あなたのゲームがどのようにレンダリングされるかを理解するのに役立ちます。

 

多すぎる動的ライトは避けよう

 URPは旧フォワード・レンダラーに比べて、ドローコールの数を減らしています。(しかし、)あなたのモバイルアプリケーションにあまりに多くの動的照明を追加するのは避けましょう。

 静的メッシュへの書き込みライトと同じように、動的メッシュに対して、シェーダーエフェクトやlight probeなどの代替案も考えましょう。

 リアルタイム照明に関する、URPとビルトイン・レンダーパイプラインの機能的制限を確認してみてください。

 

影を無効化しよう

 影の描画はメッシュ・レンダラーとライトごとに設定可能です。ドローコールを減らすために、可能ならば影を無効化しましょう。

 

 キャラクター下にシンプルなメッシュを敷いて、そこに画像を適用することで疑似的な影を作ることが出来ます。別の手段として、改造シェーダーもあります。

 

ライト・マップに照明を焼き付けよう

 グローバル・イルミネーションを利用するために、静的ジオメトリ向けの劇的な照明を加えよう。StaticメニューのContribute GIにチェックを入れることで、ライト・マップとして、照明情報を保存できます。

 ベイクされた影と照明はゲーム実行中にパフォーマンスに大きな負荷をかけることなく描画されます。

 プログレッシブCPUやGPUライト・マッパーでグローバル・イルミネーションのメイクを高速化することが出来ます。

 

 ライトマッピングに関するマニュアルLight baked prefab & other tips to get 60 FPS on low-end phonesを確認しましょう。

 

ライト・レイヤーを使おう

 複数の照明がある複雑なシーンにおいて、レイヤーを使ってオブジェクトを分けよう。そして、カリング・マスクを指定することで、照明の影響を制限しよう。(※URPでも、2021.2からライト・レイヤーが使えるようになりました)

 

動く物体にLight Probeを使おう

 Light Probeはシーン内の何もない空間における照明情報を保存し、高品質な照明を施します。

 Light probeはSpherical Harmonicsを使い、動的照明よりも素早く計算することが可能です。

 

詳細度レベル(LOD)を使う

 オブジェクトが遠くに動くにつれて、LODはよりシンプルな複数のモデルに切り替えることが出来ます。

 Unity LeranのLODに関するコースがあるので、詳しくはここを見てください。

 

隠れたオブジェクトを除外するのにオクルージョン・カリングを使おう

 ほかのオブジェクトの背後に隠れたオブジェクトでも、潜在的にはまだ描画されており、リソースを消費しています。

 これらを取り除くのにオクルージョン・カリングを使いましょう。(※Occlusionとは遮蔽のこと)

 

 カメラ視点外における視錐体カリングは自動で行われますが、オクルージョン・カリングは手動のベイク処理によって行われます。

 Staticドロップメニューから、Occluder(隠す側)Occludees(隠される側)にチェックをいれ、Window >Rendering > Occlusion Culling メニューからベイクします。

 

 あらゆるシーンに適合するわけではないですが、多くの場合はこれでパフォーマンスが向上します。

 

モバイルのネイティブ解像度を避ける

 スマートフォンタブレットは年々進化してきていて、新しいデバイスの画面はより高い解像度を持ちます。

 

 Screen.SetResolution(width, height, false)を使って、出力の解像度を下げ、幾分かパフォーマンスを回復させましょう。いくつかの解像度を実際に測定して、クオリティとパフォーマンスのバランスがもっとも良いものを見つけましょう。

 

カメラ利用の制限

 複数のカメラ運用は、それが意味の有る無しに関わらず、オーバーヘッドを発生させます。レンダリングに必要なカメラ・コンポーネントのみを使いましょう。

 低スペック・モバイルにおいては、各カメラごとに1ms、CPUの処理時間を消費するということに注意してください。

 

シェーダーをシンプルに!

 ユニバーサル・レンダーパイプラインでは、モバイル向けにいくつかの軽量なLit, Unlitシェーダーがあらかじめ用意されています。

 ゲーム実行中に大きな影響を与え得る、シェーダーの変数は出来る限り少なくするようにしましょう。

 

 もしデフォルトのURPのシェーダーがあなたの要望に合わない時は、シェーダーグラフを使って、あなたのマテリアルの見た目をカスタマイズすることが出来ます。

 

上書き、アルファ・ブレンディングを最小に

 不必要な透明、半透明の画像を描画するのは避けましょう。モバイル・プラットフォームにおいて、上書き(オーバードロー)やアルファ・ブレンディングの影響は非常に大きいです。

 ほとんど見えない画像や視覚エフェクトを重ねるのはやめましょう。グラフィック・デバッガーのRenderDocでオーバードローの確認することが出来ます。

 

ポスト・エフェクトを制限する

 全画面におけるブルーム効果のようなポストエフェクトは、パフォーマンスを劇的に低下させる恐れがあります。そのゲームタイトルのアート方針の中で、注意して使いましょう。

 

Renderer.materialに気をつける

 スクリプト上でのRenderer.materialへのアクセスは、マテリアルを複製し、その新しいコピーへの参照を返します。これは既にあるマテリアルを含む、現状のbatchを壊してしまいます。

 もし、一括化(batched)されているオブジェクトのマテリアルにアクセスしたい場合は、代わりにRenderer.sharedMaterialを使ってするようにしてください。

 

スキンメッシュ・レンダラーを最適化

 スキンメッシュの描画は非常にコストが高いです。スキンメッシュ・レンダラーを使用している全てのオブジェクトにおいて、それが必要であるか確認してください。

 

 もし、いくつかのタイミングにおいてのみアニメーションが必要ならば、BakeMesh機能を使ってスキンメッシュを静的なポーズに凍結し、ランタイム中はよりシンプルなMeshRendererに切り替えるようにしてください。

 

Reflection Probeを最小化せよ!

 Reflection Probeはリアルな反射を生み出すことが出来ます。しかし、これは一括処理の面で、非常にコストが高いです。

 低解像度のキューブマップ、カリングマスク、テクスチャ圧縮を使うことで、ゲーム実行時のパフォーマンスを改善しましょう。

 

まとめ

 全部で4000文字を超え、これまでで最長の章だったのではないでしょうか。解説された項目も非常にたくさんありました。

 ただし、多くの項目において、問題点とその解決案を軽く触れる程度で、詳細については各々更に調べていく必要があると思います。

 

 とは言え、グラフィックにおけるパフォーマンス上の懸念点の全容を把握するには、この上ないガイドブックであり、これを公式でしかも無料で出しているのは非常にありがたいことだと思います。

 

 この企画もこれで無事に半分を折り返したわけですが、かなり自分のためになっているのでやって良かったな~という感じです。この後の章も引き続きやっていきたいと思います!

 

次回はユーザー・インターフェイス編です!

 

レンダリングとシェーディング入門書の決定版、『HLSLシェーダーの魔導書』をレビュー!

Grimoire Of Shading HLSL

(画像は出版社の公式ページより引用)

 久々の書籍レビューです。今回はシェーディングの基礎からレイトレーシングまで学ぶことが出来る、HLSLシェーダーの魔導書という本について書きたいと思います。最初にいってしまうと、最高の一冊でした!

 

 この本は去年2021年の6月に出たばかりの本ですが、この手の本の中では最高峰の出来なのではないでしょうか。知りたかった情報や、求めていた解説が体系立てられて、全てきちんと書かれている本です。専門書にありがちな小難しい、固い文章でなく、読みやすさ(ただし内容は簡単ではない)がある本としても良く出来ています。

 

 シェーディングやレンダリングについて、基本を学びたいと思っている人はぜひ買ってください。ネットにある情報は断片的であり、有益なものもあるにせよ、やはりこの本のように順序だてて適切に分かりやすく、しかも日本人による日本語で書かれているテキスト、というのはあまりないのではないでしょうか。

 

(追記)本書を読むための前提として、ある程度以上のプログラミング能力は必要です。コーディング、プログラミングがそれなりに出来る人が、グラフィクスについて、学び始めるための本だと思います。

 

魔導書?

 HLSL(High Level Shading Language)は、Unityでも使われている、シェーディング言語です。それの『魔導書』ということなのですが、この『魔導書』という言葉が、本書の実態を分かりにくくしているかもしれません。

 

 まず、この本は魔導書ではございません!売り文句にしても、もう少し良いネーミングがなかったのかとは思いますが、この本は単純にクオリティの高い、入門書あるいは教科書になっています。

 

 そして、注意すべきは、この本はHLSLそのものであったり、そのコーディング、文法を学ぶための本ではありません。それよりも実際のコードを示しながら、レンダリングおよびシェーディングが一体どのような処理をしているかの基礎であったり、『流れ』を学ぶための一冊だと言えます。

 明確な目標を設定し、その目的のために、どういう考え方をして、それを実現するためにどういうコードを書けばいいか、という『流れ』です。

 

 レンダリングの各工程の解説から始まり、拡散反射光や鏡面反射光、環境光というライティングの基本についての解説および、その実装の仕方・・・という風に基礎的な内容から順に追っていき、ディファード・レンダリングやポストエフェクト、レイ・トレーシングなどの応用的な内容へと発展していきます。

 

Unity使いとして

 Unity使いであれば、その専門に関わらず読んでおくべき内容が多いです。ゲームプログラム側のコードにC++が使われているというUnity使いにとっての障壁がありますが、C#が一定以上読めるのであれば、それが問題にならないくらいには分かりやすいコードが提示されています。

 

 筆者が組み上げたミニ・レンダリングエンジンを例にレンダリングエンジンについて学ぶパートもあります。筆者も述べていますが、Unityなどのゲームエンジンを使うとしても、レンダリング(エンジン)について学べば、ゲームエンジンをより上手く使えるようになるよ!とのことです。

 

 Unityのスクリプタブル・レンダーパイプラインによって、レンダリングエンジンをC#で改造できるようになったので、個人的にもこの本で学んだことをUnityで活かしていきたいです。

 

Shader Graphへの応用

 本書の中で使われている『考え方』は言葉の入れ替え、あるいは処理の置き換えが必要ではあるにせよ、それを参考にUnityのShader Graphでシェーダーを実装してみるということも可能なので、そういう役立て方も出来ます。

 細かいことよりもグラフィックス周りの全体像、本質を学べるのが、この本の良い所ではないでしょうか。

 

 例えば、0.0~1.0までの範囲の値を-1.0~1.0までの範囲に変換したい時、本書では…

value = (value - 0.5) * 2.0;

というような処理をします。これはShader Graphであるなら、Remapノードを使って値の範囲を変更すれば済む話です。

 

 こういう風に上手く翻訳していけば、この本で学んだ内容をほぼそのままにUnityで活かすことが出来ると思います。

 

まとめ

 誤字脱字や、写真の間違いなど、いくつかのミスがあるにせよ、第一版にして、既に内容的にもほぼ決定版と言える完成度を持っていると思います。

 

 定価5,060円ですが全然高くなく、むしろ1万円近い価値は十分にある本だと思うので、自分でシェーダーを書くつもりが無い人であっても、グラフィックス関連について基礎を学びたい、内部でどういうことをやっているのか興味がある、という方におススメです!

 

Assets編 Unity eBook "Optimaize Your Mobile Game Performance" を読み解く

Optimize_Your_Mobile_Game_Performance

 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モデルについてはミップマップを有効にしたままにしましょう)

 

テクスチャを圧縮する

 同じテクスチャとモデルを使った次の二つの例を見てください。

CompressionAndUncompression

画像はeBookから引用

 左側の設定は右側よりも約8倍もメモリを使っているのに、視覚的なクオリティの違いがほとんどありません。

 

 Adaptive Scalable Texture Compression(ATSC)AndroidiOS上で使いましょう。開発中のゲームの大多数は、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編になります。