> ## Documentation Index
> Fetch the complete documentation index at: https://devdocs.xbox.com/llms.txt
> Use this file to discover all available pages before exploring further.

# ゲーム ストリーミング レイテンシー補正の詳細

> ゲーム ストリーミング レイテンシー補正の詳細

<Info>**一部非推奨。** この記事で説明されているフレーム関連付け技術は、`XGameStreamingGetAssociatedFrame` および `XGameStreamingGetLastFrameDisplayed` に依存していますが、これらは **2604 GDK リリース時点で非推奨** となっており、今後のリリースで削除されます。一般的なレイテンシー測定 API である `XGameStreamingGetStreamAddedLatency` は引き続き利用可能です。フレーム関連付けに依存しないレイテンシー対応技術については、[ゲーム ストリーミング レイテンシーの測定](/build/core-features/common/game-streaming/game-streaming-latency-measurement) を参照してください。</Info>

このトピックを使用して、XBOX Game Streaming を使用してタイトルをプレイする際のレイテンシー補正を判定します。

ビデオ ゲームには、高速なアクションに対する時間に敏感な入力処理がある場合があります。図 1 に示すように、ユーザーのキャラクターが崖に通じる動くコンベア ベルトに乗っているプラットフォーマー ゲームを想像してください。

ユーザーは正しいタイミングでジャンプする必要があります。早すぎると次のプラットフォームに届かず、遅すぎるとジャンプする前に落ちてしまいます。ゲーム ストリーミングのネットワーク レイテンシーによって、ユーザーが自分のキャラクターがジャンプに適した位置にいると見た時点で、XBOX サービスの視点ではすでに端から落ちている可能性があります。

ゲームが最終的にネットワーク経由でボタン プレスを受け取ったとき、ユーザーが自分の視点では正しいビデオ フレームでボタンを押したとしても、落下として記録される場合があります。

**図 1. コンベア ベルト上のキャラクターがいるプラットフォーマーの例を示します。**

<img src="https://mintcdn.com/microsoft-4404708b/UZTRJSf0emX1fheE/images/gdk/features/common/game-streaming-platformer-diagram.png?fit=max&auto=format&n=UZTRJSf0emX1fheE&q=85&s=d507fe0c9617a01e1c026279eacf25a8" alt="Screenshot of a platformer with a character on a conveyor belt" width="451" height="133" data-path="images/gdk/features/common/game-streaming-platformer-diagram.png" />

## レイテンシー補正

図 1 のような例のレイテンシーを補正するために、ゲームはこれまでの状態を記録しておきます。

ユーザーがジャンプ ボタンを押すと、ゲームはその時点をゲーム内で検索して、ユーザーが自分の視点から正しいタイミングでボタンを押したかどうかを判断します。

正しいレイテンシー補正の鍵は、どのくらい過去まで検索するかを知ることです。XBOX Game Streaming API は、そのためのいくつかのオプションを可能にします。

## 平均レイテンシー

一部のシナリオでは、最もシンプルですが最も精度の低い手法は、平均レイテンシーを使用することです。

[XGameStreamingGetStreamAddedLatency](/reference/system/xgamestreaming/functions/xgamestreaminggetstreamaddedlatency) API は、ストリーミングによって追加されたレイテンシーの最近の平均を返します。この平均は入力レイテンシーと出力レイテンシーに分割されます。

入力レイテンシーは、ユーザー入力がサーバーによって受信されるまでにかかる時間で、出力レイテンシーは、ゲームがレンダリングしたビデオ フレームがクライアント デバイスによって受信および処理されるまでにかかる時間です。

時間ベースのアクションに対して、ゲームはこの平均をアクションが発生した時点の推定値として使用できます。ただし、ネットワーク レイテンシーはフレーム単位でも変動する可能性があるため、この方法は不正確です。加えて、ストリームで追加されたレイテンシーの測定値には、ゲームがシミュレーションやレンダリングを実行するのにかかる時間などの、ストリーミング以外の部分は含まれていません。

## 入力を伴うフレーム トークン

[XGameStreamingGetAssociatedFrame](/reference/system/xgamestreaming/functions/xgamestreaminggetassociatedframe) API は、ユーザーがボタンを押した (または他のあらゆる入力を変更した) ときに見ていたゲーム状態に関する正確な情報を提供することで、この問題を解決するのに役立ちます。

