résolution dynamique

La résolution dynamique ajuste le pourcentage de l'écran principal en fonction de la charge de travail du GPU des frames précédentes. La résolution s'ajuste (si nécessaire) en fonction d'une heuristique, par exemple, lorsqu'il y a trop d'objets sur l'écran ou s'il y a un effet coûteux qui entre soudainement dans la frame. Le temps de rendu du GPU augmentera et la résolution de l'écran sera réduite pour maintenir le taux de rafraîchissement ciblé.

résolution dynamique dans Unreal Engine 4
Résolution dynamique dans Unreal Engine 4.

Activation de la résolution dynamique

Vous pouvez activer la résolution dynamique pour votre projet en utilisant le mode opération pour définir comment elle peut être remplacée et utilisée dans votre jeu. Pour contrôler cela, dans le profil de configuration (ou le profil de périphérique) de votre plate-forme (Xbox One, PlayStation 4, etc.), vous pouvez utiliser la commande de console suivante:

r.DynamicRes.OperationMode

Utilisez l'une des valeurs suivantes pour définir le mode de fonctionnement de la plate-forme de votre projet :

  • 1 : active la résolution dynamique en fonction de l'état des paramètres utilisateur du jeu (défini en C ++ ou dans Blueprint).
  • 2 : active la résolution dynamique quel que soit l'état des paramètres utilisateur du jeu.

Après l'activation de la résolution dynamique, les variables de console suivantes définissent les pourcentages d'écran minimum et maximum, ainsi que le budget maximal d'une image donnée avant qu'elle n'abaisse la résolution. Des valeurs par défaut sont en place jusqu'à ce que vous les définissiez.

Variable de la consoleValeur par défautDescription
r.DynamicRes.MinScreenPercentage50Définit le pourcentage d'écran minimum à utiliser.
r.DynamicRes.MaxScreenPercentage100Définit le pourcentage d'écran principal maximal utilisé pour allouer les cibles de rendu.
r.DynamicRes.FrameTimeBudget33.3Définit le budget de la frame (en millisecondes).

Mettre en pause et reprendre la résolution dynamique

Parfois, vous pouvez avoir besoin d'une résolution dynamique activée pour le projet, mais pas dans des zones comme le lobby principal. La résolution dynamique peut être mise en pause et reprise en même temps que le Operation Mode. La variable de console suivante peut être utilisée pour définir le mode de fonctionnement de la résolution dynamique.

r.DynamicRes.OperationMode
ValeurDescription
0Désactivé (par défaut).
1Activé en fonction du paramètre utilisé dans GameUserSettings.
2Activé quel que soit le paramètre utilisé par GameUserSettings.

Le tableau ci-dessous présente les différents états disponibles lorsqu'un mode d'opération spécifique est activé ou désactivé et la manière dont GameUserSettings est affecté.

 Game User Settings = False Game User Settings = True
 En pauseNon mis en pauseEn pauseNon mis en pause
OperationMode=0NonNonNonNon
OperationMode=1NonNonNonOui
OperationMode=2NonOuiNonOui

En C ++, vous pouvez utiliser les fonctions suivantes pour contrôler et vérifier l'état de la résolution dynamique.

ActionFonction C++
PauseGEngine->PauseDynamicResolution();
ResumeGEngine->ResumeDynamicResolution();
Vérifier l'état (Désactivé/Activé ou En pause)GEngine->GetDynamicResolutionStatus();

Utilisation de statistiques

Il existe plusieurs écrans statistiques que vous pouvez activer pour déboguer les performances avec la résolution dynamique. Vous pouvez les activer en ouvrant la console à l'aide de la touche backtick (`) et en entrant l'une des commandes suivantes :

  • Stat Unit est utilisé pour examiner le temps de frame global ainsi que le game thread, le rendering thread et les temps de GPU.
  • Stat UnitGraph est utilisé pour voir un graphique avec les données Stat Unit.
  • Stat Raw génère des données non filtrées à l'aide de Stat UnitGraph.

