El rendimiento describe la fluidez con la que tu proyecto se ejecuta en el hardware de destino. Unreal Engine simula el tiempo real dibujando o renderizando repetidamente una imagen del mundo del juego en tu pantalla. Como un flipbook, el motor muestra fotogramas en rápida sucesión, creando el efecto de movimiento. El rendimiento de los fotogramas que se están renderizando se puede medir de dos maneras: en fotogramas por segundo y en el tiempo de fotogramas. Esto puede ayudarte a comprender el rendimiento de tu aplicación para alcanzar una determinada cantidad de fotogramas por segundo y a qué se está gastando el tiempo dentro de esos fotogramas, que se mide en milisegundos.
Cuantos más fotogramas renderices en un segundo, más suave será el movimiento para el usuario y más responderá la aplicación. Por lo general, las aplicaciones tendrán como objetivo 30, 60 y 120 fotogramas por segundo al considerar su estimación de rendimiento y el hardware objetivo. Para ofrecer la mejor experiencia de usuario posible, es importante que los fotogramas por segundo sean más altos, pero también que sean consistentes. Este documento proporciona una introducción a las consideraciones rendimiento del Renderización, así como un tutorial de varias herramientas para analizar y gestionar el rendimiento de Renderización de tu aplicación Unreal Engine.
Entender el rendimiento
Gran parte de la lógica de Unreal Engine depende de dos cosas:
Lo que está pasando en el fotograma actual
¿Cuánto tiempo ha transcurrido desde el fotograma anterior?
Por ejemplo, a medida que se renderiza un fotograma, pueden ocurrir las siguientes situaciones:
El usuario puede mover un personaje o un vehículo.
Es posible que el usuario interactúe con un objeto.
Las entidades controladas por la IA pueden moverse o realizar diversas acciones.
La IU del usuario podría cambiar.
Un objeto en pantalla puede dar un paso adelante en su animación o mezcla varias animaciones.
Las simulaciones de física pueden cambiar la posición o la rotación de los objetos físicos.
Cada una de estas operaciones añade trabajo adicional al ordenador mientras dibuja cada fotograma. Además, puedes hacer que el proceso de dibujar cada fotograma sea más o menos complejo con diversos ajustes de renderización. Entre los posibles ajustes se incluyen los siguientes:
Aumenta el detalle de los objetos y las texturas, lo que hace que tu ordenador tarde más tiempo en calcular el color final de cada píxel relacionado.
Añade efectos de posprocesamiento, cada uno de los cuales añade pases adicionales que deben ejecutarse en la imagen en varias etapas del Renderización.
Usa una iluminación y un sombreado muy realista, lo que hace que las escenas parezcan más realistas, pero también aumenta la complejidad de los cálculos de iluminación.
Cuantas más cosas ordenes a tu aplicación que haga en cada fotograma, más tiempo tardará en renderizar un solo fotograma. Si tus fotogramas tardan mucho en renderizar, se ralentizarán los fotogramas por segundo en general y la aplicación parecerá menos fluida y responderá menos.
Medición de fotogramas por segundo y tiempo de fotogramas
Para realizar un pista de los fotogramas por segundo y el tiempo de fotogramas, puedes activar estas medidas para que se muestren en el visor. En el menú de hamburguesa del visor, activa Mostrar FPS, haz clic en Estadísticas > Motor y activa FPS y Unidad.
Limitaciones de hardware y caídas de la tasa de fotogramas
Una tasas de fotogramas lenta es el resultado de tener un procesamiento excesivo durante un solo fotograma, normalmente por operaciones que se repiten cada vez que se dibuja un fotograma en pantalla. Imagina cada fotograma que renderizas como un tren que has programado para salir de la estación, seguido de otro tren unas milésimas de segundo después. Sin embargo, con este tren, todos los pasajeros que hayan comprado un billete deben embarcar al tren antes de que pueda partir. Cada operación que hagas durante ese fotograma, ya sea con la jugabilidad o con la lógica de renderizado, es como un pasajero más que tiene que subir a bordo.
Dedicar demasiado tiempo al procesamiento de un solo fotograma, es como retrasar el tren porque estás intentando que embarquen demasiados pasajeros y aún no se han subido todos al tren. Esto evita que el siguiente tren pueda entrar. El resultado en pantalla es una caída de la tasa de fotogramas. Esto puede ocurrir de forma momentánea y dar lugar a fallos en los que la pantalla se detiene notablemente en un fotograma durante demasiado tiempo, o pueden ocurrir de forma constante en cada fotograma, lo que provocaría una tasa de fotogramas baja en general.
Cualquiera de los siguientes recursos informáticos puede provocar una sobrecarga:
CPU: la unidad central de procesamiento (CPU) de tu ordenador está realizando demasiadas operaciones en uno o más subprocesos durante un solo fotograma. Esto indica que la IU, la lógica de jugabilidad u otra lógica central de la aplicación se está ejecutando de manera ineficiente o que estás realizando demasiadas de estas operaciones en un solo fotograma.
GPU: la unidad de procesamiento gráfico (GPU) de tu ordenador está realizando demasiadas operaciones en un mismo fotograma. Esto indica que la renderización o el posprocesamiento de tu juego se están ejecutando de forma ineficiente, o que la GPU tiene demasiadas tareas que realizar.
Memoria de tamaño (RAM): la memoria de acceso aleatorio (RAM) de tu ordenador está llena, lo que impide que se completen las operaciones hasta que se vacíe. Esto tiende a resultar en una excepción de memoria insuficiente y un bloqueo en lugar de afectar al rendimiento. Algunos sistemas, como el recolector de basura o la transmisión de recursos, son elásticos, lo que retrasa de forma dinámica el trabajo de limpieza. Cuando la RAM se llena, estos sistemas deben realizar operaciones de limpieza y volver a autopropagar con más frecuencia, lo que añade más carga de trabajo a la CPU.
Velocidad de memoria (RAM): las CPU funcionan con pequeños fragmentos de datos que se encuentran físicamente en los núcleos, e intercambian estos fragmentos de datos con la RAM según sea necesario. Estas operaciones pueden ocurrir mucho más rápido que el intercambio de fragmentos entre la CPU y la RAM (por ejemplo, una CPU podría ser capaz de realizar 20 operaciones con datos cargados en la misma cantidad de tiempo que tarda en cargar un nuevo fragmento de datos). Cuanto más lenta sea la RAM y más a menudo tenga que cambiar la lógica entre los fragmento contiguos de memoria con los que necesita interactuar, más tiempo pasarán los núcleos de la CPU sin hacer nada, esperando al bus de memoria.
Memoria de la GPU (memoria de vídeo): la memoria RAM de la GPU está llena, lo que impide que se completen las operaciones hasta que se vacíe. Esto suele ser el resultado de sobrecargar la memoria de texturas, ya que las texturas ocupan una gran cantidad de espacio.
Acceso al disco duro: los objetos tienen que cargarse desde el disco duro u otro dispositivo de almacenamiento antes de poder añadirse a la memoria. Si tienes que acceder a tu dispositivo de almacenamiento con mucha frecuencia, esto impedirá que se completen las operaciones.
Ancho de banda de la red: la conexión a internet de tu ordenador es lenta o poco fiable, lo que se traduce en más trabajo de la CPU en cada fotograma para reconstruir o reenviar paquetes fiables, en ráfagas de trabajo que de otro modo se habrían repartido en muchos fotogramas o, simplemente, en elementos visuales entrecortados a pesar de la ausencia de sobrecarga local en el rendimiento.
Limitación de CPU frente a limitación de GPU
Las aplicaciones pueden tener limitación de CPU o de GPU en función de cuál tenga el menor margen de rendimiento. Si es más probable que la CPU provoque una sobrecarga, tiene limitación de CPU. Si es más probable que la GPU provoque una sobrecarga, tiene limitación de GPU. Si tienes activada la sincronización vertical y tanto la CPU como la GPU son capaces de producir fotogramas más rápido de lo que el monitor es capaz de mostrarlos, la aplicación tendría una limitación de pantalla. A menudo, esto dependerá de la plataforma de destino y sus recursos.
Picos de procesamiento
Un pico de procesamiento se refiere a un aumento breve y repentino en la cantidad de tiempo que la CPU o la GPU emplean durante un fotograma.
Operaciones de gran coste frente a bajo coste
En términos generales, una operación de gran coste requiere una cantidad relativamente grande de recursos informáticos para ejecutarse. Esto podría implicar mayores cantidades de tiempo de procesamiento o de memoria. Las operaciones de bajo coste no requieren una gran cantidad de recursos informáticos. Estos términos se usan a menudo para comparar procesos que realizan operaciones similares.
Memoria en aplicaciones en tiempo real
Todo lo que puedes procesar o renderizar existe en la memoria de tu aplicación, con algunas excepciones, como la geometría virtual en Nanite, que se transmite directamente desde una unidad de estado sólido (SSD). Una forma sencilla de verlo es que, si puedes verlo y moverlo por la pantalla, hay una copia del objeto en la memoria del ordenador, y los recursos de renderizado del objeto, como las texturas, los sombreadores y las mallas, existen en la memoria de la GPU.
Rendimiento y consumo de energía
El consumo de energía varía en función de la arquitectura de hardware, pero, en general, ejecutar una carga de procesamiento más pesada y renderizar más fotogramas por segundo contribuyen a un mayor consumo de energía. En los ajustes de dispositivos móviles y HMI, el consumo de energía del dispositivo es una de las principales preocupaciones, por lo que te recomendamos que hagas que la aplicación se ejecute de la forma más eficiente posible. Es posible que los jugadores den una puntuación negativa a los juegos que consumen la batería del teléfono más rápido que otros juegos. Además, si se calienta el teléfono al utilizar más energía, se puede activar la limitación térmica, que obliga a la CPU a funcionar más lentamente hasta que el teléfono se enfríe de nuevo.
Herramientas de perfilado
La creación de perfiles es el acto de analizar el uso que hace tu aplicación de los recursos del sistema, como el procesamiento de la CPU o la GPU, el uso de la memoria o el ancho de banda de la red. Unreal Engine proporciona varios conjuntos de herramientas de generación de perfiles:
Herramienta | Descripción |
Unreal Insights | Graba y revisa los datos de rendimiento fotograma a fotograma. |
Comandos de estadísticas | Se muestran las estadísticas de rendimiento en pantalla. |
Para obtener más información sobre cómo usar Unreal Insights en dispositivos Android, consulta la página Unreal Insights on Android Devices.
También puedes usar herramienta de terceros para la creación de perfiles, como las siguientes:
Herramienta | Descripción |
Capturas de un solo fotograma de depuración de los gráficos de tu aplicación. | |
Crea un perfil completo del sistema y procesa los datos de trazado. |
Ten en cuenta que la creación de perfiles usa la misma CPU, RAM y unidad de almacenamiento que el juego. Si ejecutas el juego con un generador de perfiles adjunto, su rendimiento será ligeramente inferior. Sin embargo, puede ser bueno, ya que da como resultado un escenario en el que parece que alcanzar los objetivos de rendimiento en realidad significa que los has superado y se han dejado algunos recursos libres con los que el juego puede mantenerse en el objetivo en casos de variabilidad imprevista del sistema.
Unreal Insights
Unreal Insights es un conjunto sólido y potente de herramientas de creación de perfiles disponible en Unreal Engine, que ofrece herramientas para crear perfiles de subprocesos individuales, uso de memoria y ancho de banda de red. Puedes ver cuántos milisegundos tarda cada operación individual en la CPU o la GPU, cuánta memoria se está asignando en Memory Insights y un desglose de la telemetría y los datos en Network Insights. También hay modos especializados para crear perfiles de grafos de tareas, cambios de contexto y elementos de la IU de Slate, que pueden ayudarte a realizar un análisis en profundidad del rendimiento de la aplicación.
Comandos de estadísticas
Las estadísticas hacen referencia a una serie de comandos de consola que puedes usar en una aplicación de UE en ejecución para obtener estadísticas en pantalla. Existen comandos de estadísticas para una amplia variedad de operaciones y sistemas, incluidos, entre otros, los siguientes:
Seguimiento de memoria
Carga de la GPU y la CPU
Tics de jugabilidad
IU
Animaciones
Aunque usar los comandos de estadísticas no es tan completo como trabajar con Unreal Insights o RenderDoc, es la forma más rápida de obtener datos sobre lo que ocurre en la aplicación mientras la ejecutas o la pruebas.
Para obtener una lista completa de los comandos de estadísticas, consulta la página Stat Commands.
RenderDoc
RenderDoc es un depurador de gráficos de código abierto que puede adjuntarse a UE y proporcionar capturas de un único fotograma. Puede realizar muchas operaciones, incluidas las siguientes:
Inspeccionar texturas, modelos o sombreadores.
Se muestran eventos de trazado individuales.
Proporcionar un desglose del estado de canalización de la aplicación en el momento en que capturas un fotograma.
Mientras que Unreal Insights puede darte una idea general de qué operaciones de renderizado consumen la mayor cantidad de recursos de procesamiento y memoria, RenderDoc es más adecuado para obtener un diagnóstico detallado de las operaciones de renderizado y detectar los lugares exactos en los que se están produciendo errores. Por ejemplo, si ves artefactos de renderizado en el dispositivo de destino pero no en el PIE, puedes usar RenderDoc para capturar un fotograma en ambos dispositivos, comparar sus datos y ver qué ocurre de manera diferente entre ellos que hace que aparezcan los artefactos.
Herramientas de configuración del rendimiento
Muchas de las instrucciones para ajustar la configuración del renderizado y los valores de scalability settings del proyecto se encuentran en los comandos de consola y las variables. Esta sección proporciona una introducción sobre cómo usarlos y recursos para entenderlos en profundidad.
Comandos y variables de la consola
La consola es una línea de comandos dentro de Unreal Engine que puede usarse para cambiar ajustes, ejecutar comandos de depuración y obtener información mientras se ejecuta el juego. Puedes usar comandos de consola en Unreal Editor o en una compilación de desarrollador o de depuración de un proyecto empaquetado pulsando la tecla de virgulilla (~). Esto abrirá la línea de comandos y te pedirá que introduzcas el comando.
Los comandos en UE cuentan con una función de búsqueda/completado automático, por lo que puedes introducir un comando parcial para reducir la lista de posibles comandos que estás buscando. Por ejemplo, si introduces Stat, aparecerá una lista de comandos de estadísticas.
Las variables de consola, o CVars, son variables de configuración que se pueden editar con comandos de consola. Puedes cambiar directamente las CVars en la consola escribiendo la ruta de configuración de la variable y, a continuación, proporcionando el valor que quieres establecer para esa variable. Por ejemplo:
r.TemporalAA.Quality 0El comando anterior establece la CVar r.TemporalAA.Quality en 0, lo que desactiva el antialiasing temporal. Esto hace que los bordes de los objetos parezcan más rígidos y pixelados.
Consulta las siguientes páginas para obtener más información sobre la consola:
Console Variables and Commands: una introducción sobre cómo trabajar con la consola en detalle.
Console Commands Reference: una lista completa de los comandos de consola.
Console Variables Reference: una lista completa de las variables de consola.
Console Variables Editor: un complemento para edición variables de consola directamente desde Unreal Editor.
También puedes usar comandos de consola en blueprint y C++ para cambiar las variables en cualquier momento, incluso cuando la consola esté deshabilitado en las versiones de envío. Esto puede ser útil para cambiar la escala de forma selectiva mientras se ejecuta la aplicación.
Registro de salida
Al trabajar con la consola en Unreal Editor, será más fácil entender qué está pasando si se muestra el registro de salida, que contiene un registro de comandos y registros.
Para ver el registro de salida en Unreal Editor, haz clic en Ventana > Registro de salida. El registro de salida se anclará en la parte inferior del editor.
Los archivos de registro guardados aparecen en la carpeta Saved/Logs del proyecto.
Archivos de configuración
Las variables de consola se almacenan en tus archivos de configuración (.ini) como pares clave-valor, y proporcionan ajustes predeterminados para las compilaciones del juego. Consulta la sección Configuration Files para obtener más información.
Perfiles de dispositivos
Los perfiles de dispositivo son archivos de configuración que contienen ajustes para un dispositivo específico al que se dirige el proyecto. Puede ser tan amplio como un gran grupo de dispositivos, como Android_Mid, o tan específico como piezas de hardware individuales. Cada perfil de dispositivo tiene una serie de anulaciones de ajustes que solo tienen efecto para ese dispositivo específico.
Los perfiles de dispositivo de Unreal Engine giran principalmente en torno a familias de GPU, como la serie Adreno 7xx, pero puedes añadir tus propios perfiles de dispositivo personalizados y definir reglas para ellos según sea necesario para el hardware compatible.
Para obtener más información, consulta Customizing Device Profiles and Scalability on Android.
Lecturas adicionales
Para obtener más información sobre situaciones y factores que pueden afectar al rendimiento de la aplicación, consulta la sección Common Performance Considerations.
Consejos y prácticas recomendadas
Haz pruebas cuanto antes y con frecuencia
Al probar el juego, ten en cuenta que el proyecto encontrará errores específicos de cada una de las plataformas compatibles. Aunque Unreal Editor se esfuerza por ofrecer una previsualización precisa, no hay nada mejor que crear perfiles directamente en el hardware de destino. Cuanto más tiempo pases sin realizar pruebas en el hardware, más probabilidades hay de que aparezcan errores de los que no te habías dado cuenta.