Unity パフォーマンスの最適化 2: メモリの問題

目次

ポリシーによって引き起こされるメモリの問題

GFXメモリ

テクスチャリソース

圧縮形式

ミップマップ

グリッドリソース

読み書き

頂点データ

スケルトン

静的バッチ

シェーダリソース

予約済みメモリ

レンダーテクスチャ

アニメーションリソース

オーディオリソース 

フォントリソース

パーティクル システム リソース

モノヒープメモリ


ポリシーによって引き起こされるメモリの問題

1. Assetbundle がパッケージ化されると、単一のリソースが繰り返しパッケージ化されます。依存するリソースを個別にパッケージ化できます。AssetBundleBrowser を介して Assetbundle 内のリソースを表示できます。アドレス: Unity Technologies · GitHub

2. コードが不適切に使用され、ロード後にリソースが時間内に破棄されません。たとえば、次のとおりです。

            var gos = Resources.Load<GameObject>("Sphere");
            GameObject go = Instantiate(gos);
            Material ma = go.GetComponent<Renderer>().material;
            ma.color = new Color(1, 0.5f, 0.5f);
            
            //Destroy(ma);
            Destroy(go);

 カラーを設定するたびに新しいマテリアルが作成されるため、マテリアルはメモリ内に残ります。

3. アセットバンドルの不適切なアンロードはリソースの冗長性を引き起こします。Unload(false) はロードされたアセットバンドルをアンロードしますが、そこからロードされたリソースはまだ存在します。Unload(true) はそれらをアンロードします。

GFXメモリ

GFX メモリ (グラフィックス) は、グラフィックス プロセッサ (GPU) の専用メモリを指し、グラフィックス データや計算に必要な一時データを保存するために使用されます。

テクスチャリソース

圧縮形式

1. 画像を Unity にインポートすると、Unity で認識される jpg や png などの形式に変換されます. これらはハードディスクに保存されている形式ですが、GPU で直接読み込むことができないため、ETC に変換されますインポート時の ASTC となります。

2. 画像圧縮の利点:

メモリ使用量、帯域幅、ロード時間を削減します。

3. 画像の圧縮形式がプラットフォームでサポートされていない場合、画像は RGBA 形式に変換されます。つまり、圧縮されません。

4. Android は ETC/ASTC をサポート、IOS は ASTC/PVRTC をサポート、PC は DTX をサポート

5. ASTC は、ブロックの保存に固定 128 ビットを使用するため、圧縮ブロックのサイズを調整して圧縮率を調整できます。ストレージ スペースが均等に分散されるため、ブロック内のピクセルが多いほど、圧縮率は高くなります。各ピクセル。4x4、6x6、8x8 などの小さい方

ミップマップ

1. ミップマップのメリットとデメリット

利点: 帯域幅の減少 欠点: メモリの増加

2. 原則

保存された画像メモリは、1、1/4、1/16... の等比数列で、メモリの合計は元の 4/3 倍、つまりメモリが 1/3 増加します。

3. 2D インターフェイスの場合、カメラの距離が変わらないため、ミップマップをオフにする必要がありますが、3D オブジェクトや UI の場合は、状況に応じてミップマップをオンにできます。

4. テクスチャ品質を通じてメモリに追加されるミップマップの数を変更し、異なるパフォーマンスと異なる構成のマシンを実現します。

編集-プロジェクト設定-品質-テクスチャで変更すると、ミップマップがオンになっているテクスチャにのみ有効となり、内部のFullResやHalfResなどのメモリが元の値の1/4に削減されます。

5. テクスチャ ストリーミングはメモリにロードされるミップマップの数を動的に変更します

これは、アセットバンドルの読み込みなど、動的に読み込まれるミップマップ テクスチャに対してのみ有効です。テクスチャがシーンにすでに存在し、シーンの読み込みによって読み込まれる場合、テクスチャはすでに存在し、動的に変更できないため、テクスチャ ストリーミングは有効になりません

テクスチャの読み込みは、オブジェクトとカメラの位置に応じて、ab パッケージ内のミップマップをリアルタイムで動的に読み込みます。

効果的な条件: テクスチャによりテクスチャ ストリーミングが有効になり、ミップマップが生成されます。

MaxLevelReduction (最もトリミングされたレベル) > Memroy Budget (ミップマップによって占有される最大メモリ) の優先順位

グリッドリソース

読み書き

CPU と CPU はそれぞれメモリの共有を占有します。コード内のメッシュを変更する必要がない場合は、このオプションを有効にしないでください。

頂点データ