Stat Unit

Lorsque le Stat Unit est appelée, vous pouvez voir immédiatement si la résolution dynamique est activée pour votre scène en référençant la ligne DynRes.

DynRes désactivé
DynRes désactivé.

Une fois activée, l'étiquette DynRes affichera le pourcentage de l'écran principal et le pourcentage de l'écran secondaire.

DynRes activé
DynRes activé.

Le pourcentage de l'écran principal est affiché ici pour les axes X et Y afin que vous n'oubliiez pas qu'il est mis à l'échelle sur les deux axes. Le nombre de pixels dessinés par le GPU est en fait proportionnel au Pourcentage d'écran X Pourcentage d'écran. Un exemple serait 1920x1080 ou 1280x720.

Stat UnitGraph et Stat Raw

Lorsque Stat UnitGraph est appelé, un graphique est dessiné pour afficher le pourcentage d'écran principal choisi par la résolution dynamique.

Stat UnitGraph
Stat UnitGraph.

  • Timings (Filtered or Raw)
  • Target Frame Time Threshold
  • Pourcentage maximal d'écran de résolution dynamique
  • Courbe de pourcentage de l'écran principal dynamique

UnitGraph peut afficher le pourcentage d'écran principal choisi par la résolution dynamique. Cependant, cette courbe est proportionnelle à la quantité de pixels tracée par le GPU en utilisant le pourcentage d'écran X le pourcentage d'écran.

De plus, vous pouvez obtenir des timings non filtrés (raw) dans UnitGraph en utilisant Stat Raw pour basculer entre filtré et non filtré. L'étiquette de minutage du graphique changera pour indiquer qu'il affiche des minutages bruts.

Raw Timings
Raw Timings.
Filtered Timings
Filtered Timings.

Dynamic Resolution Cruising

L'implémentation de la résolution dynamique dans UE4 est un peu différente de celles qui ont été utilisées auparavant car nous permettons à la résolution de changer selon les besoins dans une plage donnée plutôt que d'être contrainte à une seule résolution (1080p, 900p, 720p). Dans cet exemple de graphique, ce modèle montre ce que les variables de la console contrôlent. Il démontre comment la résolution dynamique s'ajuste automatiquement dans une plage donnée (3) lorsque tout fonctionne correctement et ne dépasse pas le budget pour la frame donnée. Pensez à cette gamme comme l'altitude de croisière pour un avion où il peut se déplacer librement autour de cette gamme d'altitude pour une vitesse idéale pour se rendre à sa destination. Tout comme l'avion, la résolution fait la même chose en montant et en descendant, car il faut maintenir un bon équilibre entre la résolution et une performance adéquate.

Ce modèle est pour la démonstration et ne considère pas tout ce qui se passe dans une scène donnée. Par exemple, il ne capture pas ce à quoi ressemblerait le GPU qui n'est pas synchronisé avec le CPU, ou même que l'heuristique fait la bonne estimation de la quantité de changement de la résolution. Son but est de démontrer clairement les circonstances «idéales» pour montrer comment fonctionnent les variables de la console de la résolution dynamique.

