Unreal Engine 5 (UE5) amplía las capacidades de Unreal Insights añadiendo un mejor seguimiento de memoria y compatibilidad con la creación de perfiles en su función Memory Insights. Los desarrolladores ahora pueden ver información más detallada sobre la asignación y desasignación de memoria, incluidas las etiquetas de memoria de bajo nivel (LLM) y las pilas de llamadas asociadas con cada bloque de memoria en cualquier momento.
Memory Insights cuenta con una función de consulta que puede encontrar asignaciones en tiempo real en un momento determinado, reconocer aumentos o disminuciones en el uso de memoria, diferenciar asignaciones a corto y largo plazo, y encontrar fugas de memoria.
UE5.4 y versiones posteriores son compatibles con el trazado de memoria con pilas de llamadas para proyectos de Android.
Cómo grabar una sesión
Para empezar a usar Memory Insights para grabar una traza en el canal de memoria, sigue los pasos que se indican a continuación:
Ejecuta o compila Unreal Insights
Ve a Inicio > Símbolo del sistema e introduce lo siguiente:
Engine\Binaries\Win64\UnrealInsights.exeTambién puedes ir hasta la carpeta Engine\Binaries\Win64 y hacer doble clic para ejecutar el archivo UnrealInsights.exe.
Ejecuta tu proyecto de juego con trazado de memoria
Abre el símbolo del sistema en tu sistema operativo y ejecuta tu proyecto de muestra:
cd C:\MyEngineInstallLocation\
Samples\Games\MyGameSample\Binaries\Win64\MyGameSample.exe -trace=default,memoryPara grabar una sesión de tu proyecto, es necesario que el canal de trazado de la memoria esté activo desde el principio del proceso. De lo contrario, no será posible iniciar el trazado de eventos de asignación en una sesión de conexión tardía. Además, si ejecutas una traza en un proyecto empaquetado, debes asegurarte de que esté empaquetado en modo de desarrollo.
Puedes usar los comandos de trazado metadata y assetmetadata para proporcionar más opciones de filtrado para los nombres de recursos y de clases. Por ejemplo, puedes calcular el coste de la asignación de memoria por recurso o por nombre de clase.
Samples\Games\MyGameSample\Binaries\Win64\MyGameSample.exe -trace=default,memory,metadata,assetmetadataAbre tu traza desde el explorador de sesión de Insights
Vuelve al explorador de sesión de Unreal Insights y haz doble clic en tu archivo .utrace para abrirlo y analizarlo en la ventana Información de sincronización de Unreal Engine. Selecciona Menú > Memory Insights para abrir la ventana de Memory Insights.
Asignación de memoria - Pistas gráficas
Unreal Insights recopila pilas de llamadas completas para cada evento de asignación a fin de proporcionarte un análisis de la memoria asignada a tu proyecto. La interfaz principal de Memory Insights consiste en una cronograma que muestra una visión general del uso de la memoria durante la sesión.
El grafo de memoria principal muestra la cantidad total de memoria de seguimiento en tu proyecto, incluida la información de cada etiqueta que se recopila del LLM. Además, hay grafos que muestran el número total de asignaciones en tiempo real:
| Tipo de grafo | Color | Descripción |
|---|---|---|
Memoria total asignada | Azul | Muestra la cantidad total de memoria asignada en cada momento en función del seguimiento detallado de la asignación. |
Recuento de asignaciones activas | Amarillo | Muestra el número total de asignaciones activas en cualquier momento. |
Número de eventos de asignación/liberación | Verde/Naranja | Muestra el número de eventos de asignación y liberación por unidad, que se representa como una «fracción» de tiempo. |
Cada uno de estos grafos se basa en un seguimiento detallado de las asignaciones. Comienzan con un valor de tiempo de 0 y tienen una granularidad de aproximadamente 1 ms. Los demás grafos con etiquetas de prefijo LLM (RenderTargets, SceneRender, UObject) se basan en un sistema de seguimiento de memoria de bajo nivel en tiempo de ejecución.
Estas etiquetas comenzarán a rastrear varios segundos después de que se haya iniciado la sesión y contienen una granularidad por fotograma.
Por defecto, emitimos una marca de tiempo en cada evento de asignación/liberación número 4096. Puedes cambiar esta cantidad si es necesario modificando MarkerSamplePeriod que se encuentra en Engine/Source/Runtime/Core/Private/ProfilingDebugging/MemoryAllocationTrace.cpp. Por ejemplo, si ajustas esta variable a un valor de 0, se emitirá una marca de tiempo después de cada evento de asignación/liberación.
El cronograma de Memory Insights permite superponer pistas en la vista de temporización. Cuando se usa la vista de Memory Insights, hay cuatro paneles disponibles: Temporización, Investigación, Etiquetas LLM y Módulos.
Vista temporización
Puedes hacer clic en Temporización para activar o desactivar la visualización de la ventana Vista de temporización. Aquí puedes observar y filtrar los datos de rendimiento de distintas pistas relacionados con el uso de la memoria.
Panel Investigación
El panel Investigación te permite realizar distintas consultas sobre las asignaciones.
Etiquetas de memoria de bajo nivel (LLM)
El panel Etiquetas LLM controla la visibilidad de las distintas etiquetas de LLM. Estos datos se trazan directamente desde tu sistema operativo.
Puedes agrupar etiquetas LLM, recursos y archivos de origen. Además, puedes hacer clic derecho en cualquier etiqueta LLM del panel Etiquetas LLM y seleccionar Generar un nuevo color o Editar color para personalizar el color que se muestra en la pantalla.
Módulos
Cuando se resuelven los símbolos de la pila de llamadas, el resultado se almacena en el archivo de caché. Puedes ver estos archivos haciendo clic en Módulos. Este panel te permite abrir archivos de seguimiento antiguos y usar símbolos.
Fíjate en las columnas del número de símbolos que aparecen como Descubiertos, En caché, Resueltos y Fallidos. Los elementos de la lista que fallaron se resaltan en rojo y los elementos de la lista que se resolvieron correctamente se resaltan en verde. El amarillo indica que algunos de los símbolos se han resuelto y otros han fallado.
La implementación anterior del seguimiento de memoria en tiempo de ejecución se realiza en la clase LowLevelMemTracker ubicada en la carpeta Engine\Source\Runtime\Core\Public\HAL\LowLevelMemTracker.h. Tanto el panel Etiquetas LLM como los grafos LLM usan datos trazados directamente desde este sistema. Los datos de asignación detallados provienen de una implementación de seguimiento específica e independiente.
Memory Insights contiene nuevas funciones de consulta e información sobre la asignación de memoria de seguimiento. Puedes identificar bloques de memoria que UE5 asigna y libera dentro de ciertas ventanas de tiempo, antes o después de un momento específico, o comprobar si hay fugas de memoria. Para acceder al sistema de consultas, ve a la pestaña Investigación después de abrir un registro de trazado.
La barra de estado de la parte inferior del panel Módulos proporciona información sobre el número total y el tamaño de los módulos.
Investigación - Consultas de asignación
Aunque el cronograma ofrece una visión general del uso de la memoria, para evaluar cómo se comportan las asignaciones individuales a lo largo del tiempo se usan «consultas». Una consulta se define mediante una regla y una o más marcas de tiempo, como las etiquetas A y B.
Las reglas de consulta disponibles son las siguientes:
| Regla de consulta | Variable de tiempo | Descripción |
|---|---|---|
Asignación activa | A | Muestra todas las asignaciones activas en el momento A. |
Antes | A | Muestra todas las asignaciones anteriores al momento A. |
Después | A | Muestra todas las asignaciones posteriores al momento A. |
Rechazar | A y B | Muestra todas las asignaciones que se asignaron antes del momento A y que se liberaron entre el momento A y el momento B. |
Crecimiento | A y B | Muestra todas las asignaciones que se asignaron entre el tiempo A y B, y se liberaron después del tiempo B. |
Crecimiento frente a disminución | A y B | Identifica las asignaciones de «crecimiento» (establecidas entre el momento A y el momento B y liberadas después del momento B) y las asignaciones de «disminución» (establecidas antes del momento A y liberadas entre el momento A y el momento B). Las asignaciones de disminución se cambian para que tengan un tamaño negativo, de modo que la agregación de tamaño muestre una variación entre A y B. El resultado de esta consulta es una comparación de lo que se asignó en el momento A con lo que se asignó en el momento B. Una agrupación de asignaciones de memoria por etiquetas o pila de llamadas mostrará la variación (B - A) para cada grupo. |
Eventos libres | A y B | Muestra todas las asignaciones que se liberaron entre el momento A y B. |
Eventos de asignación | A y B | Muestra todas las asignaciones que se realizaron entre el momento A y el momento B. |
Asignaciones de corta vida útil | A y B | Muestra todas las asignaciones que se realizaron después del momento A y se liberaron antes del momento B. Esta regla se puede usar para identificar asignaciones que podrían ser asignaciones de pila, lo que significa que esto identifica asignaciones temporales o de corta duración. |
Asignaciones de larga vida útil | A y B | Muestra todas las asignaciones que se asignaron antes del momento A y se liberaron después del momento B. |
Filtraciones de memoria | A, B y C | Muestra todas las asignaciones que se realizaron entre el momento A y el momento B y que no se liberaron hasta después del momento C. Esto es útil para encontrar memoria que se espera que se libere en un momento dado, por ejemplo, durante una transición de nivel. |
Duración limitada | A, B y C | Muestra todas las asignaciones que se asignaron entre el momento A y B y se liberaron entre el momento B y C. |
Declinación de asignaciones de larga vida útil | A, B y C | Muestra todas las asignaciones que se asignaron antes del momento A y se liberaron entre el momento B y el C. |
Duración específica | A, B, C y D | Muestra todas las asignaciones que se asignaron entre el momento A y el momento B y que se liberaron entre el momento C y el D. |
Las consultas se realizan seleccionando una regla y arrastrando los marcadores etiquetados en la cronología a las posiciones deseadas, o especificando un tiempo en la pestaña Investigación.
Una vez que hayas seleccionado las reglas y los tiempos deseados, pulsa el botón Ejecutar consulta de la pestaña Investigación para realizar la consulta.
Dependiendo de la consulta y del conjunto de datos que se esté capturando, las consultas pueden tardar bastante tiempo en ejecutarse.
Vista de desglose de asignación
Cuando se ejecuta la consulta, aparece una nueva ventana. Tras completarse la consulta, la tabla de asignación se rellena con el resultado. De forma predeterminada, estos resultados se mostrarán en una lista sin formato.
Por defecto, cada asignación muestra su:
Recuento
Tamaño
Etiqueta LLM
Función (asignación)
Pila de llamadas de asignación
Función (liberación)
Pila de llamadas de liberación
Puedes mostrar parámetros adicionales haciendo clic derecho en el encabezado de una tabla y configurando los ajustes que quieras bajo el encabezado Visibilidad de la columna. Además, puedes pasar el cursor sobre la viñeta situada a la izquierda de la asignación para ver más detalles.
Puedes ver más detalles sobre las asignaciones seleccionadas en la barra de estado de la parte inferior de la pantalla, como el recuento total y el tamaño de la memoria.
Ordenación
Al hacer clic en los encabezados de la tabla, puedes ordenar la lista por diferentes columnas.
| Ordenar columnas | Descripción |
|---|---|
Jerarquía de asignaciones | Ordena según la jerarquía del árbol de asignación. |
Número de asignaciones | Ordena por el número de asignaciones. |
Tamaño | Ordena según el tamaño de las asignaciones. |
Etiqueta LLM | Ordena por la etiqueta LLM de las asignaciones. |
Función superior (pila de llamadas) | Ordena por la función superior resuelta de la pila de llamadas de las asignaciones. |
Tamaño de la pila de llamadas | Número de fotogramas de la pila de llamadas. |
Agrupación
Las opciones de preajuste se pueden usar para agrupar asignaciones.
| Opción de preajuste | Descripción |
|---|---|
Predeterminado | Muestra las asignaciones por defecto. |
Detallada | Configura la vista de árbol para mostrar información de asignación detallada. |
Montón | Investiga cómo se usan los distintos tipos de memoria. Consulta Espacios de direcciones múltiples. |
Tamaño | Encuentra rápidamente cualquier asignación grande. |
Etiquetas | Muestra las asignaciones por sistema. |
Recurso (paquete) | Configura la vista de árbol para mostrar un desglose de las asignaciones por paquete y metadatos de nombre de recurso. |
Nombre de la clase | Configura la vista de árbol para mostrar un desglose de las asignaciones por su nombre de clase. |
Pila de llamadas de asignación | Configura la vista de árbol para mostrar un desglose de las asignaciones por pila de llamadas. |
Pila de llamadas de asignación invertida | Configura la vista de árbol para mostrar un desglose de las asignaciones por pila de llamadas invertida. |
Pila de llamadas de liberación | Configura la vista de árbol para mostrar un desglose de las asignaciones por pila de llamadas de liberación. |
Pila de llamadas de liberación invertida | Configura la vista de árbol para mostrar un desglose de las asignaciones por pila de llamadas de liberación invertida. |
Dirección (página 4K) | Agrupa las asignaciones en páginas de memoria alineadas de 4000 bytes en función de sus direcciones.
|
Ve a Jerarquía y haz clic en Todo. Se abrirá un menú desplegable para cambiar la vista plana predeterminada en grupos adicionales alternativos.
Puedes agrupar la jerarquía a partir de la lista de las siguientes opciones.
| Grupo de jerarquía | Descripción |
|---|---|
Plano | Crea un único grupo que incluye todos los elementos. |
Tamaño | Agrupa asignaciones según su tamaño. |
Etiqueta | Crea un árbol basado en la jerarquía de etiquetas. |
Pila de llamadas | Crea un árbol en función de la pila de llamadas de cada asignación. |
Pila de llamadas invertida | Crea un árbol en función de la pila de llamadas de cada asignación. |
Montón | Crea un árbol en función de la pila. Los subgrupos de asignaciones y pilas están disponibles para las pilas raíz. |
Valores únicos - Distancia del evento | Crea un grupo para cada valor de distancia del evento. |
Valores únicos - Hora de inicio | Crea un grupo para cada valor de hora de inicio. |
Valores únicos - Hora de finalización | Crea un grupo para cada valor de hora de finalización. |
Valores únicos - Duración | Crea un grupo para cada valor de duración. |
Valores únicos - Dirección | Crea un grupo para cada valor de dirección. |
Valores únicos - Página de memoria | Crea un grupo para cada valor de página de memoria. |
Valores únicos - Tamaño | Crea un grupo para cada valor de tamaño. |
Valores únicos - Etiqueta LLM | Crea un grupo para cada valor de etiqueta LLM. |
Valores únicos - Recurso | Crea un grupo para cada valor de recurso. |
Valores únicos - Nombre de clase | Crea un grupo para cada valor de nombre de clase. |
Valores únicos - Función superior | Crea un grupo para cada valor de la función superior. |
Valores únicos - Archivo de origen superior | Crea un grupo para cada valor de archivo de origen superior. |
Valores únicos - Tamaño de la pila de llamadas | Crea un grupo para cada valor de tamaño de la pila de llamadas. |
Desglose de ruta - Etiqueta LLM | Crea una jerarquía de árbol a partir de la estructura de los valores de cadena de la etiqueta LLM. |
Desglose de ruta - Recurso | Crea una jerarquía de árbol a partir de la estructura de los valores de cadena de la etiqueta de recurso. |
Desglose de ruta - Archivo de origen superior | Crea una jerarquía de árbol a partir de la estructura de los valores de cadena del archivo de origen superior. |
Filtrado avanzado
El cuadro de texto de búsqueda proporciona un método para filtrar rápidamente el resultado en función del texto del nodo jerárquico. El conjunto de asignaciones generadas por la consulta se puede filtrar aún más para aislar un grupo de asignaciones haciendo clic en Configurador de filtros junto al cuadro de texto de búsqueda.
Es posible crear consultas avanzadas usando grupos y palabras clave AND/OR.
Resolución de símbolos de pila de llamadas
El trazado de símbolos de la pila de llamadas desde tu proyecto se realiza mediante direcciones de contadores de programa. En el análisis, estas direcciones deben convertirse en cadenas legibles junto con información sobre los archivos de origen correspondientes.
Esto requiere que Memory Insights tenga acceso a la versión correcta del archivo que contiene la información de depuración. Puede ser un archivo .pdb o .elf (según la plataforma). Insights buscará el archivo correcto según la siguiente lista:
Cualquier ruta nueva introducida por el usuario en esta sesión.
Ruta del ejecutable (si está disponible en algunas plataformas, se compilará en el binario).
Rutas desde la variable de entorno
UE_INSIGHTS_SYMBOLPATH. Esta variable acepta rutas separadas por punto y coma.Rutas desde
_NT_SYMBOL_PATH.Rutas desde el archivo de configuración del usuario.
Cuando se resuelven los símbolos, los resultados se almacenan en el archivo de caché. Puedes ver estos archivos haciendo clic en el panel Módulos. A continuación, podrás abrir estos archivos haciendo clic derecho en el archivo seleccionado y eligiendo una de las siguientes opciones en el menú desplegable.
Proporciona un método para enviar el archivo de seguimiento a otros usuarios sin necesidad de que tengan acceso a esa información de depuración.
| Método de carga | Descripción |
|---|---|
Cargar símbolos del archivo | Carga los símbolos para un módulo especificando un archivo. Si se realiza correctamente, intenta cargar otros módulos fallidos desde el mismo directorio. |
Cargar símbolos del directorio | Carga los símbolos para un módulo especificando un directorio. Si se realiza correctamente, intenta cargar otros módulos fallidos desde el mismo directorio. |
Actualmente, la resolución de símbolos está disponible en Win64, XB1/XSX, PS4/PS5 y Switch.
Espacios de direcciones múltiples
El trazado de memoria realiza un seguimiento de la memoria en diferentes pilas. Conceptualmente, cualquier asignación debe pertenecer a una pila raíz, que representa un tipo de memoria. Por ejemplo, en las plataformas de escritorio, una pila raíz es la memoria del sistema y el otra es la memoria de vídeo de la tarjeta gráfica. Cada pila raíz tiene su propio espacio de direcciones. En cada pila raíz hay asignaciones de montón que pueden albergar asignaciones. Por lo general, esto implica asignaciones de memoria virtual que respaldan las asignaciones. Sin embargo, los asignadores de tipo bloque también se pueden representar con asignaciones de pila. Esto permite investigar el uso de esos bloques de memoria.
Exportar instantánea
Puedes exportar asignaciones de memoria en formato .csv o .tsv haciendo clic con el botón derecho y seleccionando Exportar instantánea en el menú contextual.