Serie de optimización UGUI (1) ------ concepto básico

Esta serie es para aprender la solución general de UGUI de Siki Academy: notas de optimización (Unity 2019.1.0f2)


dirección de github: https://github.com/BlueMonk1107/UGUISolution
atlas dirección del algoritmo de bloque: https://github.com/DaVikingCode/UnityRuntimeSpriteSheetsGenerator
sitio web oficial de texturepacker: https://www.codeandweb.com/texturepacker


1. Conceptos básicos

1. La interfaz de usuario se dibuja mediante una cuadrícula

Tanto el 3D como el 2D se dibujan mediante una cuadrícula, pero la complejidad es diferente.
Vea la cuadrícula en unidad:
imagen.png
puede ver la cuadrícula de texto recién creada.

2.DrallCall

Resumen de optimización del rendimiento de Unity, punto 2

3. Tasa de llenado

La tasa de relleno de píxeles se refiere a la cantidad de píxeles generados por la unidad de procesamiento de gráficos por segundo. La unidad es MPixel/S (megapíxeles por segundo) o GPixel/S (gigapíxeles por segundo), que se utiliza para medir la tarjeta gráfica actual. La medida más común del rendimiento del procesamiento de píxeles. La canalización de representación de la tarjeta gráfica es una parte importante del núcleo de la pantalla. Es un conjunto de canales especiales en el núcleo de la pantalla responsables de hacer coincidir los colores con los gráficos. Cuantas más canalizaciones de representación, mayor será la frecuencia de trabajo de cada grupo de canalizaciones (generalmente la frecuencia central de la tarjeta gráfica), mayor será la tasa de llenado de la tarjeta gráfica dibujada y mayor será el rendimiento de la tarjeta gráfica, por lo que puede ser lleno de los píxeles de la tarjeta gráfica El rendimiento de la tarjeta gráfica se puede juzgar aproximadamente por la velocidad.
Resolución: los píxeles del ancho y el alto de toda la pantalla, cuantos más píxeles, más clara y delicada es la imagen de la pantalla

4. Lote (procesamiento por lotes)

Resumen de optimización del rendimiento de Unity, un punto 4
**

2. Componentes básicos

1. Lienzo: el objeto principal de la interfaz de usuario, que dibuja la interfaz de usuario en la pantalla

Primero procese por lotes sus subobjetos, fusione los lotes y luego envíe las instrucciones de renderizado al sistema de gráficos de Unity (obtenga la geometría del componente a través de CanvasRender)

# 封装的C++类
public sealed class Canvas : Behaviour 

2. Gráfico: los componentes que pueden dibujar figuras geométricas deben heredar Gráfico

El gráfico hereda la interfaz ICanvasElement, lo que significa que este componente debe ser un objeto secundario del lienzo. Si no se coloca debajo del lienzo, no se puede realizar la reconstrucción normal de la malla (la interfaz ICanvasElement contiene el método Rebuild).

public abstract class Graphic : UIBehaviour, ICanvasElement

1).sucio: marca sucia

Si la malla se ha modificado, si se modifica, se marcará y debe reconstruirse, para que se puedan mostrar los modificados. Lo
principal a lo que se debe prestar atención es Diseño/Material/Vértices.
imagen.png

2).MaskableGraphic: una subclase más importante de Gráfico

MaskableGraphic hereda IMaskable, los componentes de la interfaz de usuario que heredan esta clase se pueden bloquear, como Imagen/Texto

public abstract class MaskableGraphic : Graphic, IClippable, IMaskable, IMaterialModifier

3).LayoutRebuilder: ordenar

public class LayoutRebuilder : ICanvasElement
此类中会调用:CanvasUpdateRegistry中的TryRegisterCanvasElementForLayoutRebuild方法
private static void MarkLayoutRootForRebuild (RectTransform controller)
{
    
    
    if (!(controller == null)) {
    
    
        LayoutRebuilder layoutRebuilder = s_Rebuilders.Get ();
        layoutRebuilder.Initialize (controller);
        if (!CanvasUpdateRegistry.TryRegisterCanvasElementForLayoutRebuild (layoutRebuilder)) {
    
    
            s_Rebuilders.Release (layoutRebuilder);
        }
    }
}
CanvasUpdateRegistry中会将此元素加入重建队列中
public static bool TryRegisterCanvasElementForLayoutRebuild (ICanvasElement element)
{
    
    
	return instance.InternalRegisterCanvasElementForLayoutRebuild (element);
}
private bool InternalRegisterCanvasElementForLayoutRebuild (ICanvasElement element)
{
    
    
	if (m_LayoutRebuildQueue.Contains (element)) {
    
    
		return false;
	}
	return m_LayoutRebuildQueue.AddUnique (element);
}

Aquellos que se pueden ordenar heredarán ILayoutElement (Imagen/Texto):

public class Image : MaskableGraphic, ISerializationCallbackReceiver, 
ILayoutElement, ICanvasRaycastFilter

Se recomienda evitar el uso de componentes de clasificación automática ya que el costo de reconstrucción es muy alto.

4).CanvasUpdateRegistro

Responsable del registro de las actualizaciones de Canvas, si es necesario reconstruir otras clases es llamar al método en esta clase

protected CanvasUpdateRegistry ()
{
    
    
    Canvas.willRenderCanvases += PerformUpdate;
}
# PerformUpdate中会进行Layout重建/Graphic重建

3. La diferencia entre la implementación de las dos máscaras.

1 máscara

剪切逻辑在GetModifiedMaterial方法中 : 主要实现的效果是模板(stencil)缓存

2.RectMask2D

Máscara 2D, heredando la interfaz IClipper de la parte recortada

public class RectMask2D : UIBehaviour, IClipper, ICanvasRaycastFilter
#IClipper主要方法是PerformClipping : 实现剪切逻辑

Debido a que la implementación es diferente, el rendimiento en el proceso de optimización posterior también es diferente.

Referencia: código fuente UGUI

Supongo que te gusta

Origin blog.csdn.net/dengshunhao/article/details/105404021
Recomendado
Clasificación