Partiellement déconseillé. La technique de corrélation des images décrite dans cet article repose sur
XGameStreamingGetAssociatedFrame et XGameStreamingGetLastFrameDisplayed, qui sont déconseillé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 demeure disponible. Consultez Mesure de la latence en diffusion de jeux en continu pour connaître les techniques tenant compte de la latence qui ne dépendent pas de la corrélation des images.
Compensation de la latence
Pour compenser la latence dans des exemples comme 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 adéquate est de savoir jusqu’où remonter dans le passé. Les API de 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 retourne une moyenne récente de la latence ajoutée par la diffusion en continu. Cette moyenne est divisée en latence d’entrée et en latence de sortie. La latence d’entrée est le temps nécessaire pour qu’une entrée de l’utilisateur soit reçue par le serveur, et la latence de sortie est le temps nécessaire pour qu’une image 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 image à l’autre, de sorte que cette approche est imprécise. De plus, les mesures de latence ajoutée par la diffusion n’incluent pas les portions de latence non liées à la diffusion, comme le temps que prend le jeu pour exécuter les simulations et effectuer le rendu.Jetons d’image avec entrée
L’API XGameStreamingGetAssociatedFrame aide à 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 image, 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 l’image est terminée, le jeu appelle PresentX avec le jeton.
PresentX garantit que le jeton est automatiquement envoyé au client de diffusion de jeux en continu, avec l’image vidéo correspondante.
Les entrées envoyées au serveur sont accompagnées du jeton de l’image actuellement affichée sur le client. Lorsque le jeu reçoit un IGameInputReading, vous pouvez le passer à l’API XGameStreamingGetAssociatedFrame pour récupérer le jeton. Vous pouvez l’utiliser pour retrouver 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 qu’il maintient simplement un bouton enfoncé), il n’y aura pas de nouveau jeton.
Jetons d’image 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 à l’intérieur de ces fenêtres de temps. Idéalement, un utilisateur en diffusion en continu aura exactement autant de temps pour réagir qu’un utilisateur qui ne diffuse pas en continu. 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 les 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 retourne leD3D12XBOX_FRAME_PIPELINE_TOKEN de l’image que le client de diffusion en continu a affichée le plus récemment. Comme elle est constamment mise à jour, vous pouvez l’appeler à tout moment pour vérifier si l’utilisateur a vu la fin d’une animation.
Il est possible d’utiliser
XGameStreamingGetLastFrameDisplayed de la même façon que XGameStreamingGetAssociatedFrame. Nous vous recommandons d’utiliser XGameStreamingGetAssociatedFrame lors du traitement des entrées, car elle retourne le jeton qui était à l’écran au moment où cette entrée s’est produite. Si plus de temps s’est écoulé, XGameStreamingGetLastFrameDisplayed pourrait retourner un jeton provenant d’une image plus récente.