Partiellement déprécié. La technique de corrélation des frames décrite dans cet article s’appuie sur
XGameStreamingGetAssociatedFrame et XGameStreamingGetLastFrameDisplayed, qui sont dépréciées depuis la version 2604 du GDK et seront supprimées dans une version ultérieure. L’API générale de mesure de la latence XGameStreamingGetStreamAddedLatency reste disponible. Consultez Mesure de la latence du streaming de jeux pour découvrir des techniques tenant compte de la latence qui ne dépendent pas de la corrélation des frames.
Compensation de la latence
Pour compenser la latence dans des exemples tels que celui de la figure 1, les jeux conservent un historique de leurs états précédents. Lorsque l’utilisateur appuie sur le bouton de saut, le jeu recherche ce moment dans le jeu pour déterminer si l’utilisateur a appuyé sur le bouton au bon moment de son point de vue. La clé d’une compensation de la latence correcte consiste à savoir jusqu’où remonter dans le passé. Les API XBOX Game Streaming offrent plusieurs options à cet effet.Latence moyenne
L’approche la plus simple, mais la moins précise dans certains scénarios, consiste à utiliser la latence moyenne. L’API XGameStreamingGetStreamAddedLatency renvoie une moyenne récente de la latence ajoutée par le streaming. Cette moyenne est divisée en latence d’entrée et latence de sortie. La latence d’entrée correspond au temps nécessaire pour qu’une entrée utilisateur soit reçue par le serveur, et la latence de sortie correspond au temps nécessaire pour qu’une frame vidéo rendue par le jeu soit reçue et traitée par l’appareil client. Pour les actions basées sur le temps, un jeu peut utiliser cette moyenne comme estimation du moment où une action s’est produite. Toutefois, la latence réseau peut varier, même d’une frame à l’autre, de sorte que cette approche est imprécise. En outre, les mesures de latence ajoutée par le streaming n’incluent pas les parties de la latence non liées au streaming, comme le temps nécessaire au jeu pour exécuter les simulations et effectuer le rendu.Jetons de frame avec entrée
L’API XGameStreamingGetAssociatedFrame permet de résoudre ce problème en fournissant des informations précises sur l’état du jeu que l’utilisateur voyait lorsqu’il a appuyé sur un bouton (ou modifié toute autre entrée). Au début d’une frame, les jeux qui utilisent le Microsoft Game Development Kit (GDK) appellentID3D12Device::WaitFrameEventX et reçoivent un D3D12XBOX_FRAME_PIPELINE_TOKEN. Vous pouvez utiliser D3D12XBOX_FRAME_PIPELINE_TOKEN comme clé pour enregistrer l’état actuel en vue d’une utilisation ultérieure dans la structure de données de votre choix, comme une table de hachage. Lorsque la frame est terminée, le jeu appelle PresentX avec le jeton.
PresentX garantit que le jeton est automatiquement envoyé au client de streaming de jeux, avec la frame vidéo correspondante.
Les entrées envoyées au serveur sont accompagnées du jeton de la frame actuellement affichée sur le client. Lorsque le jeu reçoit un IGameInputReading, vous pouvez le transmettre à l’API XGameStreamingGetAssociatedFrame pour récupérer le jeton. Vous pouvez l’utiliser pour rechercher l’état précédent et traiter l’entrée en fonction de cet état enregistré.
Si une entrée n’a pas changé (parce que l’utilisateur ne touche pas la manette ou parce qu’il maintient simplement un bouton enfoncé), il n’y aura pas de nouveau jeton.
Jetons de frame sans entrée
Dans certains cas, vous devez savoir ce que l’utilisateur a vu le plus récemment, même si son entrée n’a pas changé. Pour revenir à l’exemple de la figure 1, lorsque le personnage atteint le bout du tapis roulant, il tombe. Une partie du défi et de l’équité d’un jeu consiste à réagir dans ces fenêtres de temps. Idéalement, un utilisateur en streaming disposera exactement du même temps pour réagir qu’un utilisateur qui ne joue pas en streaming. En raison de la latence, l’heure de fin de la fenêtre doit être décalée afin que les entrées reçues à la fin de la fenêtre soient acceptées. Pour ce faire, le jeu peut utiliser des jetons de latence lorsqu’aucun bouton n’a été enfoncé. Si une lecture d’entrée sans action correspond à l’état de la fin de la fenêtre, l’utilisateur n’a pas réagi et le jeu peut le pénaliser équitablement. L’API XGameStreamingGetLastFrameDisplayed renvoie leD3D12XBOX_FRAME_PIPELINE_TOKEN de la frame que le client de streaming a affichée le plus récemment. Comme il est constamment mis à jour, vous pouvez l’appeler à tout moment et vérifier si l’utilisateur a vu la fin d’une animation.
Il est possible d’utiliser
XGameStreamingGetLastFrameDisplayed de la même manière que XGameStreamingGetAssociatedFrame. Nous vous recommandons d’utiliser XGameStreamingGetAssociatedFrame lors du traitement des entrées, car elle renvoie le jeton qui était à l’écran au moment où cette entrée s’est produite. Si davantage de temps s’est écoulé, XGameStreamingGetLastFrameDisplayed peut renvoyer un jeton provenant d’une frame plus récente.