graphique GPU des frames
Graphique GPU des frames.
NombreVariable de la consoleDescription
1r.DynamicRes.FrameTimeBudgetLe budget-temps de la frame est mesuré en millisecondes (ms).
2r.DynamicRes.TargetedGPUHeadRoomLa marge de manœuvre laissée au GPU pour augmenter avant de dépasser le budget (en pourcentages). Cela dépendra probablement de la plate-forme d'expédition ou des fonctions de rendu activées. Par exemple, le flou de mouvement a besoin d'espace supplémentaire pour le coût afin de tenir compte de la rotation rapide des mouvements de caméra.
3r.DynamicRes.ChangePercentageThresholdLes modifications minimales requises en pourcentage pour redimensionner réellement l'allocation. Il est utile de ne pas changer constamment entre une taille de résolution très proche. Si la valeur est trop petite, elle peut changer constamment la résolution, et si elle est trop importante, elle risque de dépasser le budget GPU.
4r.DynamicRes.MinResolutionChangePeriodLe nombre minimum de frames avant tout changement de résolution. Cette commande a des buts multiples. Il s'agit notamment d'avoir une meilleure fiabilité de l'heuristique pour modéliser la consommation du GPU à un pourcentage d'écran principal donné malgré le bruit de mesure, d'être capable d'éviter l'interférence de décalage de l'échantillon d'entrée de Temporal Upsample qui peut se produire entre la gigue de décalage par frame et la résolution changeante qui peut être responsable de la divergence de l'anticrénelage.

Vous pouvez également utiliser les variables de console suivantes pour ajuster l'historique de l'heuristique utilisée pour la résolution dynamique et un pourcentage d'écran à utiliser si vous êtes lié à la CPU au lieu de la limite GPU.

Variable de la consoleDescription
r.DynamicRes.HistorySizeLe nombre de frames dans l'historique des images heuristiques. Si elle est trop courte, l'historique peut être trop bruyant pour que l'heuristique soit fiable, ou si elle est trop longue, il peut y avoir des ajustements très retardés.
r.DynamicRes.CPUBoundScreenPercentageLe pourcentage de l'écran principal qui devrait être ciblé lorsque vous êtes lié par le CPU. Il est utile de définir un pourcentage d'écran inférieur pour diminuer la résolution sur les plates-formes où le CPU et le GPU partagent la même bande passante mémoire.

La panique du dépassement de budget

Si vous trouvez que la résolution dynamique dépasse le budget très rapidement, comme lors d'une coupure de la caméra ou quand un effet visuel coûteux se produit, l'heuristique utilisée ne peut pas réellement prédire quand cela se produira. Dans ces cas, un commutateur de "panique" est utilisé pour réduire rapidement la résolution quand il arrive de réduire le nombre de frames qui dépassent le budget. Si l'heuristique trouve que N (un certain nombre) de frames consécutives avec les timings GPU disponibles dépasse le budget, elle va immédiatement adapter la résolution pour lutter contre ces timings au-dessus du budget. Il effectuera également une réinitialisation automatique de l'historique, de sorte que les synchronisations de frames, auparavant moins coûteuses, n'influencent pas l'heuristique pour les frames plus coûteuses.

Utilisez la commande de console suivante pour contrôler le nombre maximal de frames consécutives que le GPU peut dépasser le budget avant de basculer le commutateur «panique» pour abaisser la résolution.

r.DynamicRes.MaxConsecutiveOverbudgetGPUFrameCount

Dans ce graphique, la frame reçoit un saut soudain qui la place au-dessus du budget fixé de 33,3 ms pour plus de deux frames consécutives. Le bouton de panique est activé pour réduire rapidement la résolution de sorte que la frame ne dépasse plus le budget.

graphique de panique de dépassement de budget
Graphique de panique de dépassement de budget.

  • Max frames GPU consécutifs dépassant le budget.
  • La latence de la frame entre la détection et la modification de la résolution causée par le fait que le GPU n'est pas synchronisé avec le thread de rendu.
  • La détection de panique arrive à déclencher la chute des frames.
  • Le changement de résolution se produit pour les frames données.

Dans les captures suivantes (extraites de la démo d'Infiltrator disponible sur l'onglet Learn du lanceur Epic Games), la commande Stat Raw permet d'identifier clairement le comportement de la scène en cas de coupure de la caméra ou lorsqu'un effet visuel coûteux se produit sur l'écran.

exemple de panique de dépassement de budget
Exemple de panique de dépassement de budget.

  • Après la coupure de la caméra, la frame devient beaucoup plus coûteuse à rendre, du moins pour quelques frames.
  • La résolution dynamique a une réaction de panique et réduit rapidement la résolution pour compenser avant de revenir progressivement à la normale à nouveau.

