1. ホーム
  2. Web プログラミング
  3. 関連情報

Unityプロジェクトの最適化に関するヒント

2022-01-04 14:25:51

I. 単純な最適化

1. unityが最適化できるように、イメージテクスチャサイズを2のべき乗(128、512、1024など)にしてみてください。

2. 複数の小さな画像テクスチャを1つの大きな画像テクスチャにまとめ、drawcallを減らす。特に同じuiパネルのすべての要素を1つの画像セットに入れる場合、背景画像は別の画像にするようにする。

3. 3. 上記と同じ理由で、素材ボールはなるべく共有すること。

4. アニメーションを再生する必要のないモデルからは、アニメーターやアニメーションコンポーネントを削除してください。

5. モデルについては、頂点や三角形の数をできるだけ減らし、頂点をできるだけ再利用するように気をつける

6. テクスチャミップマップは状況に応じてオン・オフを切り替える(一般に3Dシーンで使用し、UIや2Dゲームでは使わない)、オンにするとテクスチャを重ねたときのジッタやフリッカを抑えてレンダリングを高速化し、画像のジャギーを軽減できる、ただしメモリ容量を多く取り、プロジェクトのパッケージファイルが大きくなる(なにしろ小さなバックアップマップが次々と生成されてレイヤーごとに縮小されていくのだ)。

7. 7. シーン内の変化しないオブジェクト(変位、回転など)を Static に設定し、unity による静的バッチ処理を容易にします。

8. のプレイヤー設定を開きます。 静的バッチングと動的バッチング Static Batching を使用すると、CPU から GPU への転送や SetPassCall の回数が減るだけで、頂点変更操作を再度行う必要はありませんが、パッケージ サイズとメモリ消費量が増えることに注意してください。

9. ライティングスポットライトはオーバーヘッドが多いので、控えめに使用すべきです。

10. リアルタイムシャドウは控えめに、必要であればハードシャドウを使用します。

11. 11. 半透明のマテリアルと UI を慎重に使用して、過剰描画を減らす。例えば、アルファ 0 の画像は見えないが、GPU は描画する。UI に半透明のインターフェースが多い場合は、UI を別のカメラでレンダリングし、UI をシーンカメラの描画範囲に重ねないことをお勧めします。

II. 最適化の進展

1. 頻繁に現れたり破壊されたりする必要のあるオブジェクトを管理するために、バッファプールを使用する。

2. ロッドのテクニックを適宜使用する。この技法を使うと、モデルを複数セット作る必要があるので、プロジェクトのパッケージファイルが大きくなり、メモリも消費しますが、描画する必要がある頂点の数を減らすことができ、距離の調整がうまくいかないとモデルが突然変化することがあります。

3. OC(Occlusion Culling)機能を使用する(通常、シーン内のモデル数が多い場合に使用)、この機能を使用すると、大幅にオーバー描画を減らすことができます(結局、オクルードされているオブジェクトは直接レンダリングされません)、あなたはセルのサイズとのバランスを達成するためにオブジェクトのサイズに注意を払う必要があります。あなたは、オブジェクトをオクルーダーまたはオクルードとして制御するには、Occluder StaticおよびOccludee Staticを設定することができます。この手法の欠点は、CPUを余分に消費することです。

4. リアルタイム照明を置き換えるために光プローブグループと光マッピングを使用して、この手法を使用すると、高モデルを必要とする、そこにUVのずれ、通常のずれをすることはできません、それ以外の場合は非常に奇妙な状況になる、同時に、この技術を使用して、動的な影の生成を持っていません。

5. 5. 異なるプラットフォーム用にテクスチャを圧縮する(例:IOSではpvrtc、AndroidではETC1、アルファチャンネルがある場合はRGBA 16bitを使用)、圧縮は時々テクスチャの品質に影響を与えることに注意する必要があります。

6. なぜなら、unity はパフォーマンスを最適化するために、canvas 以下のすべての要素を 1 つのメッシュに統合するからです。すべてのインターフェースを 1 つの canvas に入れると、インターフェースが変更されたときに再描画が発生し、パフォーマンスが低下してしまいます。最適な解決策は、1つの静的なUIを1つのcanvasに置き、動的なUIを別のcanvasに置くことです。

7. スキニンググリッドアニメーションを頂点アニメーションに変更し、時間に対して空間を使用する。

8.レンダリングフレームレートに特定の要件がない場合はモバイル、あなたはフレームレートを減らすことによって、マシンのパフォーマンスを節約することができます、あなたはに注意を払う必要があります。  品質設定.vSyncCount {{a QualitySettings.vSyncCount /a} に Don't Sync を設定しないと、以下のように設定が無効になってしまいますので、ご注意ください。

プロジェクト構成クラスまたはメインクラスのAwakeまたはStartに、以下のコードを追加します。

Application.targetFrameRate = 30; //Mobile platform default 30 is the more power-efficient frame rate, for best performance set to 300 (so the machine will do its best to increase the frame rate, but there is a high probability that it will not reach 300)

9. 賢く使う プロファイラ パフォーマンスのボトルネックを分析し、最適化するために使用します。

10. 10. 地形をメッシュに変換し、大きなマップにはストリーミングロードとアンロードのテクニックを使用します。

11. 11. モデルのマスクメッシュアニメーションを頂点アニメーションに変更し、空間と時間を交換します。

12. アニメーションのインスタンス化を使用して、多くのモデルアニメーションを最適化します。

13. 可能な限り MeshCollider の代わりに BoxCollider を使用する。

III. 深い最適化(操作はより複雑で、何らかの基礎知識を必要とするか、極端な最適化が必要です)

1. カスタムシェーダーを使用する

2. メッシュのマージ(ここでは、Linさんの 関連ブログ )

3. UIは、GraphicRaycasterコンポーネントを削除するには、キャンバスのレイ検出を伴わない

4. それは使用する方が便利ですが、少ないLayoutGroupとcontentSizeFitterを使用しようとすると、ユーザーの操作では、全体のUIインターフェイスの再描画につながる、有能な牛は、ローカル再描画を達成するために独自のアルゴリズムを記述することをお勧めしますどこで別のキャンバスの使用は、全体のUIを回避しようとするこれらの2つのコンポーネントを使用する唯一の方法は、両方のコンポーネントの別のキャンバスに再描画を回避するために使用されることです。

5. 状況に応じて シングルパス・インスタンス化レンダリング : この機能を有効にするには  プレイヤー  の設定(  編集  >  プロジェクト設定__ を選択し  (Player__カテゴリ)。その中の  プレーヤー  の設定の一番下まで移動してください。  XRの設定  パネルから  バーチャルリアリティ対応  オプションから選択し  ステレオレンダリング方式  のドロップダウンメニューを選択し、次に  シングルパスインスタンス(プレビュー) .

IV. コード関連の最適化

1. foreachをforループに置き換える。

2. gameObject.tag="tag" の代わりに gameObject.CompareTag("tag") を使ってください。

FindメソッドやGetComponentメソッドは、Updateなどのメソッドではなく、できるだけStartやAwakeで呼び出されるようにすること。

4. 文字列のスプライシングの代わりにstring.formatを使用する。

5. 物理検出はfixedUpdateで行う。

上記はUnityプロジェクトの最適化関連のヒントの詳細です、Unityプロジェクトの最適化の詳細については、BinaryDevelopの他の関連記事に注目してください