フレームが開始されると、Microsoft Game Development Kit (GDK) を使用するゲームは `ID3D12Device::WaitFrameEventX` を呼び出し、`D3D12XBOX_FRAME_PIPELINE_TOKEN` を受け取ります。`D3D12XBOX_FRAME_PIPELINE_TOKEN` は、ハッシュ マップなど任意のデータ構造で、現在の状態を後で参照するためのキーとして使用できます。フレームが完了すると、ゲームはトークンとともに `PresentX` を呼び出します。

`PresentX` は、そのトークンが対応するビデオ フレームと一緒にゲーム ストリーミング クライアントに自動的に送信されるようにします。

サーバーに送信される入力には、クライアント上で現在表示されているフレームのトークンが付随します。ゲームが `IGameInputReading` を受け取ると、それを `XGameStreamingGetAssociatedFrame` API に渡してトークンを取得できます。それを使用して、以前の状態を検索し、その保存された状態に基づいて入力を処理できます。

<Note>入力が変化していない場合 (ユーザーがコントローラーに触れていない、または単にボタンを押し続けている場合)、新しいトークンはありません。</Note>

## 入力を伴わないフレーム トークン

場合によっては、入力が変わっていなくても、ユーザーが最も最近見たものを知る必要があります。図 1 の例に戻ると、キャラクターがコンベア ベルトの端に達したとき、彼らは落下します。ゲームのチャレンジと公平性の一部は、そうした時間枠内で反応することです。

理想的には、ストリーミング ユーザーには非ストリーミング ユーザーとまったく同じ反応時間があります。レイテンシーがあるため、時間枠の終了時刻をずらして、時間枠の終わりに受信した入力が受け入れられるようにする必要があります。

そうするために、ゲームはボタンが押されなかったフレームのレイテンシー トークンを使用できます。アクションのない入力読み取りが時間枠の終了状態と一致した場合、ユーザーは反応に失敗したことになるため、ゲームは公平にペナルティを課すことができます。

[XGameStreamingGetLastFrameDisplayed](/reference/system/xgamestreaming/functions/xgamestreaminggetlastframedisplayed) API は、ストリーミング クライアントが最も最近表示したフレームの `D3D12XBOX_FRAME_PIPELINE_TOKEN` を返します。常に更新されるため、いつでも呼び出して、ユーザーがアニメーションの終わりを見たかどうかを確認できます。

<Note>`XGameStreamingGetLastFrameDisplayed` は `XGameStreamingGetAssociatedFrame` と同じ方法で使用することが可能です。入力を処理するときは、その入力が発生したときに画面上にあったトークンを返す `XGameStreamingGetAssociatedFrame` を使用することをお勧めします。より時間が経過している場合、`XGameStreamingGetLastFrameDisplayed` はより新しいフレームからのトークンを返す可能性があります。</Note>

## より多くのシナリオ

前のセクションの 3 つの API を使用して、さまざまなシナリオでレイテンシーを補正できます。以下のセクションでは、一般的なマルチユーザー レイテンシー補正技術に基づくその他の例を提供します。

### 移動

キャラクター、カメラ、または照準の移動は、2 つのカテゴリに分類されます。

#### 個別の結果を伴う移動

ユーザーが衝突に移動したり、照準を合わせて発射したりすると、ゲームはその動きがどのような結果になったかについてユーザーが観察可能な判断を下す必要があります。

これらの場合、二者択一的な判断は、通常、その判断が必要とされたフレームと関連付けられた入力をゲームが受け取るまで遅延されます。衝突や崖から落ちるようなことでは、ゲームは待機中に何かをアニメーション化する必要があるかもしれません。

たとえば、ゲームが実際の入力を受け取るまでの間、ユーザーがオブジェクトにめり込む、または崖の上を浮遊または跳躍する可能性があります。

#### 一般的な移動

一般的な移動は、ナビゲーションや照準を指しますが、特定のフレームで何が起こったかよりも累積した移動が重要なドライビングなどのケースにおいて重要となる可能性があります。

##### 入力予測

ゲームは、ユーザーが入力を提供したフレームを見てから経過した時間に基づいて、入力の履歴を使用して前方に予測できます。たとえば、サムスティックの座標が 0.5 で、レイテンシー トークンが 3 フレーム古い時点でフレームあたり平均 0.1 進んでいた場合、ゲームは 0.8 にあるかのように扱うことができます。

もちろん、これはユーザーが速度と方向を変えた場合に誤予測につながる可能性があります。ユーザーの実際の入力を取り込むために、ゲームは以前に予測された状態のバッファーを保持できます。その状態の実際の入力が現れると、ゲームは実際の入力を使用してその状態からシミュレーションを再実行し、表示状態を修正できます。

