Que recherchez-vous ?
Technology

Comment le rendu à la demande peut améliorer les performances des téléphones portables

DAVID ROGERS / UNITY TECHNOLOGIESContributor
Feb 7, 2020|4 Min
Comment le rendu à la demande peut améliorer les performances des téléphones portables
Cette page a été traduite automatiquement pour faciliter votre expérience. Nous ne pouvons pas garantir l'exactitude ou la fiabilité du contenu traduit. Si vous avez des doutes quant à la qualité de cette traduction, reportez-vous à la version anglaise de la page web.

Il n'est pas toujours souhaitable de rendre un projet à la fréquence d'images la plus élevée possible, pour diverses raisons, en particulier sur les plateformes mobiles. Historiquement, les développeurs Unity ont utilisé Application.targetFrameRate ou Vsync count pour limiter la vitesse de rendu d'Unity. Cette approche a un impact non seulement sur le rendu, mais aussi sur la fréquence à laquelle chaque partie d'Unity s'exécute. La nouvelle API de rendu à la demande vous permet de découpler la fréquence de rendu de la fréquence de la boucle du lecteur.

Qu'est-ce que le rendu à la demande ?

Le rendu à la demande vous permet de sauter des images de rendu tout en exécutant le reste de la boucle du lecteur à une fréquence élevée. Cela peut s'avérer particulièrement utile sur les téléphones portables ; le contournement du rendu peut entraîner des économies significatives en termes de performances et d'énergie, tout en permettant à l'application d'être réactive aux événements tactiles.

Pourquoi utiliser le rendu à la demande ?

Voici quelques exemples de scénarios dans lesquels vous pourriez vouloir réduire la fréquence d'images :

Menus (par exemple, le point d'entrée de l'application ou un menu de pause) : Les menus ont tendance à être des scènes relativement simples et n'ont donc pas besoin d'être rendus à pleine vitesse. Si vous rendez les menus à une fréquence d'images inférieure, vous recevrez toujours des données pendant une image qui n'est pas rendue, ce qui vous permet de réduire la consommation d'énergie et d'éviter que la température de l'appareil n'augmente au point que la fréquence de l'unité centrale soit étranglée, tout en conservant une interaction fluide avec l'interface utilisateur.

Jeux à tour de rôle (par exemple, les échecs) : Les jeux au tour par tour connaissent des périodes de faible activité pendant lesquelles les utilisateurs réfléchissent à leur prochaine action ou attendent que d'autres utilisateurs fassent de même. Pendant ces périodes, vous pouvez réduire la fréquence d'images pour éviter de consommer inutilement de l'énergie et prolonger la durée de vie de la batterie.

Contenu statique : Vous pouvez réduire la fréquence d'images dans les applications dont le contenu est statique la plupart du temps, comme l'interface utilisateur d'une automobile.

Gestion des performances : Si vous souhaitez gérer l'utilisation de l'énergie et les caractéristiques thermiques de l'appareil afin d'optimiser l'autonomie de la batterie et d'éviter l'étranglement du CPU, en particulier si vous utilisez le pack Adaptive Performance, vous pouvez ajuster la vitesse de rendu.

Applications d'apprentissage automatique ou d'IA : Réduire la quantité de travail que l'unité centrale consacre au rendu peut vous donner un petit coup de pouce pour le traitement lourd qui est au centre de votre application.

Où est-il soutenu ?

Partout ! Le rendu à la demande fonctionne sur Unity 2019.3 avec chaque plateforme prise en charge (voir la configuration requise) et API de rendu (pipeline de rendu intégré, pipeline de rendu universel et pipeline de rendu haute définition).

Comment utiliser le rendu à la demande ?

L'API de rendu à la demande se compose de seulement trois propriétés dans l'espace de noms UnityEngine.Rendering.

1. OnDemandRendering.renderFrameInterval
C'est la partie la plus importante. Il vous permet d'obtenir ou de définir l'intervalle d'images de rendu, qui est un facteur de division de Application.targetFrameRate ou QualitySettings.vSyncCount, afin de définir la nouvelle fréquence d'images. Par exemple, si vous définissez Application.targetFrameRate sur 60 et OnDemandRendering.renderFrameInterval sur 2, le rendu ne se fera qu'une image sur deux, ce qui donne une fréquence d'images de 30 fps.

2. OnDemandRendering.effectiveFrameRate
Cette propriété vous donne une estimation de la fréquence d'images à laquelle votre application effectuera le rendu. L'estimation est déterminée en utilisant les valeurs de OnDemandRendering.renderFrameInterval, Application.targetFrameRate, QualitySettings.vSyncCount et le taux de rafraîchissement de l'écran. N'oubliez pas qu'il s'agit d'une estimation et non d'une garantie ; votre application peut s'afficher plus lentement si l'unité centrale est encombrée par d'autres tâches telles que les scripts, la physique, le réseau, etc.

3. OnDemandRendering.willThisFrameRender
Cela vous indique simplement si la trame en cours sera affichée à l'écran. Vous pouvez utiliser des images non redessinées pour effectuer des tâches supplémentaires gourmandes en ressources humaines, telles que des opérations mathématiques lourdes, le chargement d'actifs ou l'apparition de préfabriqués.

Que dois-je savoir d'autre ?
  • Même si les images ne sont pas rendues aussi souvent, les événements sont envoyés aux scripts à un rythme normal. Cela signifie que vous pouvez recevoir des données pendant une image qui n'est pas rendue. Pour éviter l'apparition d'un décalage d'entrée, nous vous recommandons d'appeler OnDemandRendering.renderFrameInterval = 1 pour la durée de l'entrée afin que les boutons, les mouvements, etc. restent réactifs.
  • Les situations où les scripts, la physique, l'animation, etc. sont très importants, mais où il n'y a pas de rendu, ne bénéficieront pas de l'utilisation du rendu à la demande. Les résultats peuvent apparaître irréguliers et avec une réduction négligeable de l'utilisation de l'unité centrale et de l'énergie.
Exemple

Voici un exemple simple montrant comment le rendu à la demande pourrait être utilisé dans un menu pour effectuer le rendu à 20 FPS à moins qu'il n'y ait une entrée.

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;
        }
    }
}
Image

Voici un exemple de projet montrant comment le rendu à la demande peut être utilisé dans diverses situations.

Utilisez-vous le rendu à la demande ?

Faites-nous savoir dans les forums comment le rendu à la demande fonctionne pour vous. Nous l'avons testé sur Windows, macOS, WebGL, iOS et Android, à la fois dans l'éditeur Unity et avec des joueurs autonomes, mais nous sommes toujours ouverts à plus de retours.