valeur SP de la fenêtre d'affichage
Valeur SP de la fenêtre d'affichage.

  • Un effet visuel se produit qui est plus coûteux à rendre provoquant un pic qui est le budget de frame alloué pour plus de deux frames.
  • La résolution dynamique agit rapidement en abaissant la résolution avant de revenir progressivement à la normale.

Test de contenu avec différents pourcentages d'écran principal

Si votre projet a activé la résolution dynamique, vous devrez le tester et vous assurer qu'il n'est pas significativement différent de ce qui est prévu lorsque vous utilisez un pourcentage d'écran principal inférieur. À des résolutions plus basses, certains détails peuvent être perdus et vos assets peuvent ne pas conserver l'apparence que vous voulez qu'ils aient. Pour cette raison, toutes les fenêtres de l'éditeur peuvent définir un pourcentage d'écran en utilisant un slider pour tester.

Screen Percentage dans la fenêtre de l'éditeur
Screen Percentage dans la fenêtre de l'éditeur.

Utilisez le slider pour appliquer un pourcentage d'écran supérieur ou inférieur à la fenêtre d'affichage et vérifiez le contenu de votre niveau en conséquence. Les artistes, en particulier, doivent utiliser le slider pour vérifier leur contenu dans les plages haute et basse des pourcentages d'écran qui seront utilisés pour le projet.

indicateur du pourcentage de l'écran
Indicateur du pourcentage de l'écran.

Plates-formes supportées

Actuellement, la Xbox One, PlayStation 4 (à l'exclusion de PSVR) et Oculus VR prennent en charge la résolution dynamique. Une prise en charge des plate-formes supplémentaire est prévue pour les futures versions de Unreal Engine.

Remplacement de l'heuristique de résolution dynamique en C++

L'heuristique de thread de rendu fournie par le moteur est complètement autonome dans DynamicResolution.cpp. L'architecture est configurée pour permettre à l'heuristique d'être entièrement remplaçable par les plugins dans le code du jeu.

Par exemple, si votre projet doit remplacer l'heuristique par défaut parce que vous voulez faire quelque chose comme du code de jeu qui donne des indications sur ce qui va se passer dans la frame suivante, vous pouvez réécrire l'heuristique complète pour faire cela. En implémentant IDynamicResolutionState et ISceneViewFamilyScreenPercentage, vous pouvez remplacer les états de résolution dynamique par défaut, comme dans l'exemple ci-dessous.

GEngine->ChangeDynamicResolutionStateNextFrame(new FMyGameSpecificDynamicResolutionState());

Le moteur de rendu va maintenant travailler avec ResolutionFraction pour éviter la division de 100 partout dans le calcul de pourcentage d'écran. Il est nommé fraction au lieu de "scale" parce que le ratio upscale est fait par l'upsample TAA ou que l'upscale spatiale est réellement représentée par 1 divisé par la fraction de résolution, comme ceci.

Resolution Fraction = Screen Percentage/100 = 1/Upscaling Factor

Limitations

Voici quelques limitations actuelles de la résolution dynamique :

  • Il n'est pas pris en charge pour une utilisation avec Play-In-Editor multi-world.
  • Lorsque TAAU est activé, il fonctionnera avec VR. Le support MSAA (Multi-Sample Anti-Aliasing) suivra dans une prochaine version.
  • L'API est entièrement compatible avec le moteur de rendu mobile. Cependant, il n'y a pas eu d'effort pour maintenir la taille de la vue qui n'est pas égale à la taille du tampon cible de rendu qui est définie par la limite supérieure du pourcentage d'écran principal.
  • La profondeur de champ gaussienne (DoF) et l'occlusion ambiante de champ de distance (DFAO) ont des problèmes avec les changements de résolution.

les réactions

Pour laisser un avis, vous devez être inscrit et connecté

Se connecter