Cómo leer el perfilador de Unity
- Incluso si te cuento todo, no necesariamente lo usarás todo.
A.WaitForTargetFPS:
Función Vsync, utilizada para mostrar el tiempo de espera de la CPU del fotograma actual
B. Gastos generales:
Tiempo de sobrecarga de Profiler: la suma de todos los tiempos registrados para un solo proyecto. Se utiliza para registrar el consumo de tiempo no especificado para ayudar a refinar aún más las estadísticas del generador de perfiles.
C. Physics.Simulate:
Simulación física del tiempo de uso de la CPU para el fotograma actual.
D. Camera.Render:
Tiempo de uso de la CPU para la preparación del renderizado de la cámara
E. RenderTexture.SetActive:
Establecer la operación de RenderTexture .
Implementación subyacente: 1. Compare ColorSurface y DepthSurface del fotograma actual con el fotograma anterior.
2. Si los dos buffers son consistentes, no se generará ningún RT nuevo; de lo contrario, se generará un RT nuevo y se establecerá la ventana gráfica y la matriz de transformación espacial correspondientes.
F. Monobehaviour.OnMouse_:
Se utiliza para detectar la recepción y retroalimentación de la información de entrada del mouse, que incluye principalmente:
1: SendMouseEvents y DoSendMouseEvents. (Mientras Edtor esté abierto, existirá)
G. HandleUtility.HandleUtility.SetViewInfo:
Solo se usa en el editor para habilitar la interfaz gráfica de usuario y mostrar en el editor Consistente con la visualización en la versión de lanzamiento.
H. GUI.Repaint:
Repintar la interfaz gráfica de usuario (indica el uso de OnGUI local cuando esté disponible)
I. Event.Internal_MakeMasterEventCurrent:
Responsable de la mensajería en la GUI
J. Limpieza de datos de caché no utilizados:
Limpia datos de caché inútiles, incluida principalmente la recolección de basura de RenderBuffer y la recolección de basura de TextRendering.
1.RenderTexture.GarbageCollectTemporary: existe en la recolección de basura de RenderBuffer y se usa para limpiar FreeTexture temporal.
K. Aplicación. Integrar activos en segundo plano:
Recorra la cola de subprocesos precargada y complete la carga, mientras completa la carga de texturas, actualización de Sustancia, etc.
L.Aplicación.
L. Application.LoadLevelAsync Integración:
El uso de CPU para cargar la escena, generalmente 70%. Si tarda demasiado, es porque la textura tarda demasiado.
M. UnloadScene (descargar escena):
Descarga GameObjects, Components y GameManager en la escena, generalmente utilizado al cambiar de escena.
N. CollectGameObjectObjects:
Al ejecutar la M anterior, los GameObjects y los componentes de la escena se recopilarán en una matriz.
O. Destruir:
Destruye el uso de CPU de los objetos y componentes del juego.
P. AssetBundle.LoadAsync Integración:
Los subprocesos múltiples cargan el contenido de AwakeQueue, es decir, los subprocesos múltiples ejecutan la función AwakeFromLoad del recurso.
P. Loading.AwakeFromLoad:
Después de cargar el recurso, se procesan las llamadas para cada recurso y su aplicación emparejada.
2.Uso de la CPU
A. Dispositivo.
B. Graphics.PresentAndSync:
Visualización que requiere mucho tiempo y sincronización vertical en la GPU. Esta opción aparece en versión.
C. Mesh.DrawVBO:
El tiempo de renderizado consumido por el objeto de búfer de vértices de la malla en la GPU.
D. Shader.Parse (análisis de sombreador):
El proceso mediante el cual el motor analiza el sombreador después de agregar recursos.
E. Shader.CreateGPUProgram (Crear programa GPU):
Crea un programa GPU basado en la biblioteca de gráficos compatible con el dispositivo actual.
3. Memory Profiler
A. Total utilizado:
La suma de la memoria Unity, la memoria Mono, la memoria GfxDriver y la memoria Profiler para el fotograma actual.
B. Reserva de memoria total:
Memoria del sistema requerida para el fotograma actual.
C. Uso total de la memoria del sistema:
La cantidad de memoria virtual utilizada por el fotograma actual. (Por lo general, entre 1,5 y 3 veces el uso de memoria actual)
D. Objetos del juego en la escena:
El número de objetos del juego en la escena en el cuadro actual.
E. Número total de objetos en la escena:
El número de objetos (incluidos no solo los objetos del juego, sino también los componentes, etc.) en la escena en el fotograma actual.
F. Número total de objetos:
Datos del objeto + número de activos.
4. Perfilador de memoria detallado
A. Activos:
Textura 2d: registra los recursos de textura utilizados en la memoria del cuadro actual, incluidas las texturas de varios GameObjects. , texturas de skybox y recursos de Lightmap utilizados en la escena.
B. Memoria de escena:
Registre el uso de memoria de todos los aspectos de la escena actual, incluido GameObject, recursos utilizados, varios componentes y GameManager, etc. (los componentes generalmente se cargan a través de AssetBundle no se mostrará aquí).
A. Otros:
ManagedHeap.UseSize: la cantidad de memoria de montón asignada por el código en tiempo de ejecución, que indica la cantidad de memoria de montón asignada desde el último GC.
SerializedFile(3):
WebStream: Esta es la huella de memoria de la carga WWW.
System.ExecutableAndDlls: Diferentes plataformas y hardware tendrán diferentes valores.
5. Puntos clave de optimización
A. Permitir el uso de CPU-GC:
Principios clave: 1. Detectar cualquier opción que asigne más de 2 KB de memoria a la vez. 2. Detectar cualquier opción que asigne más de 20 B de memoria por cuadro. 3.
B. Tiempo en milisegundos:
Registre el uso de CPU de cada cuadro cuando el juego se está ejecutando (preste especial atención a los cuadros que toman más de 5 milisegundos).
C. Analizador de memoria - Otros:
1.ManagedHeap.SerializedFile: El archivo serializado que queda durante la carga asincrónica (LoadFromCache, WWW, etc.), se puede monitorear su descarga.
3. WebStream: la versión descomprimida del archivo de recursos descargado de forma asincrónica desde WWW es varias o docenas de veces más grande que SerializedFile y puede usarse para monitoreo. ****
D. Activos del perfilador de memoria:
1. Texture2D: concéntrese en comprobar si hay recursos duplicados y gran cantidad de memoria que deba comprimirse.
2.
2.AnimationClip: céntrese en comprobar si hay recursos duplicados.
3. Grid: Céntrate en comprobar recursos duplicados.
6. Problemas que se pueden encontrar en el proyecto
A. Equipos. La GPU funciona muy rápido y Vsync la hace esperar mucho tiempo.
3. Lo mismo es Vsync, pero otros subprocesos consumen mucho tiempo, por lo que el tiempo de espera es largo, como cuando se sobrecarga AssetBundle.
4.Shader.CreateGPUProgram: Shader se retrasa en la fase de ejecución (sin precarga) (chip Huawei K3V2).
B. StackTraceUtility.PostprocessStacktrace() y StackTraceUtility.ExtractStackTrace():
1. Generalmente causado por Debug.Log o API similar.
2. La API de depuración debe bloquearse después del lanzamiento del juego.
C. Gastos generales:
1. Generalmente causado por Vsync.
2. Generalmente se encuentra en dispositivos Android.
D. GC.Collect:
Razones: 1. El código asigna demasiada memoria (maligno) 2. El sistema lo llama dentro de un cierto intervalo de tiempo (benigno).
Tiempo ocupado: 1. Relacionado con el tamaño de la basura existente 2. Relacionado con las partículas de uso de memoria restantes (como demasiados objetos de escena, baja utilización, reorganización de la memoria requerida después del lanzamiento de GC)
p>E. GarbageCollectAssetsProfile:
1. El motor al realizar la operación UnloadUnusedAssets (esta operación lleva mucho tiempo, se recomienda realizarla en una escena de corte).
2. Evite el uso de la GUI integrada de Unity tanto como sea posible para evitar la transición GUI.Repaint GC Permitir.
3. Si (other.tag == GearParent.MogoPlayerTag) cambia a other.CompareTag(GearParent.MogoPlayerTag).CompareTag(GearParent.MogoPlayerTag) cambia a other.CompareTag(GearParent.MogoPlayerTag). Esto se debe a que other.tag generará un permiso de GC de 180 B.
F. Utilice foreach lo menos posible, ya que cada foreach genera un enumerador (~16B de asignación de memoria) e intente cambiarlo a for.
G. Expresión lambda, el uso inadecuado puede provocar pérdidas de memoria.
H. Utilice LINQ con moderación:
1. Algunas funciones no están disponibles en algunas plataformas.
2. Se asignará una gran cantidad de permisos de GC.
I. Controlar el número de StartCoroutines:
1. Abra una Coroutine (serie) y asigne al menos 37 B de memoria.
2. Instancia de clase Coroutine--21B.
3. Enumerador -- 16B.
J. Utilice StringBuilder en lugar de la concatenación directa de cadenas.
K. Componentes de caché:
1. Cada GetComponent asignará una cierta cantidad de GC Allow.
2. Cada nombre de objeto asignará 39 B de memoria dinámica.