Remplacement des chaînes d’échange par la présentation directe et la planification des images
Game OS a remanié 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 de la ressource d’image présentée
- Accroître la souplesse de la configuration dynamique des plans et des paramètres d’affichage
- Accroître la liberté de choix de la file d’attente de commandes pour la soumission des présentations
- Établir un mécanisme explicite de limitation du processeur pour un contrôle précis de l’exécution du pipeline de simulation et de rendu
- Améliorer la tenue à jour et la production de rapports des statistiques du pipeline d’images
- La présentation directe d’objets ID3D12Resource affichables offre une grande polyvalence dans la disposition et la sélection des ressources d’échange, puisque la chaîne devient un groupe 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 un blocage de la file d’attente graphique en attente d’une clôture de présentation signalée par une file d’attente de calcul après le traitement d’une ressource d’échange (prise en charge dans un proche avenir).
- 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 processeur, 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 affichées dans PIX. La connaissance qu’a 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 également bénéfique pour la surveillance et le réglage du service XBOX Game Streaming.
- Une planification de la production de nouvelles images à afficher, fondée sur les événements et pilotée par les interruptions, 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, de façon facultative, 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 en tant que mécanisme de limitation formel. Le système permet de spécifier, de façon facultative, 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’intervalle en nombre entier de suppressions verticales. Ce changement permet de préserver un rendu d’images constant sur le matériel fixe de la console malgré des fréquences de sortie d’affichage variables (par exemple, un rendu à 60 Hz sur un écran à 60 Hz ou à 120 Hz), et permet de prendre en charge facilement à l’avenir le rendu natif à des fréquences supérieures à 60 Hz (par exemple, 120 Hz en natif).
- L’élargissement des statistiques d’images suivies, avec un mécanisme de production de rapports filtrable et extensible pour de futurs ajouts.
- L’identification des heures d’origine des images, conjugué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), permet à la plateforme de demander au micrologiciel de la manette (ou d’un autre périphérique) de recueillir des échantillons d’entrée et de les rendre disponibles juste à temps pour les requêtes du jeu, afin de contribuer à réduire au minimum la latence globale.
Migration à partir de Windows et de 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 ont des équivalents comparables. Pour vous aider à vous orienter, un ensemble d’API et de paramètres hérités couramment utilisés est présenté dans le tableau suivant, avec leurs remplacements correspondants dans la colonne adjacente.Flux de travail général
L’approche générale pour créer un groupe de ressources affichables, planifier les images en tant que mécanisme de limitation explicite et présenter les ressources d’image à l’écran comprend 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, incidences 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 servant de groupe de ressources échangeables prenant en charge la présentation à l’écran (c’est-à-dire une « chaîne d’échange »).
- Appelez ID3D12Device::SetFrameIntervalX pour établir une fréquence d’actualisation des images et une période. LengthInMicroseconds définit l’intervalle de temps entre les présentations d’images à l’écran (retournements). PeriodInIntervals définit l’avance que le processeur est autorisé à prendre sur le GPU, en nombre entier d’intervalles d’image. Le processeur est autorisé à prendre PeriodInIntervals - 1 images d’avance sur le GPU avant d’être limité (par exemple, une valeur PeriodInIntervals de 2 permet au processeur 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 établir le moment, au sein d’un intervalle d’image, où le processeur est limité. Spécifiez un Type D3D12XBOX_FRAME_EVENT_ORIGIN et un décalage temporel IntervalOffsetInMicroseconds pour planifier l’événement d’origine des images. Le processeur 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 processeur. Spécifiez une valeur TimeOutInMs de D3D12XBOX_WAIT_FRAME_EVENT_INFINITE pour bloquer jusqu’à l’arrivée de l’origine, ou un délai fixe en millisecondes pour interroger l’événement d’origine (S_FALSE est retourné 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, est défini sur une valeur de jeton qui identifie l’image de façon unique. Ce jeton doit être suivi pour l’image et fourni au moment de sa présentation à l’écran.
- Interrogez l’entrée 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 mettre en file d’attente les ressources de l’image rendue en vue de leur présentation à l’écran. Les ressources et les jetons d’image sont fournis dans le tableau pPlaneParameters.
- Appelez ID3D12Device::GetFrameStatisticsX en utilisant le jeton de la dernière image censée avoir atteint l’écran (ou effectuez plusieurs appels sur différentes images d’intérêt). Analysez les statistiques d’images retournées afin d’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ésenter après l’appel sera retournée à l’écran.
- Effectuez tout travail indépendant des entrées sur le processeur ou le GPU avant de passer à l’attente de la prochaine origine d’image (ou pendant que vous l’interrogez).
