パフォーマンスの最適化は、再構築-ui

バージョン履歴

日付 説明 著者
2019年11月25日 0.1 文書の最初のバージョン 李6月

原則

  • プロセスの再構築
    • アウト正しく、材料メッシュcanvasrenderer
    • グラフィック再構築
    • グラフィックuguiに示す基底クラスで
    • イメージ画像
    • テキストテキスト

RectTransform.widthGraphic.OnRectTransformDimensionsChangeGraphic.SetVerticesDirtyCanvasUpdateRegistry.RegisterCanvasElementForGraphicRebuildCanvasUpdateRegistry.PerformUpdateGraphic.RebuildGraphic.UpdateGeometry&UpdateMaterialcanvasRenderer.SetMesh&SetMaterial&SetTexturegraph TB A [RectTransform.width] B [Graphic.OnRectTransformDimensionsChange] C [Graphic.SetVerticesDirty] D [CanvasUpdateRegistry.RegisterCanvasElementForGraphicRebuild] E [CanvasUpdateRegistry.PerformUpdate] F [ Graphic.Rebuild] G [Graphic.UpdateGeometry&UpdateMaterial] H [canvasRenderer.SetMesh&SetMaterial&SetTexture] A - > B B - > C C - > D D - > E E - > F F - > G G - > H

  • 再構築レイアウト
    • 計算サブノードrecttransfrom
    • ILayoutGroupレイアウトインタフェース
    • 基本クラスのレイアウトLayoutGroup
    • GridLayoutGroupグリッドレイアウト
    • Horizo​​ntalLayoutGroup水平レイアウト

RectTransform.OnRectTransformDimensionsChangeLayoutGroup.SetDirtyLayoutRebuilder.MarkLayoutForRebuildLayoutRebuilder.MarkLayoutRootForRebuildCanvasUpdateRegistry.TryRegisterCanvasElementForLayoutRebuildLayoutRebuilder.RebuildILayoutElement.CalculateLayoutInputHorizo​​ntal&SetLayoutHorizo​​ntal&CalculateLayoutInputVertical&SetLayoutVerticalgraph TB [RectTransform.OnRectTransformDimensionsChange] B [LayoutGroup.SetDirty] C [LayoutRebuilder.MarkLayoutForRebuild] D [LayoutRebuilder.MarkLayoutRootForRebuild] E [CanvasUpdateRegistry.TryRegisterCanvasElementForLayoutRebuild] F [LayoutRebuilder。リビルド] G [ILayoutElement.CalculateLayoutInputHorizo​​ntal&SetLayoutHorizo​​ntal&CalculateLayoutInputVertical&SetLayoutVertical] A - > B - > C - > D - > E - > F - > G

  • コアコードCanvasUpdateRegistry.PerformUpdate
private void PerformUpdate()
        {
            UISystemProfilerApi.BeginSample(UISystemProfilerApi.SampleType.Layout);
            CleanInvalidItems();
  m_PerformingLayoutUpdate = true;   m_LayoutRebuildQueue.Sort(s_SortLayoutFunction);  for (int i = 0; i <= (int)CanvasUpdate.PostLayout; i++)  {  for (int j = 0; j < m_LayoutRebuildQueue.Count; j++)  {  var rebuild = instance.m_LayoutRebuildQueue[j];  try  {  if (ObjectValidForUpdate(rebuild))  rebuild.Rebuild((CanvasUpdate)i);  }  catch (Exception e)  {  Debug.LogException(e, rebuild.transform);  }  }  }   for (int i = 0; i < m_LayoutRebuildQueue.Count; ++i)  m_LayoutRebuildQueue[i].LayoutComplete();   instance.m_LayoutRebuildQueue.Clear();  m_PerformingLayoutUpdate = false;   // now layout is complete do culling...  ClipperRegistry.instance.Cull();   m_PerformingGraphicUpdate = true;  for (var i = (int)CanvasUpdate.PreRender; i < (int)CanvasUpdate.MaxUpdateValue; i++)  {  for (var k = 0; k < instance.m_GraphicRebuildQueue.Count; k++)  {  try  {  var element = instance.m_GraphicRebuildQueue[k];  if (ObjectValidForUpdate(element))  element.Rebuild((CanvasUpdate)i);  }  catch (Exception e)  {  Debug.LogException(e, instance.m_GraphicRebuildQueue[k].transform);  }  }  }   for (int i = 0; i < m_GraphicRebuildQueue.Count; ++i)  m_GraphicRebuildQueue[i].GraphicUpdateComplete();   instance.m_GraphicRebuildQueue.Clear();  m_PerformingGraphicUpdate = false;  UISystemProfilerApi.EndSample(UISystemProfilerApi.SampleType.Layout);  }
  1. メッシュ内の合成canvaserenderバッチプロセスは、他のスレッドの処理は、無ソースコード、目に見えない存在であります
    1. 階層に従ってすべてcanvasrendererを取得します(深さ優先)
    2. ボトムアップトラバースリスト、および検出電流レンダラレンダラ交差点以下
      • 、ではないですか交差深さ= 0
      • 交差、実際には、depthiの最大深さは、それが検出されたバッチ、缶深さ= depthiはなく、深さ= depthi + 1か
    3. すべてのレンダラテクスチャIDによると、その後、同じ深さのマットIDに応じて、その深さの順序に基づいて、
    4. 場合は、フィット感バッチに隣接したバッチレンダラをすることができます

UI生産仕様

  • 原則として再構築>バッチ
  • 時間のかかるを短縮する回数を減らすReuild目標はdrawcallを減らす再構築します
  1. 異なる更新頻度の動きを分離する高周波同期における低周波同期キャンバス高周波の完全静電放電素子がキャンバスにキャンバスに異なるキャンバスキャンバスを分割しました
  2. 可能なレイアウトとしてわずか
  3. 限り階層に近い可能と同様、同一のフォント(同じサイズ)、アトラス
  4. あまりにも深い階層にならないでください

セットアップ

  • キャンバス

    • ピクセル完璧なチェックを外し 画像
  • 画像

    • レイキャストタイトな背景やボタン、入力ボックス 画像
  • テキスト

    • リッチテキストが頭上持って、ないようにしよう
    • ベストフィットを使用しないでください 画像

一般的な状況でのUIの契約

  1. 悪い治療がより多くのキャンバスを持っている傾向があるフルスクリーン・インターフェース、
  2. その他の同じ要素の、それは補助スクリプトがハングアップすることが推奨され、時間でより多くの目を覚ましコピー
  3. アニメーションでこの循環リストは、各アイテムの上にキャンバスを追加することを提案しています
  4. いくつかの提案への小道具グリッドは、最も完全なのすべてを使用しないでください
  5. マスクにしようとしないでください

指数

  • 多くの場合、メインインターフェイス<40
  • フルスクリーン・インターフェース<70
  • 非フルスクリーン・インターフェース<30

よくある質問

  • なぜあまりにも多くのノードが親ノードの数に基づいて、ソート再構築しているため

参照

https://blog.csdn.net/lingyun5905/article/details/84755092

おすすめ

転載: www.cnblogs.com/marcher/p/12161451.html