Cómo optimizar rápidamente el rendimiento de los juegos móviles
UGUI es el sistema de interfaz de usuario oficial de Unity. Integra soluciones de interfaz de usuario WYSIWYG, tiene muchas funciones y es fácil de usar, y su código fuente también está abierto para descargar: /resources/sample. -code /etcv1-texture-compression-and-alpha-channels/
6. Elimine nodos de UI, componentes de animación y recursos innecesarios
A medida que el proyecto se itera, puede haber algo de UI. Los nodos y animaciones no válidos deben eliminarse. En muchos proyectos, algunos estudiantes simplemente eliminan los nodos y animaciones no válidos para facilitar la finalización de las tareas. para ahorrar tiempo. Aunque esto no supondrá demasiada carga para la CPU durante el tiempo de ejecución, aumentará el tiempo de carga innecesario y el consumo de memoria durante la carga. Para los recursos de imágenes de UI abandonados, aunque no se colocan en el directorio de recursos y eventualmente no aparecerán en el paquete, seguirán apareciendo en la galería en modo editor, lo que afectará las decisiones de optimización. Escribí una herramienta para escanear recursos de textura de UI no utilizados. La dirección del código es /neoliang/FindUnUsedUITexture;
Además, para los scripts abandonados, es posible que todavía haya algunos objetos que contengan referencias a ellos, y cargar dichos objetos es. También lleva mucho tiempo, por lo que también escribí una herramienta para escanear scripts abandonados. La dirección del código es /neoliang/MissingMissingUITexture;
Además, para los scripts abandonados, todavía puede haber algunos El objeto contiene una referencia. cargarlo, y cargar dichos objetos también lleva mucho tiempo. neoliang/MissingFinder
3. Optimización de la CPU
En términos generales, para optimizar el rendimiento de la CPU, primero debe utilizar el generador de perfiles para localizar los puntos críticos de rendimiento, encontrar las funciones que consumen más y luego buscar. formas de reducir su consumo. Después de usar el generador de perfiles para analizar UGUI muchas veces, descubrí que una de las razones principales de su alto rendimiento de CPU es la reconstrucción de la cuadrícula de UI por parte de Canvs. Hay muchas situaciones que activan la reconstrucción de la cuadrícula de la interfaz de usuario a través de Canvas, como habilitar elementos de la interfaz de usuario como imágenes y texto, y cambiar los atributos de largo, ancho o color de los elementos de la interfaz de usuario. Canvas tiene más vértices de malla de interfaz de usuario. Si la malla de la interfaz de usuario en el lienzo tiene muchos vértices, la sobrecarga de CPU del proyecto será alta. En Profiler de Unity, esto equivale a que Canvas.SendWillRenderCanvases o Canvas.BuildBatch tomen demasiado tiempo.
La función principal de Canvas.BuildBatch es fusionar las cuadrículas de todos los elementos de la UI bajo el nodo Canvas. La cuadrícula fusionada se almacenará en caché y se volverá a fusionar solo cuando la cuadrícula de elementos de la UI debajo de ella cambie. . La razón principal por la que cambia la red de elementos de la interfaz de usuario es que el diseño o los gráficos se reconstruyen cuando se llama a Canvas.SendWillRenderCanvases. El diagrama de tiempo del proceso de llamada de función es el siguiente:
Este proceso lo ejecuta CanvasUpdateRegistry escuchando WillRenderCanvases de Canvas (1 en la figura anterior), principalmente para reconstruir el diseño y los gráficos marcados como sucios. La razón principal de los diseños y gráficos sucios son los cambios en los elementos de la interfaz de usuario bajo el árbol del lienzo (por ejemplo, agregar y eliminar objetos de la interfaz de usuario, vértices de elementos de la interfaz de usuario, tamaño de grabación, tamaño de grabación, etc.). vértices de elementos, cambios de tamaño de grabación, etc.) llama a Graphic.SetDirty (que en realidad termina llamando a CanvasUpdateRegistry.RegisterCanvasElementForLayoutRebuild).
Antes de reconstruir el diseño, los elementos en la cola de reconstrucción del diseño se ordenan según su profundidad en la jerarquía (2 en la figura anterior), con el resultado de que los nodos cercanos al nodo raíz se procesan primero.
Reconstruir el diseño (3), que ejecutará métodos en las interfaces ILayoutElement e ILayoutController para calcular la posición, el tamaño de Rect y otra información de diseño.
El gráfico rebulid (4) llama principalmente a UpdateGeometry para reconstruir los datos del vértice de la malla (5) y a UpdateMeterial para actualizar la información del material de CanvasRender (6).
De acuerdo con los principios de actualización de la cuadrícula de UGUI anteriores, podemos realizar las siguientes optimizaciones:
a. Utilice la menor cantidad de elementos de la interfaz de usuario posible; al crear una interfaz de usuario, asegúrese de verificar la jerarquía de la interfaz de usuario y eliminar los elementos de la interfaz de usuario innecesarios. Esto puede reducir el tiempo de clasificación en profundidad (2 en la imagen de arriba) y el tiempo de reconstrucción (3 en la imagen de arriba). ). y 4).
b. Separe los elementos dinámicos de la UI (aquellos elementos que cambian con frecuencia, como vértices, alfa, coordenadas, tamaños, etc.) de los elementos estáticos de la UI y colóquelos en lienzos específicos, reduciendo así la frecuencia de reconstrucción. .
c. Tenga cuidado al usar habilitar y deshabilitar elementos de la interfaz de usuario, ya que pueden desencadenar reconstrucciones que requieren mucho tiempo (3 y 4 en la figura). .
d. Tenga cuidado al utilizar la opción de mejor ajuste para el texto, que ajusta dinámicamente el tamaño de la fuente para que se ajuste al diseño de la interfaz de usuario sin salirse del cuadro, pero es costoso porque Unity generará primitivas para todos los tamaños de fuente. utilizado por el elemento, lo que no solo agrega tiempo de generación adicional sino que también agranda el atlas correspondiente a la fuente.