Unity
Découvrez le système "on demand rendering" de Unity 2019, une nouvelle API qui permet de choisir le framerate dynamiquement.
Historiquement avec Unity, nous pouvons fixer et/ou changer le framerate par script avec Application.targetFrameRate ou Vsync count. Mais cette approche change non seulement la fréquence du rendering, mais aussi toutes les autres parties de notre jeu, comme la boucle de jeu. Avec cette nouvelle API "on demand rendering", on peut maintenant découpler le rendering de la boucle de jeu.
Le fait de pouvoir régler dynamiquement la fréquence du rendering, permet d'optimiser notre jeu, tout en assurant une consommation de la batterie du mobile plus faible.
Exemples de cas où utiliser "on demand rendering"
- Affichage d'un menu (IHM) : ici on a pas besoin d'une fréquence de fou, car l'interface est assez statique en général. En diminuant la fréquence du rendering, on économise de la batterie, tout en laissant les events (ex: touch) actifs.
- Jeux en tour par tour: sur ce type de jeu, il arrive souvent que l'on ait des périodes basses d'activités... on peut ainsi aussi diminuer/ajuster la fréquence.
- Machine learning: il est intéressant ici de régler la fréquence du rendering afin de libérer plus de ressources sur la zone qui en nécessite le plus : les calculs pour l'apprentissage de notre "brain"
- Gestion de la performance: si vous souhaitez contrôler la vie de la batterie ou encore la température du CPU, particulièrement si on utilise le package adaptive performance, alors le on demand rendering est ici aussi utile.
Comment utiliser on demand rendering ?
Cette API est disponible dès Unity 2019.3, supportée sur toutes les plateformes, avec tous les renderer pipeline (built-in, LWRP, HDRP, et URP).
De manière très simple pour ajuster la fréquence du rendering il suffit de faire:
void Start()
{
QualitySettings.vSyncCount = 0;
Application.targetFrameRate = 60;
// Quand le menu démarre, on ajuste le rendering à 20fps
OnDemandRendering.renderFrameInterval = 3;
}
Exemple d'utilisation
Dans l'exemple suivant on décide de diminuer à 20 FPS la fréquence du rendering quand on ne touche pas l'écran, et 60 FPS sinon.
void Update()
{
if (Input.GetMouseButton(0) || (Input.touchCount > 0))
{
// On touche l'écran ou click souris: render àt 60 FPS (chaque frame).
OnDemandRendering.renderFrameInterval = 1;
}
else
{
// sinon retour à 20 FPS (chaque 3 frames).
OnDemandRendering.renderFrameInterval = 3;
}
}
Voilà ! C'est aussi simple que cela ... A vous de tester et prendre en main cette nouvelle API.
Venez nous en parler sur discord.