メッシュには位置、色、接線などの多くの頂点データがありますが、接線は一般に照明を計算するときに使用されます。モデルをインポートするときにモデル列の下で接線をなしに設定するか、プロジェクト設定の回転を使用できます。内部のメッシュ データを最適化すると、未使用の頂点属性がトリミングされるため、テストする必要があります。

スケルトン

モデルにボーン データが必要ない場合は、モデル インポートの RIG 列でアニメーション タイプを none に設定します。

静的バッチ

メモリが増加し、スペースが時間に変換されます。

シェーダリソース

1. シェーダが占有するメモリ シェーダ バリアントである限り、各バリアントはシェーダを生成し、メモリにロードします。

2. ゲームの初期化時には、通常、ゲーム実行時のタイムリーなロードとコンパイルによる遅延を軽減するために、レンダリングに使用されるすべての Shader を事前にロードする必要があります。この時点で、Shader.WarmupAllShaders を呼び出してロードすることができます。現在のシェーダーをメモリに保存します。シェーダーは、すべてのバリアントを含めて 1 回コンパイルされます。

3. プロジェクトのレンダリング効果が豊かになるにつれて、Shader のバリエーションも増え、大まかにフルローディング インターフェイスを呼び出すと、ゲームの起動時間が長くなり、ゲーム体験に影響を与えます。

4. その後、Unity はバリアント コレクションShaderVariantCollectionを追加して、上記の粗雑な完全読み込みインターフェイスを置き換え、オンデマンド読み込みを実現し、読み込み速度を向上させました。

5. 最適化の方向: クリッピング シェーダー バリアント

アドレス: https://answer.uwa4d.com/question/5da86670e84db43d6efbda72
 

予約済みメモリ

レンダーテクスチャ

アンチエイリアシングを適切にオフにするか、アンチエイリアシングの品質を下げ、シャドウ マップの品質、つまり解像度を下げ、RT ストレージ ビット数 (コード生成時に設定) を減らします。アルファ チャネルを使用する場合は、形式を R11G11B10 に変更できます。つまり、32 が保存形式です。

アニメーションリソース

1. リサンプル コードを確認します。モデル インポートのアニメーション列で、デフォルトでオンになっており、キー フレームの数が減ります。

2.アニメーションを圧縮する

3. スケールなしのスケルトン アニメーション。エディター コード、AnimationUtilityを使用して、未使用のスケール カーブを削除します。

4. アニメーション ストレージの float 精度を下げて、その保存方法が一定になり、メモリが削減されるようにします。

5. アニメーションを選択すると、プロパティ パネルにその詳細情報が表示されます。

オーディオリソース 

1. ForceToMono: 2 チャンネルオーディオをモノラルに結合します。

2. ロードタイプ: 

ロード時に解凍: ロード後に解凍し、非圧縮のままメモリに保存します。

メモリ内で圧縮: 圧縮してメモリに保存され、再生中に解凍されます。

ストリーム:解凍しながら再生しますが、再生するたびにキャッシュが追加されます

再生頻度が低く、長く大音量の BGM にはストリームを使用し、短く頻繁に使用する場合は 1 番目のタイプ (音声を取得)、その他の中程度の音楽には 2 番目のタイプを使用します。

3. 圧縮形式

圧縮率が小さいほど、圧縮後のファイル メモリの占有量は少なくなります。ADPCM 圧縮形式の使用メモリが最も小さくなります。メモリ内圧縮で使用します。 PCM: 圧縮なし、Mp3: 秒、Vorbis: 秒、ADPCM:
最小

フォントリソース

1. フォントのスリム化: 一部のフォントは使用されず、切り取られる可能性があります 推奨ツール: FontSubsetGUI、FontPruner

2. フォント圧縮: TMP によって生成されたフォント問題は大きすぎて変更できないため、そのテクスチャを抽出して圧縮し、値を割り当てることで、テクスチャが圧縮されます。

パーティクル システム リソース

1. パーティクルが占有するメモリは実際に再生されるパーティクルの数に関係し、パーティクルの最大数とは関係ありません。

2. パーティクルが再生されていない場合、パーティクルはメモリの一部も占有します。たとえば、パーティクル システムは閉じられているだけで、削除されていません。

モノヒープメモリ

1. リスト、辞書、配列などの常駐メモリが大きすぎる 初期化中のメモリが大きすぎないように注意してください。

2. 継続的にメモリを割り当てます。初期化中に変数をキャッシュすることにより、10,000 フレームごとに 50M を超えないメモリを割り当てます。






 


 

おすすめ

転載: blog.csdn.net/qq_37672438/article/details/131958138