絵はどのように描かれるのか
Unity でレンダリングされるオブジェクトはメッシュで構成され、メッシュの描画単位はプリミティブ (点、線、三角形) であり、描画情報は Vertexhelper
クラスに格納され、頂点に加えて法線、UV、カラー、タンジェントが含まれます。
コンセプトの再構築
Canvas は、子ノードの UI 要素のグリッドをマージし、対応するレンダリング命令を生成し、それらを Unity のグラフィック パイプラインに送信するプロセスを担当します。したがって、Canvas は UI をレンダリングするコンポーネントであり、UI が変更されるとバッチが実行され、パフォーマンスに影響を与える原因となります。Canvas の Batch はその子ノードにのみ影響し、子 Canvas には影響しないことに注意してください。
プログラムの流れを再構築する
- 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);
- 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;
}
- PerformUpdate はレイアウト再構築キューを収集し、グラフィック再構築キューは ICanvasElement.Rebuild を呼び出して再構築を完了します。
再構築に参加する時期
レイアウト(Layout)、マテリアル(Material)、頂点(Vertices)を含む「ダーティデータ」を設定することで実現され、レイアウトがダーティに設定されている場合はレイアウトが再構築され、頂点またはマテリアルがダーティに設定されている場合は再構築されます。 、グラフィックが再構築されます。レイアウトの再構築は m_LayoutRebuildQueue に追加され、グラフィックの再構築は m_GraphicRebuildQueue に追加され、呼び出されるのを待ちます。
SetLayoutDirty: レイアウト再構築キューに追加
SetVerticesDirty、SetMaterialDirty: グラフィック再構築キューに追加されたマテリアル、頂点変換
レイアウトの再構築: 位置またはサイズ;
画像再構成:頂点変更、素材変更(サイズ、回転、テキスト変更、画像修正)
最適化
主な目標は、プロファイルの Canvas.SendWillRenderCanv パラメータを減らすことです。頂点の数、頂点の変更などを制限することによって。
-
テキスト属性の変更 (「123」->「1234」)、SetLayoutDirty のトリガー: カウントダウンに関連、1 秒ごとに変更、リアルタイムで変更しない
-
テキスト、画像の色を変更し、SetVerticesDirty (頂点の変更) をトリガーします。画像の色を変更する最良の方法は、シェーダーの色を変更することです。
-
レイアウト コンポーネントが再構築の問題を引き起こしている
-
テキスト ストローク、シャドウ パフォーマンスの問題
1 文字で 4 つの頂点が生成されます。
シャドウを追加すると、テキストを再度コピーして 8 つの頂点を生成することと同等であり、
アウトラインではテキストを 4 回コピーして 20 の頂点を生成します。
対応するシェーダーに置き換えます -
テキストグラデーション
-
イメージ形式の選択
イメージ: 頂点の数はイメージ タイプの選択によって異なります。
①シンプルな4頂点
②Sliced:FillCenterにチェックを入れ頂点数36、チェック無し32
③TiledはRectranformの設定サイズと元画像のサイズに依存し、N個の画像を4×Nにロールアウト
④Filled多くの比較を選択しますが、少なくとも 4 つです。
したがって、イメージにはシンプル モードが優先され、次にスライス モードが優先され、FillCenter はチェックされません。 -
動的および静的分離: Canvas.SendWillRenderCanvases() および Canvas.BuildBatch() は、Canvas をルート ノードとして計算され、別の Canvas は別の Canvas に影響を与えません。ただし、多くの静的および動的な分離は Canvas のバッチ処理に影響するため、バトル UI とメイン インターフェイスをターゲットを絞った方法で分離できます。
ソースコードの再構築に影響を与える要因を表示する
トリガー SetLayoutDirty
グラフィック:
- protected override void OnRectTransformDimensionsChange(): UIBehavior を継承してコールバックを取得する限り、UI の RectTransform が変更されたときのコールバック
画像:
- protected override void OnCanvasHierarchyChanged(): 親キャンバスの状態が変更されました
文章:
- テキスト属性変更: カウントダウン関連、1 秒ごとに変更、リアルタイムで変更しない
- public bool supportRichText: リッチテキストを有効にするかどうかを設定するときに、ルールを切り替えます (前回とステータスが異なる場合に限り、開いた後のリアルタイム Dirty ではなく、SetLayoutDirty)
- public bool resizeTextForBestFit: テキストの自動リサイズを許可するかどうかを設定する場合、ルールを切り替えます
- public int resizeTextMinSize: 許可される最小テキスト サイズ
- public int resizeTextMaxSize: 最大テキスト サイズを設定します
- public TextAnchor 配置: RectTransform に対するテキストの位置。
- public int fontSize: テキストサイズ
- public HorizontalWrapMode horizontalOverflow: 水平オーバーフロー モード
- public VerticalWrapMode verticalOverflow: 垂直オーバーフロー モード
- public float lineSpacing: フォント行の高さの係数として指定される行間隔。値が 1 の場合、標準の行間隔が生成されます
- public FontStyle fontStyle: フォント スタイル
トリガー SetVerticesDirty: 頂点の変更
グラフィック:
- public virtual Color color: 色なので、素材のボールの色を変えるには画像の色を変えるのがベスト
- protected override void OnRectTransformDimensionsChange(): UIBehavior を継承してコールバックを取得する限り、UI の RectTransform が変更されたときのコールバック
画像:
- public 型 type:Simple,Sliced 等
- public bool preserveAspect: アスペクト比を維持するかどうか、ルールを切り替える
- パブリックブールフィルセンター
- public FillMethod fillMethod: 塗りつぶしモード
- public float fillAmount
- public bool fillClockwise
- public int fillOrigin
- public bool useSpriteMesh: 画像の透明部分を切り取る
- protected override void OnCanvasHierarchyChanged(): 親キャンバスが変更されました
生画像:
- パブリック テクスチャ テクスチャ
- public Rect uvRect
影の多い:
- public Color effectColor
- public Vector2 効果距離
- public bool useGraphicAlpha
文章:
- 公開仮想文字列テキスト
- public bool supportRichText
- public bool resizeTextForBestFit
- public int resizeTextMinSize
- public int resizeTextMaxSize
- public TextAnchor 配置
- public bool alignByGeometry: グリフ メトリックの代わりにセクションのグリフ ジオメトリを使用して水平方向の配置を実行します。
これにより、左右の位置合わせが改善されますが、複数のフォント (プロのアウトライン フォントなど) をオーバーレイしようとすると、配置が正しくなくなる可能性があります。 - public int fontSize
- public HorizontalWrapMode horizontalOverflow
- public VerticalWrapMode verticalOverflow
- パブリックフロートラインの間隔
- public FontStyle fontStyle
Trigger SetMaterialDirty: マテリアルの変更
グラフィック:
- パブリック バーチャル マテリアル マテリアル
マスク:
- public bool showMaskGraphic:
- 保護されたオーバーライド void OnEnable()
- 保護されたオーバーライド void OnDisable()
- protected override void OnValidate():编辑器用
MaskableGraphic:
- パブリックブールマスク可能
- 保護されたオーバーライド void OnTransformParentChanged()
- protected override void OnCanvasHierarchyChanged()
- public virtual void RecalculateMasking(): この要素とすべての子要素のマスクを再計算します。
トリガー SetAllDirty、すべての変更
Image は Graphic から間接的に継承し、Sprite が変更されると、SetAllDirty 関数 SetAllDirty を呼び出して
タイミングを変更します
グラフィック:
- protected override void OnTransformParentChanged() 親オブジェクトが変更されました
- 保護されたオーバーライド void OnEnable()
- protected override void Reset(): デフォルト値を割り当てます。エディターでのみ有用で、無視できます
- protected override void OnDidApplyAnimationProperties(): アニメーション プロパティの変更
- protected override void OnValidate(): It will be called when the script is loaded or any value in the Inspector is modified. エディターでのみ有用であり、無視することができます
画像:
- static void RebuildImage(SpriteAtlas spriteAtlas) アトラスの変更
- スプライト プロパティの変更
- overrideSprite 画像を一時的に変更する
- public override void SetNativeSize() サイズを設定する
文章:
- public void FontTextureChanged(): フォント テクスチャが変更されます: TTF ダイナミック フォント、Unity はテキストが割り当てられるたびにテクスチャを生成し、各単語の UV 情報を保存します。その後、フォントを表示するときに、生成されたテクスチャから最終的なテクスチャを取得します。 UV情報に応じたテクスチャを画面上にレンダリング。
- フォント プロパティの変更