Cómo la renderización a pedido puede mejorar el rendimiento móvil

No siempre es deseable renderizar un proyecto a la mayor velocidad de cuadros posible, por diversas razones, especialmente en plataformas móviles. Históricamente, los desarrolladores de Unity han utilizado Application.targetFrameRate o Vsync count para limitar la velocidad de renderizado de Unity. Este enfoque no solo afecta la representación, sino también la frecuencia con la que se ejecuta cada parte de Unity . La nueva API de renderizado bajo demanda le permite disociar la frecuencia de renderizado de la frecuencia de bucle del reproductor.
La renderización a pedido le permite omitir cuadros de renderización mientras continúa ejecutando el resto del bucle del reproductor a una frecuencia alta. Esto puede ser especialmente útil en dispositivos móviles; omitir la renderización puede generar ahorros significativos de rendimiento y energía, al tiempo que permite que la aplicación responda a eventos táctiles.
A continuación se muestran algunos ejemplos de situaciones en las que es posible que desee reducir la velocidad de cuadros:
Menús (por ejemplo, el punto de entrada de la aplicación o un menú de pausa): Los menús tienden a ser escenas relativamente simples y, como tales, no necesitan renderizarse a toda velocidad. Si renderiza menús a una velocidad de cuadros más baja, seguirá recibiendo información durante un cuadro que no se renderiza, lo que le permitirá reducir el consumo de energía y evitar que la temperatura del dispositivo aumente hasta un punto en el que la frecuencia de la CPU pueda verse limitada, al tiempo que mantiene una interacción fluida con la interfaz de usuario.
Juegos por turnos (por ejemplo, ajedrez): Los juegos por turnos tienen períodos de baja actividad en los que los usuarios piensan en su próximo movimiento o esperan que otros usuarios hagan el suyo. Durante esos momentos, puedes reducir la velocidad de cuadros para evitar el uso innecesario de energía y prolongar la vida útil de la batería.
Contenido estático: Puede reducir la velocidad de cuadros en aplicaciones donde el contenido es estático durante la mayor parte del tiempo, como la interfaz de usuario (UI) automotriz.
Gestión del rendimiento: Si desea administrar el uso de energía y la temperatura del dispositivo para maximizar la vida útil de la batería y evitar la limitación de la CPU, en particular si usa el paquete Adaptive Performance, puede ajustar la velocidad de renderizado.
Aplicaciones de aprendizaje automático o IA: Reducir la cantidad de trabajo que la CPU dedica a la renderización puede brindarle un pequeño aumento en el rendimiento para el procesamiento pesado que es el foco central de su aplicación.
¡En todos lados! La renderización a pedido funciona en Unity 2019.3 con todas las plataformas compatibles (consulte los requisitos del sistema) y API de renderización (canalización de renderización integrada, canalización de renderización universal y canalización de renderización de alta definición).
La API de renderizado bajo demanda consta de solo tres propiedades en el espacio de nombres UnityEngine.Rendering.
1. OnDemandRendering.renderFrameInterval
Esta es la parte más importante. Le permite obtener o establecer el intervalo de cuadros de renderizado, que es un factor divisor de Application.targetFrameRate o QualitySettings.vSyncCount, para definir la nueva velocidad de cuadros. Por ejemplo, si establece Application.targetFrameRate en 60 y OnDemandRendering.renderFrameInterval en 2, solo se renderizará cada dos fotogramas, lo que dará como resultado una velocidad de fotogramas de 30 fps.
2. OnDemandRendering.effectiveFrameRate
Esta propiedad le brinda una estimación de la velocidad de cuadros a la que se procesará su aplicación. La estimación se determina utilizando los valores de OnDemandRendering.renderFrameInterval, Application.targetFrameRate, QualitySettings.vSyncCount y la frecuencia de actualización de la pantalla. Pero tenga en cuenta que esto es una estimación y no una garantía; su aplicación puede procesarse más lentamente si la CPU está sobrecargada por el trabajo de otras cosas, como scripts, física, redes, etc.
3. OnDemandRendering.willThisFrameRender
Esto simplemente le indica si el cuadro actual se mostrará en la pantalla. Puedes usar cuadros no renderizados para realizar algún trabajo adicional que consuma muchos recursos de la CPU, como operaciones matemáticas pesadas, cargar activos o generar prefabricados.
- Aunque los fotogramas no se renderizarán con tanta frecuencia, los eventos se enviarán a los scripts a un ritmo normal. Esto significa que es posible que recibas una entrada durante un fotograma que no se procesa. Para evitar la aparición de retrasos en la entrada, recomendamos llamar a OnDemandRendering.renderFrameInterval = 1 mientras dure la entrada para mantener los botones, el movimiento, etc. respondiendo.
- Las situaciones que requieren mucho scripting, física, animación, etc. pero que no se renderizan no se beneficiarán del uso de la renderización a pedido. Los resultados pueden aparecer entrecortados y con una reducción insignificante en el uso de CPU y energía.
A continuación se muestra un ejemplo simple que muestra cómo se puede usar la renderización a pedido en un menú para renderizar a 20 fps a menos que haya entrada.
using UnityEngine;
using UnityEngine.Rendering;
public class Menu : MonoBehaviour
{
// Start is called before the first frame update
void Start()
{
QualitySettings.vSyncCount = 0;
Application.targetFrameRate = 60;
// When the Menu starts, set the rendering to target 20fps
OnDemandRendering.renderFrameInterval = 3;
}
// Update is called once per frame
void Update()
{
if (Input.GetMouseButton(0) || (Input.touchCount > 0))
{
// If the mouse button or touch detected render at 60 FPS (every frame).
OnDemandRendering.renderFrameInterval = 1;
}
else
{
// If there is no mouse and no touch input then we can go back to 20 FPS (every 3 frames).
OnDemandRendering.renderFrameInterval = 3;
}
}
}

A continuación se muestra un proyecto de ejemplo que demuestra cómo se puede utilizar la renderización a pedido en una variedad de situaciones.
Cuéntanos en los foros cómo te funciona la renderización bajo demanda. Lo hemos probado en Windows, macOS, WebGL, iOS y Android, tanto en el editor de Unity como con reproductores independientes, pero siempre estamos abiertos a más comentarios.