上記のように、ゲームは実際の入力が判明するまで、いかなる結果もトリガーせずに待機する必要があります。より高いレイテンシーの接続では、これは目に見える「ポップ」につながる可能性があるため、ゲームは誤予測を隠すための平滑化やその他の手段を提供することを望むかもしれません。

この戦略により、レンダリングされたフレームがクライアントに届くまでにより多くの時間がかかります。ゲームは、ユーザーの視点をサーバーのシミュレーションと同期させるために、平均出力レイテンシーの分だけさらに前方に予測することを望むかもしれません。これは、サーバーのシミュレーションの速度が外部のマルチユーザー サーバーによって制御される可能性があるマルチユーザー ゲームで、より重要になる可能性があります。

##### ゲーム固有の予測

入力履歴を予測するのではなく、ゲームはユーザーが何をするかについてより良い推測を持つかもしれません。これは、2D プラットフォーマーのキャラクターが右に移動するといった単純なヒューリスティックから、ユーザー履歴に基づく機械学習まで多岐にわたる可能性があります。入力予測と同様に、ゲームは予測のバッファーを保持し、実際の入力が入ってくるとシミュレーションを再実行できます。

### タッチ トレース

ネイティブ タッチを使用するゲームは、ユーザーの指の下にカーソルまたはレチクルを配置するかもしれません。レイテンシーが高いと、ユーザーはカーソルが動く指の後を追うことに気付きます。このトピックの「一般的な移動」セクションで述べたように、ゲームは動くタッチ入力の方向と速度を予測して、カーソルを動く指の下におおむね保つことができます。

### マルチユーザー

XBOX Game Streaming 上で動作するマルチユーザー ゲームの利点は、ユーザーの XBOX サーバーが同じ Azure データセンター内にある可能性が高いことです。ゲームのマルチユーザー サーバーもその Azure リージョンにある場合、XBOX コンソールとマルチユーザー サーバー間のレイテンシーは 1 ミリ秒未満となります。しかし、ユーザーのクライアント デバイスはもっと離れた場所にあります。

マルチユーザー ゲームは通常、ゲーム対マルチユーザー サーバーのレイテンシーを処理する戦略を持っています。多くの場合、これらにはマルチユーザー サーバーからのタイムスタンプまたはフレーム カウンターが含まれます。

それらのタイムスタンプとカウンターをフレーム トークンと関連付けることで、マルチユーザー ゲームはレイテンシー計算にストリームを含めることができます。これにより、マルチユーザー ゲームがストリーミング ユーザーにも正しく感じられるようになると共に、ストリーミング ユーザーと非ストリーミング ユーザーの間で公平性を保てるようになります。

## リファレンス API ドキュメント

* [XGameStreaming (API contents)](/reference/system/xgamestreaming/xgamestreaming_members)
  * 関数
    * [XGameStreamingGetStreamAddedLatency](/reference/system/xgamestreaming/functions/xgamestreaminggetstreamaddedlatency)
    * [XGameStreamingGetAssociatedFrame](/reference/system/xgamestreaming/functions/xgamestreaminggetassociatedframe)
    * [XGameStreamingGetLastFrameDisplayed](/reference/system/xgamestreaming/functions/xgamestreaminggetlastframedisplayed)

## 関連項目

[ゲーム ストリーミング レイテンシー補正の概要](/build/core-features/common/game-streaming/game-streaming-latency-compensation-overview)
[ゲーム ストリーミング レイテンシーの測定](/build/core-features/common/game-streaming/game-streaming-latency-measurement)
[ゲームのテスト中にレイテンシーをシミュレートする](/build/core-features/common/game-streaming/game-streaming-simulate-latency-while-testing)
[XGameStreaming (API contents)](/reference/system/xgamestreaming/xgamestreaming_members#Latency)


## Related topics

- [ゲーム ストリーミング レイテンシーの測定](/ja-jp/build/core-features/common/game-streaming/game-streaming-latency-measurement.md)
- [ゲーム ストリーミング レイテンシー補正の概要](/ja-jp/build/core-features/common/game-streaming/game-streaming-latency-compensation-overview.md)
- [XGameStreaming](/ja-jp/reference/system/xgamestreaming/xgamestreaming_members.md)
- [XBOX Game Streaming 向けにゲームを最適化する](/ja-jp/build/core-features/common/game-streaming/game-streaming-optimizing-your-game.md)
- [ゲームをストリーミングする](/ja-jp/build/core-features/common/game-streaming/game-streaming-stream-your-game.md)
