Unity UIの最適化(二):UnityUIの基礎

バージョンチェック:2017.3 -Difficulty:上級

UnityUIシステムを構成するさまざまな部分を理解することが重要です。いくつかの基本的なクラスとコンポーネントがシステムを構成しています。この章では、最初にこの一連の記事で使用されるいくつかの用語を定義し、次にいくつかの主要なUnityUIシステムの低レベルの動作について説明します。

用語

Canvasは、Unityのレンダリングシステムで使用されるネイティブコードのUnityコンポーネントであり、ゲームのワールドスペース上またはその上に描画されるレイヤー化された幾何学的図形を提供します。

キャンバスは、構成ジオメトリをバッチに結合し、適切なレンダリングコマンドを生成し、これらのコマンドをUnityのグラフィックシステムに送信する役割を果たします。これはすべて、リバッチまたはバッチ生成と呼ばれるネイティブC ++コードで行われます。キャンバスが再バッチ処理が必要なジオメトリを含むものとしてマークされている場合、キャンバスはダーティと見なされます。

ジオメトリは、キャンバスレンダリングコンポーネントを提供するキャンバスです。

サブキャンバスは、別のキャンバスコンポーネントにネストされた単なるキャンバスコンポーネントです。子キャンバスは子を親から分離します。ダーティな子は親にジオメトリの再構築を強制しません。その逆も同様です。親キャンバスを変更すると子キャンバスのサイズが変更される場合など、一部のエッジケースではこれが正しくありません。

グラフィック(グラフィック)は、UnityUIC#ライブラリによって提供される基本クラスです。これは、すべてのUnityUIC#クラスの基本クラスであり、キャンバスシステムに描画可能なジオメトリを提供します。組み込みのUnityUIグラフィックのほとんどは、MaskableGraphicsサブクラスを介して実装されているため、マスク不可能なインターフェイスを介してシールドできます。Drawableの主なサブクラスは画像とテキストであり、同じ名前のコンポーネントを提供します。

レイアウトコンポーネントは、RectTransformのサイズと位置を制御し、通常、相対的なサイズまたは相対的なコンテンツの配置を必要とする複雑なレイアウトを作成するために使用されますレイアウトコンポーネントはRectTransformのみに依存し、関連するRectTransformのプロパティにのみ影響します。これらはグラフィッククラスに依存せず、UnityUIのグラフィックコンポーネントとは独立して使用できます。

グラフィックコンポーネントとレイアウトコンポーネントはどちらも、UnityEditorインターフェイスで公開されていないCanvasUpdateRegistryクラスに依存しています。このクラスは、更新が必要なレイアウトコンポーネントとグラフィックコンポーネントのコレクションを追跡し、関連するキャンバスがWillRenderCanvasesイベントを呼び出すと、必要に応じて更新をトリガーします。

レイアウトおよびグラフィックコンポーネントの更新は、再構築と呼ばれます。再構築プロセスについては、このドキュメントの後半でさらに詳しく説明します。

レンダリングの詳細

UnityUIでユーザーインターフェイスを組み合わせる場合、キャンバスによって描画されるすべての幾何学的図形は透明なキューに描画されることに注意してくださいつまり、UnityUIによって生成されたジオメトリは常にアルファと混合されます。パフォーマンスの観点から、ポリゴンから抽出されたすべてのピクセルラスターは、他の不透明な部分で完全に覆われている場合でもサンプリングされることを覚えておくことが重要です。ポリゴン。モバイルデバイスでは、この高エネルギーレベルの当座貸越はGPUフィルレート容量をすぐに超える可能性があります。

バッチ構築プロセス(キャンバス)

バッチビルドプロセスは、キャンバスがUI要素を表すグリッドを組み合わせ、Unityのグラフィックパイプラインに送信する適切なレンダリングコマンドを生成するプロセスです。このプロセスの結果はキャッシュされ、キャンバスがダーティとしてマークされるまで再利用されます。ダーティは、構成グリッドに変更が加えられるたびに発生します。

キャンバスで使用されるグリッドは、キャンバスにアタッチされているキャンバスレンダラーコンポーネントから抽出されますが、サブキャンバスには含まれていません。

バッチを計算するには、グリッドを深さで分類し、それらにオーバーラップ、共有マテリアルなどがあるかどうかを確認する必要があります。この操作はマルチスレッドであるため、そのパフォーマンスは通常、CPUアーキテクチャによって大きく異なります。特に、モバイルSoC(通常は数個のCPUコアのみ)と最新のデスクトップCPU(通常は4個以上のコア)で異なります。

再構築プロセス(グラフィックス)

再構築プロセスでは、UnityUIのC#グラフィカルコンポーネントのレイアウトとグリッドが再計算されます。これは、CanvasUpdateRegistryクラスで実行されます。これはC#クラスであり、そのソースコードはUnityのBitbucketにあります。

CanvasUpdateRegistryでは、対象のメソッドはPerformUpdateです。このメソッドは、CanvasコンポーネントがWillRenderCanvasesイベントを呼び出すたびに呼び出されます。このイベントは、フレームごとに1回呼び出されます。

PerformUpdateは、次の3つのステップを実行します。

  • ダーティなレイアウトコンポーネントは、ICanvasElement.Rebuildメソッドを使用してレイアウトを再構築するように要求されます。
  • 登録されているトリミングコンポーネント(マスクなど)は、トリミングコンポーネントをトリミングするように要求されます。これは、ClippingRegistry.Cullを介して行われます。
  • 汚れたグラフィックコンポーネントは、グラフィック要素を再構築する必要があります。

レイアウトとグラフィックの再構築では、プロセスは複数の部分に分かれています。レイアウトの再構築は3つの部分(PreLayout、Layout、PostLayout)で実行され、グラフィックの再構築は2つの部分(PreRenderとLatePreRender)で実行されます。

レイアウトの再構築

1つ以上のレイアウトコンポーネントに含まれるコンポーネントの適切な位置(および可能なサイズ)を再計算するには、レイアウトを適切な階層順序で適用する必要があります。GameObject階層では、ルートに近いレイアウトは、ルートにネストされている可能性のあるレイアウトの位置とサイズを変更する可能性があるため、最初に計算する必要があります。

この目的のために、UnityUIは、ダーティレイアウトコンポーネントのリストを階層内の深さに従ってソートします。階層の上位にある(つまり、親の遷移が少ない)アイテムは、リストの先頭に移動されます。

次に、レイアウトコンポーネントの並べ替えられたリストを要求して、レイアウトを再構築します。これは、レイアウトコンポーネントによって制御されるUI要素の位置とサイズが実際に変更される場所です。各要素の位置がレイアウトによってどのように影響を受けるかについての詳細は、「Unityマニュアル」のUI自動レイアウトを参照してください

グラフィックの再構築

グラフィックコンポーネントを再構築するとき、UnityUIはICanvasElementインターフェイスの再構築メソッドに制御を渡します。グラフィックはこれを実現し、再生プロセスのPreRenderフェーズで2つの異なる再構築ステップを実行します。

  • 頂点データがダーティとしてマークされている場合(たとえば、コンポーネントのRectTransformがサイズを変更した場合)、メッシュが再構築されます。
  • マテリアルデータがダーティとしてマークされている場合(たとえば、コンポーネントのマテリアルまたはテクスチャが変更された場合)、アタッチされたキャンバスレンダラーのマテリアルが更新されます。

グラフィックの再構築は、グラフィックコンポーネントリストを特定の順序で通過することはなく、並べ替え操作も必要ありません。

公式翻訳、続く

おすすめ

転載: blog.csdn.net/Momo_Da/article/details/93530301