La position actuelle:Accueil du site>Unity3d: ugui source, Rebuild Optimization

Unity3d: ugui source, Rebuild Optimization

2022-07-23 12:40:53Plume debout du quatrième soir

ImageComment dessiner

UnityLes objets rendus sont tous des mailles(Mesh)Composition,Et la cellule de dessin du maillage est l'élément(Point、Ligne、Triangle)
Les informations de dessin sont stockées dansVertexhelperDans la classe,Sauf les sommets,Y compris les normales、UV、Couleur、Tangente.

RebuildConcept

CanvasResponsable de la mise en place du noeud EnfantUIFusion de mailles d'éléments,Et générer les instructions de rendu appropriées à envoyer àUnityProcessus de pipeline graphique pour.Alors...CanvasC'est le renduUIComposants de,QuandUILe changement est effectué une foisBatch,C'est le principal facteur de performance.Attention!CanvasDeBatchN'affecte que ses noeuds enfants,Mais ça n'affectera pas son filsCanvas.

RebuildProcédures pour

  1. Image,TextC'est l'héritage.Graphic,GraphicOui.ICanvasElementInterface,RéalisationrebuildFonctions
   public interface ICanvasElement
   {
    
       /// <summary>
       /// Rebuild the element for the given stage.
       /// </summary>
       /// <param name="executing">The current CanvasUpdate stage being rebuild.</param>
       /// // SelonCanvasUpdate Les différentes étapes de la reconstruction des éléments 
       void Rebuild(CanvasUpdate executing);
  1. CanvasUpdateRegistryÉcouterCanvasDewillRenderCanvasesÉvénements, Cet événement est appelé chaque image avant le rendu
   public class CanvasUpdateRegistry
   {
    
         // Mise en page de la file d'attente de reconstruction ,QuandUI Mettre en file d'attente les éléments dont la disposition doit être mise à jour 
       private readonly IndexedSet<ICanvasElement> m_LayoutRebuildQueue = new IndexedSet<ICanvasElement>();

       // File d'attente de reconstruction de dessin ,QuandUI Mettre en file d'attente l'image de l'élément lorsqu'elle doit être mise à jour 
       private readonly IndexedSet<ICanvasElement> m_GraphicRebuildQueue = new IndexedSet<ICanvasElement>();

       protected CanvasUpdateRegistry()
       {
    
           //J'écoute.CanvasDewillRenderCanvasesÉvénements, Cet événement est appelé chaque image avant le rendu 
           Canvas.willRenderCanvases += PerformUpdate;
       }
  1. PerformUpdate Collecte des files d'attente de reconstruction de mise en page , Appel de la file d'attente de reconstruction graphique ICanvasElement.Rebuild Achèvement de la reconstruction

Quand rejoindre la reconstruction

Via les paramètres“Données sales”Réalisé,Inclure la disposition(Layout)、Matériaux(Material)Et les sommets(Vertices)Trois Parties, Mise en page sale , La mise en page sera reconstruite , Pour rendre les sommets ou les matériaux sales , Reconstruction du dessin . La reconstruction de la mise en page s'ajoute à m_LayoutRebuildQueueMoyenne, La reconstruction graphique s'ajoute à m_GraphicRebuildQueueMoyenne,Attendre d'être appelé.
SetLayoutDirty: Rejoignez la file d'attente de reconstruction de mise en page
SetVerticesDirty,SetMaterialDirty:Matériaux, Les transformations Vertex sont ajoutées à la file d'attente de reconstruction graphique

Reconstruction de la disposition: Emplacement ou taille ;

Reconstruction d'images: Changement de vertex ,Changement de matériau(Taille, Rotation et changement de texte 、Modification de l'image)

Optimisation

Principaux objectifs,Prends ça.Profile- Oui.Canvas.SendWillRenderCanvRéduction des paramètres. En limitant le nombre de sommets , Changement de vertex, etc .

  1. textModification des attributs(“123”–>“1234”),DéclencheurSetLayoutDirty: Compte à rebours. ,Selon1sChangement, Ne pas changer en temps réel

  2. Modifier le texte,Couleur de l'image,DéclencheurSetVerticesDirty( Changement de vertex ), Donc changer la couleur de l'image est préférable changer la couleur de l'ombre

  3. layout Composants causant des problèmes de reconstruction

  4. text Tracé, Problèmes de performance des ombres
    Génération d'un caractère 4Les sommets,
    Si vous ajoutezShadow C'est l'équivalent Text Copié une fois. 8- Oui.,
    OutlineIl vaTextCopier4 Génération universelle 20Les sommets.
    Utiliser leshaderRemplacer

  5. textGradient

  6. ImageChoix du format
    Image: Le nombre de sommets dépend Image TypeLe choix de.
    ①Simple 4 Les sommets;
    ②Sliced CocherFillCenter Le nombre de sommets est 36 - Oui., Non coché oui 32 - Oui.;
    ③Tiled Dépend deRectranform Taille définie et taille originale , C'est parti. N Le tableau est 4*N - Oui.;
    ④Filled Plus de choix, Mais au moins, oui. 4- Oui..
    Donc, pourImagePréféréSimple Le modèle suivant est Sliced Mode et non coché FillCenter

  7. Séparation dynamique et statique :Canvas.SendWillRenderCanvases()AvecCanvas.BuildBatch() Est calculé comme suit: Canvas Pour le noeud racine ,C'est différent.CanvasÇa n'affectera pas l'autre.Canvas.Mais, Une grande quantité de séparation dynamique et statique affecte CanvasApprobation conjointe, Pour pouvoir cibler le combat UI, Séparation de l'interface principale

Voir les facteurs d'influence de la reconstruction dans le code source

DéclencheurSetLayoutDirty

Graphic:

  1. protected override void OnRectTransformDimensionsChange():QuandUIDeRectTransform Rappel au changement ,Hérite.UIBehavior Le rappel est disponible

Image:

  1. protected override void OnCanvasHierarchyChanged(): Changement d'état de la toile mère

Text:

  1. textModification des attributs: Compte à rebours. ,Selon1sChangement, Ne pas changer en temps réel
  2. public bool supportRichText: Définir si le texte riche est activé , Règle de commutation ( Tant que l'état est différent de la dernière fois ,SetLayoutDirtyUn instant., Pas en temps réel après ouverture Dirty)
  3. public bool resizeTextForBestFit: Définir si le texte peut être automatiquement redimensionné en heures , Règle de commutation
  4. public int resizeTextMinSize: Taille minimale admissible du texte
  5. public int resizeTextMaxSize: Définir la taille maximale du texte
  6. public TextAnchor alignment: Texte relatif RectTransform Positionnement de.
  7. public int fontSize:Taille du texte
  8. public HorizontalWrapMode horizontalOverflow: Mode de débordement horizontal
  9. public VerticalWrapMode verticalOverflow: Mode de débordement vertical
  10. public float lineSpacing:Espacement des lignes, Spécifiez un facteur pour la hauteur de la ligne de police .La valeur est: 1 L'espacement standard des lignes sera généré lorsque
  11. public FontStyle fontStyle:Style de police

DéclencheurSetVerticesDirty: Changement de vertex

Graphic:

  1. public virtual Color color:Couleur, Donc changer la couleur de l'image est préférable changer la couleur de l'ombre
  2. protected override void OnRectTransformDimensionsChange():QuandUIDeRectTransform Rappel au changement ,Hérite.UIBehavior Le rappel est disponible

Image:

  1. public Type type:Simple,SlicedAttendez.
  2. public bool preserveAspect: Maintenir le rapport d'aspect , Règle de commutation
  3. public bool fillCenter
  4. public FillMethod fillMethod:Mode de remplissage
  5. public float fillAmount
  6. public bool fillClockwise
  7. public int fillOrigin
  8. public bool useSpriteMesh: Culture de la partie transparente de l'image
  9. protected override void OnCanvasHierarchyChanged(): Changement de toile parent

RawImage:

  1. public Texture texture
  2. public Rect uvRect

Shadow:

  1. public Color effectColor
  2. public Vector2 effectDistance
  3. public bool useGraphicAlpha

Text:

  1. public virtual string text
  2. public bool supportRichText
  3. public bool resizeTextForBestFit
  4. public int resizeTextMinSize
  5. public int resizeTextMaxSize
  6. public TextAnchor alignment
  7. public bool alignByGeometry: Effectuer un alignement horizontal en utilisant la géométrie du champ de la section , Au lieu d'un glyphe .
    Cela peut conduire à un meilleur alignement à gauche et à droite , Mais cela peut entraîner un positionnement incorrect lorsque vous essayez d'écraser plusieurs polices ( Comme la police de contour professionnelle )Allez.
  8. public int fontSize
  9. public HorizontalWrapMode horizontalOverflow
  10. public VerticalWrapMode verticalOverflow
  11. public float lineSpacing
  12. public FontStyle fontStyle

DéclencheurSetMaterialDirty: Changement de matériau

Graphic:

  1. public virtual Material material

Mask:

  1. public bool showMaskGraphic:
  2. protected override void OnEnable()
  3. protected override void OnDisable()
  4. protected override void OnValidate():Pour l'éditeur

MaskableGraphic:

  1. public bool maskable
  2. protected override void OnTransformParentChanged()
  3. protected override void OnCanvasHierarchyChanged()
  4. public virtual void RecalculateMasking(): Recalculer le masque pour cet élément et tous les éléments enfants .

DéclencheurSetAllDirty,Changement total

ImageIndirectement hérité deGraphic,Quand ilSpriteEn cas de changement,AppelleSetAllDirtyFonctions
SetAllDirty Changer le timing

Graphic:

  1. protected override void OnTransformParentChanged() Changement d'objet parent
  2. protected override void OnEnable()
  3. protected override void Reset(): Assigner les valeurs par défaut , Disponible uniquement sous l'éditeur ,Ça peut être ignoré.
  4. protected override void OnDidApplyAnimationProperties(): Modification des attributs d'animation
  5. protected override void OnValidate(): Chargement du script ou Inspector Appelé lorsque l'une des valeurs est modifiée , Disponible uniquement sous l'éditeur ,Ça peut être ignoré.

Image:

  1. static void RebuildImage(SpriteAtlas spriteAtlas) Changement d'Atlas
  2. spriteModification des attributs
  3. overrideSprite Modifier temporairement l'image
  4. public override void SetNativeSize() Définir la taille

Text:

  1. public void FontTextureChanged(): Texture de police modifiée :TTFPolices dynamiques,Text À chaque affectation Unity Génère une carte , Et enregistrer chaque mot UVInformation, La police est affichée selon UV L'information est extraite de la carte générée et finalement rendue à l'écran .
  2. fontChangement de propriété

Mentions de copyright
Auteur de cet article [Plume debout du quatrième soir],Réimpression s’il vous plaît apporter le lien vers l’original, merci
https://fra.chowdera.com/2022/204/202207230540018823.html

Recommandé au hasard