Parcialmente en desuso. La técnica de correlación de fotogramas descrita en este artículo se basa en
XGameStreamingGetAssociatedFrame y XGameStreamingGetLastFrameDisplayed, que están en desuso a partir de la versión 2604 del GDK y se quitarán en una versión futura. La API general de medición de latencia XGameStreamingGetStreamAddedLatency sigue disponible. Consulta Medición de la latencia en game streaming para conocer técnicas conscientes de la latencia que no dependen de la correlación de fotogramas.
Compensación de latencia
Para compensar la latencia en ejemplos como el mostrado en la figura 1, los juegos tienen registros de sus estados anteriores. Cuando el usuario pulsa el botón de salto, el juego busca ese punto en el juego para determinar si el usuario pulsó el botón en el momento adecuado desde su perspectiva. La clave para una compensación de latencia correcta es saber cuánto hay que buscar en el pasado. Las API de XBOX Game Streaming ofrecen varias opciones para ello.Latencia media
El enfoque más sencillo, pero menos preciso, para algunos escenarios es usar la latencia media. La API XGameStreamingGetStreamAddedLatency devuelve un promedio reciente de la latencia que agrega la transmisión. Ese promedio se divide en latencia de entrada y latencia de salida. La latencia de entrada es el tiempo que tarda el servidor en recibir una entrada del usuario, y la latencia de salida es el tiempo que tarda el dispositivo cliente en recibir y procesar un fotograma de vídeo renderizado por el juego. Para las acciones basadas en el tiempo, un juego puede usar este promedio como una estimación de cuándo se produjo una acción. Sin embargo, la latencia de red puede variar, incluso de fotograma a fotograma, por lo que este enfoque es impreciso. Además, las mediciones de la latencia agregada por la transmisión no incluyen las partes de la latencia ajenas a la transmisión, como el tiempo que tarda el juego en ejecutar las simulaciones y renderizar.Tokens de fotograma con entrada
La API XGameStreamingGetAssociatedFrame ayuda a resolver este problema proporcionando información precisa sobre el estado del juego que el usuario vio cuando pulsó un botón (o cambió cualquier otra entrada). Cuando comienza un fotograma, los juegos que usan Microsoft Game Development Kit (GDK) llaman aID3D12Device::WaitFrameEventX y reciben un D3D12XBOX_FRAME_PIPELINE_TOKEN. Puedes usar D3D12XBOX_FRAME_PIPELINE_TOKEN como clave para guardar el estado actual y usarlo más adelante en una estructura de datos de tu elección, como un mapa hash. Cuando el fotograma se completa, el juego llama a PresentX con el token.
PresentX garantiza que el token se envíe automáticamente al cliente de transmisión de juegos, junto con el fotograma de vídeo correspondiente.
La entrada que se envía al servidor va acompañada del token del fotograma que se muestra actualmente en el cliente. Cuando el juego recibe un IGameInputReading, puedes pasarlo a la API XGameStreamingGetAssociatedFrame para recuperar el token. Puedes usarlo para buscar el estado anterior y controlar la entrada basándote en ese estado almacenado.
Si una entrada no ha cambiado (porque el usuario no está tocando el mando o porque simplemente mantiene pulsado un botón), no habrá un token nuevo.
Tokens de fotograma sin entrada
En algunos casos, debes saber qué es lo último que ha visto el usuario, aunque su entrada no haya cambiado. Volviendo al ejemplo de la figura 1, cuando el personaje llega al final de la cinta transportadora, cae. Parte del desafío y la equidad de un juego consiste en reaccionar dentro de esas ventanas de tiempo. Idealmente, un usuario que transmite tendrá exactamente el mismo tiempo para reaccionar que un usuario que no transmite. Debido a la latencia, el momento final de la ventana debería desplazarse de modo que se acepten las entradas recibidas al final de la ventana. Para ello, el juego puede usar tokens de latencia en los que no se pulsó un botón. Si una lectura de entrada sin acción coincide con el estado del final de la ventana, el usuario no reaccionó a tiempo y el juego puede penalizarlo de forma justa. La API XGameStreamingGetLastFrameDisplayed devuelve elD3D12XBOX_FRAME_PIPELINE_TOKEN del fotograma que el cliente de transmisión mostró más recientemente. Como se actualiza constantemente, puedes llamarla en cualquier momento y ver si el usuario ha visto el final de una animación.
Es posible usar
XGameStreamingGetLastFrameDisplayed de la misma manera que XGameStreamingGetAssociatedFrame. Te recomendamos que uses XGameStreamingGetAssociatedFrame al procesar la entrada porque devuelve el token que estaba en pantalla cuando se produjo esa entrada. Si ha pasado más tiempo, XGameStreamingGetLastFrameDisplayed podría devolver un token de un fotograma más reciente.