La position actuelle:Accueil du site>Unity3d: ugui source, Rebuild Optimization
Unity3d: ugui source, Rebuild Optimization
2022-07-23 12:40:53【Plume 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
- 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);
- 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;
}
- 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 .
textModification des attributs(“123”–>“1234”),DéclencheurSetLayoutDirty: Compte à rebours. ,Selon1sChangement, Ne pas changer en temps réel
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
layout Composants causant des problèmes de reconstruction
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 leshaderRemplacertextGradient
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é FillCenterSé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:
- protected override void OnRectTransformDimensionsChange():QuandUIDeRectTransform Rappel au changement ,Hérite.UIBehavior Le rappel est disponible
Image:
- protected override void OnCanvasHierarchyChanged(): Changement d'état de la toile mère
Text:
- textModification des attributs: Compte à rebours. ,Selon1sChangement, Ne pas changer en temps réel
- 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)
- public bool resizeTextForBestFit: Définir si le texte peut être automatiquement redimensionné en heures , Règle de commutation
- public int resizeTextMinSize: Taille minimale admissible du texte
- public int resizeTextMaxSize: Définir la taille maximale du texte
- public TextAnchor alignment: Texte relatif RectTransform Positionnement de.
- public int fontSize:Taille du texte
- public HorizontalWrapMode horizontalOverflow: Mode de débordement horizontal
- public VerticalWrapMode verticalOverflow: Mode de débordement vertical
- 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
- public FontStyle fontStyle:Style de police
DéclencheurSetVerticesDirty: Changement de vertex
Graphic:
- public virtual Color color:Couleur, Donc changer la couleur de l'image est préférable changer la couleur de l'ombre
- protected override void OnRectTransformDimensionsChange():QuandUIDeRectTransform Rappel au changement ,Hérite.UIBehavior Le rappel est disponible
Image:
- public Type type:Simple,SlicedAttendez.
- public bool preserveAspect: Maintenir le rapport d'aspect , Règle de commutation
- public bool fillCenter
- public FillMethod fillMethod:Mode de remplissage
- public float fillAmount
- public bool fillClockwise
- public int fillOrigin
- public bool useSpriteMesh: Culture de la partie transparente de l'image
- protected override void OnCanvasHierarchyChanged(): Changement de toile parent
RawImage:
- public Texture texture
- public Rect uvRect
Shadow:
- public Color effectColor
- public Vector2 effectDistance
- public bool useGraphicAlpha
Text:
- public virtual string text
- public bool supportRichText
- public bool resizeTextForBestFit
- public int resizeTextMinSize
- public int resizeTextMaxSize
- public TextAnchor alignment
- 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. - public int fontSize
- public HorizontalWrapMode horizontalOverflow
- public VerticalWrapMode verticalOverflow
- public float lineSpacing
- public FontStyle fontStyle
DéclencheurSetMaterialDirty: Changement de matériau
Graphic:
- public virtual Material material
Mask:
- public bool showMaskGraphic:
- protected override void OnEnable()
- protected override void OnDisable()
- protected override void OnValidate():Pour l'éditeur
MaskableGraphic:
- public bool maskable
- protected override void OnTransformParentChanged()
- protected override void OnCanvasHierarchyChanged()
- 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:
- protected override void OnTransformParentChanged() Changement d'objet parent
- protected override void OnEnable()
- protected override void Reset(): Assigner les valeurs par défaut , Disponible uniquement sous l'éditeur ,Ça peut être ignoré.
- protected override void OnDidApplyAnimationProperties(): Modification des attributs d'animation
- 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:
- static void RebuildImage(SpriteAtlas spriteAtlas) Changement d'Atlas
- spriteModification des attributs
- overrideSprite Modifier temporairement l'image
- public override void SetNativeSize() Définir la taille
Text:
- 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 .
- 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é par sidebar
- Approfondir la file d'attente des conteneurs
- Méthode de rappel d'initialisation pour Bean et méthode de rappel pour libérer les ressources
- Enregistrer les données crawler dans la base de données MySQL
- Distribution des données via SQL
- Comment renouveler automatiquement les serrures distribuées redis (solution classique)
- Hongke Dynamics | cippe2022 est sur le point de se tenir, l'inscription est en cours
- Classe interne anonyme de kotlin (objet: XXXX)
- Interview raid: 6 grandes différences entre truncate, delete et Drop
- Ubuntu installe docker et les commandes de base de docker installent MySQL
- Leetcode - - Stack and queue articles
Devinez que vous aimez
Déploiement du cluster etcd
Dix problèmes dans la famille de protocoles TCP / IP
【 stm32 learning】 (21) stm32 Implementing Stepper Motor
Dessiner le tableau [grafana] avec les variables des critères de requête
Reconnaître les interfaces
LabVIEW: créer un VI
Cadre de développement de l'interface devextreme Gantt Control - Exporter PDF, trier les tâches
Exportation et importation de bases de données et de tableaux de données en ligne de commande MySQL
Easyeeagle, une plate - forme intelligente d'exploitation et de maintenance avec plusieurs plateformes de base de données massives
Vous souvenez - vous de offsetwidth, clientwidth, width, scrollwidth, clientx, screenx, offsetx, pagex dans JS?
Recommandé au hasard
- 【 Azure Event center】 Azure Event hub New Function attempt - GEO Disaster Recovery
- Quels sont les facteurs qui influent sur la prestation continue?
- 【 Tutoriel de démarrage rapide 7】 utilisation et introduction de l'ordinateur hôte de la station au sol de l'UAV en formation de coquille folle · Open Source
- Détails de la configuration redis
- Docker installe MySQL, redis
- Le circuit de limitation d'amplitude et le circuit de serrage utilisent la conductivité unidirectionnelle de la diode
- [carte des connaissances] cql et py2neo notes d'apprentissage
- C apprentissage des langues
- Application combinée de la ligne de transfert de colonne et de l'ensemble de données dans le scénario d'affaires
- Configuration SSL MySQL 5.6 / 5.7
- [apprentissage profond] fonction de perte (erreur absolue moyenne, erreur carrée moyenne, perte de lissage, entropie croisée, entropie croisée pondérée, perte de dé, focalloss)
- Optimisation de précision * stratégie d'optimisation 1: Réseau + optimiseur Sam
- Détails du Protocole Axi
- JS - - date Object & Ternary expression
- Leetcode - 494. Objectifs et
- L'interface utilisateur 3D ou le modèle dans l'unit é fait toujours face à la caméra et tourne avec l'angle de vue de la caméra 丨 l'angle de vue suit 丨 l'angle de vue fixe
- Discussion préliminaire sur JVM
- Déploiement de l'environnement appium pour les tests mobiles [à poursuivre]
- À propos du montage de fond, de la gestion des processus
- Lire la lecture efficace - l'auto - investissement le plus rentable
- Transplantation de systèmes embarqués
- Saisissez une chaîne de caractères à partir du clavier et affichez différents caractères et le nombre d'occurrences de chaque caractère. (la sortie n'est pas séquentielle) résoudre le problème en utilisant la méthode commune de la classe de chaîne
- 2019 Bar _ Aaai ICCN
- Conditions affectant la vitesse de requête de l'interface
- Stack et file d'attente de l'adaptateur STL
- Analyse de la stratégie de lecture et d'écriture du cache
- Classes et objets (1)
- Expérience II Yuv
- Comment synchroniser
- [arxiv2022] grouptransnet: Group transformer Network for RGB - D Salient Object Detection
- Avantages de la salle des machines bgp
- La fosse Piétinée par l'homme vous dit d'éviter les 10 erreurs courantes dans les tests automatisés
- Déterminer s'il s'agit d'un type vide
- Langue C - quelques exercices classiques de langue C
- Openvino Datawhale
- Question 300 Leçon 6 type quadratique
- Analyse du code source et de la conception de redis - - 7. Liste rapide
- Concepts et différences de bits, bits, octets et mots
- Déploiement du projet (version abrégée)
- JDBC Learning and simple Encapsulation