Unity UI が DrawCall の学習ノートを削減

まとめ:

        DC とは: Unity では、CPU がデータを準備して GPU に通知するたびに、DrawCall と呼ばれます。

つまり、DC がいくつあるか、CPU が GPU に通知を送信する必要がある回数、回数が多いほどパフォーマンスへの影響が大きくなるため、プロジェクトを開発する場合、DC の数は厳密に制御されます。この章は、UIモジュールのDCを削減する方法に関するブロガーの学習記録です. 初心者に適しています. ブロガーは手順を詳細に書きます. すでにマスターしている場合, この章の内容は比較的単純ですが、マスターがそれを見てくれれば幸いです。ご意見やご提案がありましたら、コメント欄にお気軽にお寄せください。どうもありがとうございました。みんなの勉強の参考になれば、ちょっといいねをクリックして初心者ブロガーを応援してください。

1.DCの見方

1. 数字だけを見たい場合は、Game ビューの State をクリックすると、下図のように直感的に DC の数を確認できます。

バッチ: バッチ処理の意味。

 2. 各 DC が何をレンダリングするかを確認するには、上部のメニュー バーで [ウィンドウ] -> [分析] -> [フレーム デバッガー] をクリックします。下の図に示すように、[フレーム デバッグ] ウィンドウがポップアップします。

 左側の各オプションを選択します。上から下に、このステップで何がレンダリングされるかを確認できます。

上の画像は、空のシーンの DC スクリーンショットです。シーンにはカメラが 1 つしかなく、現在は 2 つの DC があります。上の図から、これら 2 つの DC はカメラが原因であることがわかります。カメラがオフになっていることを確認すると、DC が 0 になっていることがわかります。

2.アトラスを使う

UI インターフェイスを作成する場合、画像は間違いなく最も頻繁に使用されるオブジェクトの 1 つです。アトラスを使わない場合、絵を載せるとDCになることがわかりますが、同じ絵を何枚載せてもDCになります。原理についてはここでは詳しく説明しませんが、この実験を通して、複数の画像を 1 つの画像に変換できれば、DC の数を大幅に削減できることがわかります。非常に素晴らしい。

  

 アトラスとは? 使い方がわからない学生もいるかもしれません. 簡単に言えば, アトラスは複数の小さな画像を組み合わせて大きな画像にすることができます. プロジェクトウィンドウで右クリックして作成->スプライトアトラスを選択してアトラスを生成できます.目的の画像または画像が配置されているフォルダーをアトラスのオブジェクトのパッキングにプルすると、下の図に示すように、画像をアトラスに自動的にパックできます。

 

△注:

1. アトラスを使用するには、以下に示すように ProjectSettings で SpritePacker を開く必要があります。

 2. ギャラリー内の写真は、ギャラリーの最大サイズを超えてはなりません。現在のアトラスのサイズを以下に示します. 上の図に示すように, 現在のアトラスは 64*32 しかありません. 最大サイズは上記の最大テクスチャ サイズです. デフォルトは 2048 です. 2048*2048 に達し、余分な部分はアトラスに入力されませんでした。

アトラスを検証するブロガーの現在の方法は少しばかげていますが、うまくいくはずです。つまり、アトラスがいっぱいのように感じ、それを超えるのが怖い場合は、最大テクスチャ サイズを 1 レベル増やすことができます。たとえば、元の 2048 が 4096 に変更されます。今回はオーバーフローしており、現在のアトラスを使用する必要がありますプロジェクトリソースは、サイズを大きくするか、新しいアトラスを作成するか、大きな写真を小さなサイズに縮小するかを検討し、アトラスの容量が少なくなるようにします。そうしないと、DC はゆっくりと爆発しますが、これはもちろん予想したことではありません。

このとき、DC を下げるためにアトラスを大きくしすぎないように注意してください. アトラスが大きいほど、メモリが大きくなります. たとえば、2048*2048 アトラスは 4M であり、4096*2048 は 8M です.プロジェクトのニーズを総合的に検討し、両者の関係をバランスさせる必要があります。

下の図に示すように、3 つの画像 (同じアトラス) は 1 つの DC のみを占有します。

 3. テキスト

△注:

1. 写真と同じように、同じフォントのテキストは 1 つの DC しか占有しないため、1 つのインターフェイスに対して 1 つのフォントを統一するのが最善です。

2. オブジェクトはレイヤーごとにレンダリングされるため、テキストと画像の間にオーバーラップがある場合、DC の数も増加します。

 上図のように文字が絵の上層にある場合、絵と重なってもDCは増えませんが、下図のように上下関係を変えるとDCが増えます

テキストが 2 つの画像に重なっている場合、2 つの画像がアトラスに属していても、追加の DC が追加されます。

DC はこのように単純に計算されるため、同じレイヤーと同じマテリアルが同時にレンダリングされる場合、これは DC と見なされます。異なるマテリアルのオブジェクトが挿入されると、バッチ処理が中断され、DrawCall が増加します。

     

上の左の図に示すように、テキストが 2 つの画像の重なりではなく、1 つの画像を重ねるだけの場合でも、2 つの画像は 1 つの DC としてカウントされ、テキストだけでも 1 つの DC としてカウントされます。右の図では、重なっている領域にテキストがあり、最上層にテキストがあるため、各オブジェクトが DC としてカウントされます。

 また、フレーム デバッグのバッチ承認を見て、理由を大まかに把握することもできます。テキストは画像の上に重ねられていますが、重なっている部分ではないため、2 つの画像は 1 DC としてカウントされます。

したがって、芸術的な効果を変えないことを前提に、すべてのテキストを 1 つのレベルに配置するのが最善です (テキストを一番上に保つことに慣れます)。これにより、効果的に DC を減らすことができます。下の写真のように、元の効果と同じですが、DCが2つ減っています。

3.キャンバス

Canvas コンポーネントを使用して UI オブジェクトのレベルを調整するが、Canvas によって DC が 1 増加する場合は、注意して使用してください。

 4. その他

テキストと同じように、大きな画像やマスク、シェーダーなどを使用する場合は DC が追加されます.このとき、アトラスのバッチ処理をできるだけ中断しないように注意する必要があります。バッチ調整

V. まとめ

要約すると、主に Frame Debug と、特定の問題の特定の分析に依存します。

当面は上記の最適化方法を記録しておき、他の方法で補足・調整を続けていきます。

おすすめ

転載: blog.csdn.net/wang980502/article/details/127173427