Unity3d: UGUI ソース コード、リビルドの最適化

絵はどのように描かれるのか

Unity でレンダリングされるオブジェクトはメッシュで構成され、メッシュの描画単位はプリミティブ (点、線、三角形) であり、描画情報は Vertexhelper
クラスに格納され、頂点に加えて法線、UV、カラー、タンジェントが含まれます。

コンセプトの再構築

Canvas は、子ノードの UI 要素のグリッドをマージし、対応するレンダリング命令を生成し、それらを Unity のグラフィック パイプラインに送信するプロセスを担当します。したがって、Canvas は UI をレンダリングするコンポーネントであり、UI が変更されるとバッチが実行され、パフォーマンスに影響を与える原因となります。Canvas の Batch はその子ノードにのみ影響し、子 Canvas には影響しないことに注意してください。

プログラムの流れを再構築する

  1. Image と Text は両方とも Graphic を継承し、Graphic には再構築機能を実装する ICanvasElement インターフェイスがあります。
   public interface ICanvasElement
   {
    
    
       /// <summary>
       /// Rebuild the element for the given stage.
       /// </summary>
       /// <param name="executing">The current CanvasUpdate stage being rebuild.</param>
       ///  // 根据CanvasUpdate的不同阶段重建元素
       void Rebuild(CanvasUpdate executing);
  1. CanvasUpdateRegistry は、Canvas の willRenderCanvases イベントをリッスンします。このイベントは、レンダリングの前にすべてのフレームで呼び出されます。
   public class CanvasUpdateRegistry
   {
    
    
         //布局重建队列,当UI元素的布局需要更新时将其加入队列
       private readonly IndexedSet<ICanvasElement> m_LayoutRebuildQueue = new IndexedSet<ICanvasElement>();

       //图形重建队列,当UI元素的图像需要更新时将其加入队列
       private readonly IndexedSet<ICanvasElement> m_GraphicRebuildQueue = new IndexedSet<ICanvasElement>();

       protected CanvasUpdateRegistry()
       {
    
    
           //监听了Canvas的willRenderCanvases事件,这个事件会在渲染前进行每帧调用
           Canvas.willRenderCanvases += PerformUpdate;
       }
  1. PerformUpdate はレイアウト再構築キューを収集し、グラフィック再構築キューは ICanvasElement.Rebuild を呼び出して再構築を完了します。

再構築に参加する時期

レイアウト(Layout)、マテリアル(Material)、頂点(Vertices)を含む「ダーティデータ」を設定することで実現され、レイアウトがダーティに設定されている場合はレイアウトが再構築され、頂点またはマテリアルがダーティに設定されている場合は再構築されます。 、グラフィックが再構築されます。レイアウトの再構築は m_LayoutRebuildQueue に追加され、グラフィックの再構築は m_GraphicRebuildQueue に追加され、呼び出されるのを待ちます。
SetLayoutDirty: レイアウト再構築キューに追加
SetVerticesDirty、SetMaterialDirty: グラフィック再構築キューに追加されたマテリアル、頂点変換

レイアウトの再構築: 位置またはサイズ;

画像再構成:頂点変更、素材変更(サイズ、回転、テキスト変更、画像修正)

最適化

主な目標は、プロファイルの Canvas.SendWillRenderCanv パラメータを減らすことです。頂点の数、頂点の変更などを制限することによって。

  1. テキスト属性の変更 (「123」->「1234」)、SetLayoutDirty のトリガー: カウントダウンに関連、1 秒ごとに変更、リアルタイムで変更しない

  2. テキスト、画像の色を変更し、SetVerticesDirty (頂点の変更) をトリガーします。画像の色を変更する最良の方法は、シェーダーの色を変更することです。

  3. レイアウト コンポーネントが再構築の問題を引き起こしている

  4. テキスト ストローク、シャドウ パフォーマンスの問題
    1 文字で 4 つの頂点が生成されます。
    シャドウを追加すると、テキストを再度コピーして 8 つの頂点を生成することと同等であり、
    アウトラインではテキストを 4 回コピーして 20 の頂点を生成します。
    対応するシェーダーに置き換えます

  5. テキストグラデーション

  6. イメージ形式の選択
    イメージ: 頂点の数はイメージ タイプの選択によって異なります。
    ①シンプルな4頂点
    ②Sliced:FillCenterにチェックを入れ頂点数36、チェック無し32
    ③TiledはRectranformの設定サイズと元画像のサイズに依存し、N個の画像を4×Nにロールアウト
    ④Filled多くの比較を選択しますが、少なくとも 4 つです。
    したがって、イメージにはシンプル モードが優先され、次にスライス モードが優先され、FillCenter はチェックされません。

  7. 動的および静的分離: Canvas.SendWillRenderCanvases() および Canvas.BuildBatch() は、Canvas をルート ノードとして計算され、別の Canvas は別の Canvas に影響を与えません。ただし、多くの静的および動的な分離は Canvas のバッチ処理に影響するため、バトル UI とメイン インターフェイスをターゲットを絞った方法で分離できます。

ソースコードの再構築に影響を与える要因を表示する

トリガー SetLayoutDirty

グラフィック:

  1. protected override void OnRectTransformDimensionsChange(): UIBehavior を継承してコールバックを取得する限り、UI の RectTransform が変更されたときのコールバック

画像:

  1. protected override void OnCanvasHierarchyChanged(): 親キャンバスの状態が変更されました

文章:

  1. テキスト属性変更: カウントダウン関連、1 秒ごとに変更、リアルタイムで変更しない
  2. public bool supportRichText: リッチテキストを有効にするかどうかを設定するときに、ルールを切り替えます (前回とステータスが異なる場合に限り、開いた後のリアルタイム Dirty ではなく、SetLayoutDirty)
  3. public bool resizeTextForBestFit: テキストの自動リサイズを許可するかどうかを設定する場合、ルールを切り替えます
  4. public int resizeTextMinSize: 許可される最小テキスト サイズ
  5. public int resizeTextMaxSize: 最大テキスト サイズを設定します
  6. public TextAnchor 配置: RectTransform に対するテキストの位置。
  7. public int fontSize: テキストサイズ
  8. public Horizo​​ntalWrapMode horizo​​ntalOverflow: 水平オーバーフロー モード
  9. public VerticalWrapMode verticalOverflow: 垂直オーバーフロー モード
  10. public float lineSpacing: フォント行の高さの係数として指定される行間隔。値が 1 の場合、標準の行間隔が生成されます
  11. public FontStyle fontStyle: フォント スタイル

トリガー SetVerticesDirty: 頂点の変更

グラフィック:

  1. public virtual Color color: 色なので、素材のボールの色を変えるには画像の色を変えるのがベスト
  2. protected override void OnRectTransformDimensionsChange(): UIBehavior を継承してコールバックを取得する限り、UI の RectTransform が変更されたときのコールバック

画像:

  1. public 型 type:Simple,Sliced 等
  2. public bool preserveAspect: アスペクト比を維持するかどうか、ルールを切り替える
  3. パブリックブールフィルセンター
  4. public FillMethod fillMethod: 塗りつぶしモード
  5. public float fillAmount
  6. public bool fillClockwise
  7. public int fillOrigin
  8. public bool useSpriteMesh: 画像の透明部分を切り取る
  9. protected override void OnCanvasHierarchyChanged(): 親キャンバスが変更されました

生画像:

  1. パブリック テクスチャ テクスチャ
  2. public Rect uvRect

影の多い:

  1. public Color effectColor
  2. public Vector2 効果距離
  3. public bool useGraphicAlpha

文章:

  1. 公開仮想文字列テキスト
  2. public bool supportRichText
  3. public bool resizeTextForBestFit
  4. public int resizeTextMinSize
  5. public int resizeTextMaxSize
  6. public TextAnchor 配置
  7. public bool alignByGeometry: グリフ メトリックの代わりにセクションのグリフ ジオメトリを使用して水平方向の配置を実行します。
    これにより、左右の位置合わせが改善されますが、複数のフォント (プロのアウトライン フォントなど) をオーバーレイしようとすると、配置が正しくなくなる可能性があります。
  8. public int fontSize
  9. public Horizo​​ntalWrapMode horizo​​ntalOverflow
  10. public VerticalWrapMode verticalOverflow
  11. パブリックフロートラインの間隔
  12. public FontStyle fontStyle

Trigger SetMaterialDirty: マテリアルの変更

グラフィック:

  1. パブリック バーチャル マテリアル マテリアル

マスク:

  1. public bool showMaskGraphic:
  2. 保護されたオーバーライド void OnEnable()
  3. 保護されたオーバーライド void OnDisable()
  4. protected override void OnValidate():编辑器用

MaskableGraphic:

  1. パブリックブールマスク可能
  2. 保護されたオーバーライド void OnTransformParentChanged()
  3. protected override void OnCanvasHierarchyChanged()
  4. public virtual void RecalculateMasking(): この要素とすべての子要素のマスクを再計算します。

トリガー SetAllDirty、すべての変更

Image は Graphic から間接的に継承し、Sprite が変更されると、SetAllDirty 関数 SetAllDirty を呼び出して
タイミングを変更します

グラフィック:

  1. protected override void OnTransformParentChanged() 親オブジェクトが変更されました
  2. 保護されたオーバーライド void OnEnable()
  3. protected override void Reset(): デフォルト値を割り当てます。エディターでのみ有用で、無視できます
  4. protected override void OnDidApplyAnimationProperties(): アニメーション プロパティの変更
  5. protected override void OnValidate(): It will be called when the script is loaded or any value in the Inspector is modified. エディターでのみ有用であり、無視することができます

画像:

  1. static void RebuildImage(SpriteAtlas spriteAtlas) アトラスの変更
  2. スプライト プロパティの変更
  3. overrideSprite 画像を一時的に変更する
  4. public override void SetNativeSize() サイズを設定する

文章:

  1. public void FontTextureChanged(): フォント テクスチャが変更されます: TTF ダイナミック フォント、Unity はテキストが割り当てられるたびにテクスチャを生成し、各単語の UV 情報を保存します。その後、フォントを表示するときに、生成されたテクスチャから最終的なテクスチャを取得します。 UV情報に応じたテクスチャを画面上にレンダリング。
  2. フォント プロパティの変更

おすすめ

転載: blog.csdn.net/luoyikun/article/details/123699116
おすすめ