一部非推奨。 この記事で説明されているフレーム関連付け技術は、
XGameStreamingGetAssociatedFrame および XGameStreamingGetLastFrameDisplayed に依存していますが、これらは 2604 GDK リリース時点で非推奨 となっており、今後のリリースで削除されます。一般的なレイテンシー測定 API である XGameStreamingGetStreamAddedLatency は引き続き利用可能です。フレーム関連付けに依存しないレイテンシー対応技術については、ゲーム ストリーミング レイテンシーの測定 を参照してください。レイテンシー補正
図 1 のような例のレイテンシーを補正するために、ゲームはこれまでの状態を記録しておきます。 ユーザーがジャンプ ボタンを押すと、ゲームはその時点をゲーム内で検索して、ユーザーが自分の視点から正しいタイミングでボタンを押したかどうかを判断します。 正しいレイテンシー補正の鍵は、どのくらい過去まで検索するかを知ることです。XBOX Game Streaming API は、そのためのいくつかのオプションを可能にします。平均レイテンシー
一部のシナリオでは、最もシンプルですが最も精度の低い手法は、平均レイテンシーを使用することです。 XGameStreamingGetStreamAddedLatency API は、ストリーミングによって追加されたレイテンシーの最近の平均を返します。この平均は入力レイテンシーと出力レイテンシーに分割されます。 入力レイテンシーは、ユーザー入力がサーバーによって受信されるまでにかかる時間で、出力レイテンシーは、ゲームがレンダリングしたビデオ フレームがクライアント デバイスによって受信および処理されるまでにかかる時間です。 時間ベースのアクションに対して、ゲームはこの平均をアクションが発生した時点の推定値として使用できます。ただし、ネットワーク レイテンシーはフレーム単位でも変動する可能性があるため、この方法は不正確です。加えて、ストリームで追加されたレイテンシーの測定値には、ゲームがシミュレーションやレンダリングを実行するのにかかる時間などの、ストリーミング以外の部分は含まれていません。入力を伴うフレーム トークン
XGameStreamingGetAssociatedFrame API は、ユーザーがボタンを押した (または他のあらゆる入力を変更した) ときに見ていたゲーム状態に関する正確な情報を提供することで、この問題を解決するのに役立ちます。 フレームが開始されると、Microsoft Game Development Kit (GDK) を使用するゲームはID3D12Device::WaitFrameEventX を呼び出し、D3D12XBOX_FRAME_PIPELINE_TOKEN を受け取ります。D3D12XBOX_FRAME_PIPELINE_TOKEN は、ハッシュ マップなど任意のデータ構造で、現在の状態を後で参照するためのキーとして使用できます。フレームが完了すると、ゲームはトークンとともに PresentX を呼び出します。
PresentX は、そのトークンが対応するビデオ フレームと一緒にゲーム ストリーミング クライアントに自動的に送信されるようにします。
サーバーに送信される入力には、クライアント上で現在表示されているフレームのトークンが付随します。ゲームが IGameInputReading を受け取ると、それを XGameStreamingGetAssociatedFrame API に渡してトークンを取得できます。それを使用して、以前の状態を検索し、その保存された状態に基づいて入力を処理できます。
入力が変化していない場合 (ユーザーがコントローラーに触れていない、または単にボタンを押し続けている場合)、新しいトークンはありません。
入力を伴わないフレーム トークン
場合によっては、入力が変わっていなくても、ユーザーが最も最近見たものを知る必要があります。図 1 の例に戻ると、キャラクターがコンベア ベルトの端に達したとき、彼らは落下します。ゲームのチャレンジと公平性の一部は、そうした時間枠内で反応することです。 理想的には、ストリーミング ユーザーには非ストリーミング ユーザーとまったく同じ反応時間があります。レイテンシーがあるため、時間枠の終了時刻をずらして、時間枠の終わりに受信した入力が受け入れられるようにする必要があります。 そうするために、ゲームはボタンが押されなかったフレームのレイテンシー トークンを使用できます。アクションのない入力読み取りが時間枠の終了状態と一致した場合、ユーザーは反応に失敗したことになるため、ゲームは公平にペナルティを課すことができます。 XGameStreamingGetLastFrameDisplayed API は、ストリーミング クライアントが最も最近表示したフレームのD3D12XBOX_FRAME_PIPELINE_TOKEN を返します。常に更新されるため、いつでも呼び出して、ユーザーがアニメーションの終わりを見たかどうかを確認できます。
XGameStreamingGetLastFrameDisplayed は XGameStreamingGetAssociatedFrame と同じ方法で使用することが可能です。入力を処理するときは、その入力が発生したときに画面上にあったトークンを返す XGameStreamingGetAssociatedFrame を使用することをお勧めします。より時間が経過している場合、XGameStreamingGetLastFrameDisplayed はより新しいフレームからのトークンを返す可能性があります。