Parcialmente preterido. A técnica de correlação de quadros descrita neste artigo depende de
XGameStreamingGetAssociatedFrame e XGameStreamingGetLastFrameDisplayed, que estão preteridas a partir da versão 2604 do GDK e serão removidas em uma versão futura. A API geral de medição de latência XGameStreamingGetStreamAddedLatency continua disponível. Consulte Medição de latência no streaming de jogos para conhecer técnicas que levam a latência em conta e não dependem da correlação de quadros.
Compensação de latência
Para compensar a latência em exemplos como o mostrado na figura 1, os jogos mantêm registros de seus estados anteriores. Quando o usuário pressiona o botão de pulo, o jogo procura esse ponto no jogo para determinar se o usuário pressionou o botão no momento certo do ponto de vista dele. A chave para a compensação de latência correta é saber até que ponto do passado procurar. As APIs do XBOX Game Streaming oferecem várias opções para isso.Latência média
A abordagem mais simples, mas menos precisa, para alguns cenários é usar a latência média. A API XGameStreamingGetStreamAddedLatency retorna uma média recente da latência adicionada pelo streaming. Essa média é dividida em latência de entrada e latência de saída. A latência de entrada é o tempo que uma entrada do usuário leva para ser recebida pelo servidor, e a latência de saída é o tempo que um quadro de vídeo renderizado pelo jogo leva para ser recebido e processado pelo dispositivo cliente. Para ações baseadas em tempo, um jogo pode usar essa média como uma estimativa de quando uma ação ocorreu. No entanto, a latência de rede pode variar, até mesmo de um quadro para outro, portanto essa abordagem é imprecisa. Além disso, as medições de latência adicionada pelo stream não incluem as partes da latência que não são de streaming, como o tempo que o jogo leva para executar simulações e renderizar.Tokens de quadro com entrada
A API XGameStreamingGetAssociatedFrame ajuda a resolver esse problema fornecendo informações precisas sobre o estado do jogo que o usuário viu quando pressionou um botão (ou alterou qualquer outra entrada). Quando um quadro começa, os jogos que usam o Microsoft Game Development Kit (GDK) chamamID3D12Device::WaitFrameEventX e recebem um D3D12XBOX_FRAME_PIPELINE_TOKEN. Você pode usar D3D12XBOX_FRAME_PIPELINE_TOKEN como chave para salvar o estado atual para uso posterior em uma estrutura de dados de sua escolha, como um mapa de hash. Quando o quadro é concluído, o jogo chama PresentX com o token.
PresentX garante que o token seja enviado automaticamente ao cliente de streaming de jogos, junto com o quadro de vídeo correspondente.
A entrada enviada ao servidor é acompanhada do token do quadro exibido no momento no cliente. Quando o jogo recebe um IGameInputReading, você pode passá-lo para a API XGameStreamingGetAssociatedFrame para obter o token de volta. Você pode usá-lo para consultar o estado anterior e tratar a entrada com base nesse estado armazenado.
Se uma entrada não tiver mudado (porque o usuário não está tocando no controle ou porque está apenas mantendo um botão pressionado), não haverá um novo token.
Tokens de quadro sem entrada
Em alguns casos, você precisa saber o que o usuário viu mais recentemente, mesmo que a entrada dele não tenha mudado. Voltando ao exemplo mostrado na figura 1, quando o personagem chega ao fim da esteira rolante, ele cai. Parte do desafio e da justiça de um jogo é reagir dentro dessas janelas de tempo. Idealmente, um usuário de streaming terá exatamente o mesmo tempo para reagir que um usuário que não usa streaming. Por causa da latência, o horário final da janela deve ser deslocado para que as entradas recebidas no fim da janela sejam aceitas. Para isso, o jogo pode usar tokens de latência em que um botão não foi pressionado. Se uma leitura de entrada sem ação corresponder ao estado do fim da janela, o usuário não reagiu, e o jogo pode penalizá-lo de forma justa. A API XGameStreamingGetLastFrameDisplayed retorna oD3D12XBOX_FRAME_PIPELINE_TOKEN do quadro exibido mais recentemente pelo cliente de streaming. Como ele é atualizado constantemente, você pode chamá-la a qualquer momento e verificar se o usuário viu o fim de uma animação.
É possível usar
XGameStreamingGetLastFrameDisplayed da mesma forma que XGameStreamingGetAssociatedFrame. Recomendamos usar XGameStreamingGetAssociatedFrame ao processar a entrada, porque ela retorna o token que estava na tela quando essa entrada ocorreu. Se mais tempo tiver passado, XGameStreamingGetLastFrameDisplayed poderá retornar um token de um quadro mais recente.