Remplacement des chaînes d’échange par la présentation directe et la planification des images
Game OS a entièrement repensé le processus de présentation graphique. Les objectifs sont les suivants.- Offrir un contrôle plus direct sur la création et la gestion des ressources affichables
- Réduire la latence de bout en bout, de l’échantillonnage du périphérique d’entrée jusqu’au balayage (scan-out) de la ressource d’image présentée
- Accroître la flexibilité de la configuration dynamique des plans d’affichage et des paramètres
- Offrir une plus grande liberté dans le choix de la file d’attente de commandes pour la soumission des présentations
- Mettre en place un mécanisme explicite de limitation du CPU permettant un contrôle précis de l’exécution du pipeline de simulation et de rendu
- Améliorer la gestion et la communication des statistiques du pipeline d’images
- La présentation directe d’objets ID3D12Resource affichables offre une grande souplesse dans l’organisation et la sélection des ressources d’échange, la chaîne évoluant vers un pool géré par l’utilisateur.
- La possibilité d’effectuer la présentation sur n’importe quelle file d’attente de commandes graphiques ou de calcul peut éliminer le blocage de la file d’attente graphique en attente d’une barrière de présentation signalée par une file d’attente de calcul après le traitement d’une ressource d’échange (prise en charge prévue prochainement).
- L’introduction d’une méthode d’identification formelle des images sous la forme d’un jeton de pipeline. Le jeton de pipeline d’image permet de corréler la limitation des images, l’échantillonnage des entrées, les événements d’enregistrement des listes de commandes du CPU, les événements de rendu du GPU et les événements du pipeline d’affichage pour les images dont la durée dans le pipeline s’étend sur plusieurs intervalles de synchronisation verticale. Des statistiques cohérentes pour chaque image peuvent ensuite être interrogées par jeton et exposées dans PIX. La connaissance par le système de la durée de vie d’une image, y compris de tous les événements notables qui s’y produisent, est en outre utile à la surveillance et au réglage du service XBOX Game Streaming.
- Une planification basée sur les événements et pilotée par interruptions de la production de nouvelles images à afficher, qui permet de spécifier des heures d’origine dans le pipeline d’images à la cadence de l’intervalle de présentation, avec un déphasage automatique en réponse aux images manquées. La planification permet de spécifier éventuellement des événements créés par l’utilisateur pour une signalisation étendue.
- Un système d’interrogation ou de blocage sur les événements d’origine du pipeline d’images, qui sert de mécanisme formel de limitation. Le système permet de spécifier éventuellement des événements créés par l’utilisateur comme conditions supplémentaires d’une attente.
- Une expression plus abstraite de la fréquence de rendu et de présentation, l’intervalle de présentation étant spécifié sous forme de durée plutôt que sous forme d’un nombre entier de périodes de suppression verticale (v-blank). Cette modification permet de conserver un rendu des images cohérent sur un matériel de console fixe malgré des fréquences de sortie d’affichage variables (par exemple, un rendu à 60 Hz sur un écran à 60 Hz ou à 120 Hz) et facilitera la prise en charge future du rendu natif à des fréquences supérieures à 60 Hz (par exemple, 120 Hz natif).
- L’extension des statistiques d’images suivies, avec un mécanisme de communication filtrable et extensible pour de futurs ajouts.
- L’identification des heures d’origine des images, combinée à l’ajout futur d’horloges synchronisées pour l’affichage et les périphériques d’entrée (afin d’éviter une dérive continue), permettra à la plateforme de demander au microprogramme de la manette (ou d’un autre périphérique) de collecter des échantillons d’entrée et de les mettre à disposition juste à temps pour les requêtes du jeu, afin de réduire au minimum la latence globale.
Migration depuis Windows et l’ERA
Les API liées aux chaînes d’échange, à la présentation et à la planification qui ne sont pas prises en charge sur Game OS disposent d’équivalents comparables. Pour vous aider à vous orienter, le tableau suivant répertorie un ensemble d’API et de paramètres hérités couramment utilisés, avec leurs remplacements correspondants dans la colonne adjacente.Workflow général
L’approche générale pour créer un pool de ressources affichables, planifier les images en tant que mécanisme de limitation explicite et présenter les ressources d’image à l’écran consiste en quelques étapes d’initialisation, suivies d’une séquence d’opérations dans la boucle de jeu. Pour plus d’informations sur chaque étape (descriptions détaillées, implications et utilisation suggérée), consultez les pages de référence. Initialisation- Appelez ID3D12Device::CreateCommittedResource avec des HeapFlags qui incluent D3D12_HEAP_FLAG_ALLOW_DISPLAY pour créer une collection d’objets ID3D12Resource qui servira de pool de ressources échangeables prenant en charge la présentation à l’écran (c’est-à-dire la « chaîne d’échange »).
- Appelez ID3D12Device::SetFrameIntervalX pour définir une fréquence et une période de rafraîchissement des images. LengthInMicroseconds définit l’intervalle de temps entre les présentations d’images à l’écran (flips). PeriodInIntervals définit, en nombre entier d’intervalles d’image, l’avance que le CPU est autorisé à prendre sur le GPU. Le CPU peut prendre PeriodInIntervals - 1 images d’avance sur le GPU avant d’être limité (par exemple, une valeur PeriodInIntervals de 2 permet au CPU d’enregistrer et de soumettre les commandes de rendu de l’image n + 1 pendant que le GPU traite les commandes soumises pour l’image n).
- Appelez ID3D12Device::ScheduleFrameEventX pour définir le moment, au sein d’un intervalle d’image, auquel limiter le CPU. Spécifiez un type D3D12XBOX_FRAME_EVENT_ORIGIN et un décalage temporel IntervalOffsetInMicroseconds pour planifier l’événement d’origine des images. Le CPU est limité jusqu’à ce que la durée IntervalOffsetInMicroseconds spécifiée au sein de l’intervalle se soit écoulée.
- Appelez ID3D12Device::WaitFrameEventX avec un type D3D12XBOX_FRAME_EVENT_ORIGIN pour effectuer la limitation du CPU. Spécifiez une valeur TimeOutInMs égale à D3D12XBOX_WAIT_FRAME_EVENT_INFINITE pour bloquer jusqu’à l’arrivée de l’origine, ou un délai d’expiration fixe en millisecondes pour interroger l’événement d’origine (S_FALSE est renvoyé si l’origine n’est pas encore arrivée). Spécifiez pour pToken un pointeur vers un D3D12XBOX_FRAME_PIPELINE_TOKEN qui, au retour lors de l’arrivée de l’origine, reçoit une valeur de jeton identifiant l’image de manière unique. Ce jeton doit être suivi pour l’image et fourni au moment de sa présentation à l’écran.
- Interrogez les entrées de la manette et effectuez le rendu de l’image dans les objets ID3D12Resource créés avec la prise en charge de l’affichage.
- Appelez ID3D12CommandQueue::PresentX pour placer les ressources de l’image rendue dans la file d’attente de présentation à l’écran. Les ressources et les jetons d’image sont fournis dans le tableau pPlaneParameters.
- Appelez ID3D12Device::GetFrameStatisticsX avec le jeton de la dernière image censée avoir atteint l’écran (ou effectuez plusieurs appels sur différentes images pertinentes). Analysez les statistiques d’images renvoyées pour orienter les mises à jour du point de limitation des images établi, dans le but de réduire au minimum la latence entre l’entrée de la manette et l’affichage. Appelez ID3D12Device::ScheduleFrameEventX avec le type D3D12XBOX_FRAME_EVENT_ORIGIN pour effectuer les mises à jour, qui seront appliquées lorsque la prochaine image présentée après l’appel sera affichée à l’écran (flip).
- Effectuez tout travail indépendant des entrées sur le CPU/GPU avant d’attendre l’origine de l’image suivante (ou pendant son interrogation).
