ゲームストリーミング待機時間補正の詳細
このトピックでは、Xbox ゲーム ストリーミング で再生した場合のタイトルの待機時間の補正の決定について説明します。
通常、ビデオ ゲームでは、高速アクションに対応する非常に時間に敏感な入力処理が生じます。 図1に示すように、ユーザーのキャラクターが崖につながるベルトコンベアの上にいるプラットフォーマーを想像してみてください。
プレーヤーは適切なタイミングでジャンプしなりませんが、早すぎると、次のプラットフォームを見落とし、ジャンプの前に落下します。 ゲームがストリーミングされている場合のネットワークの遅延は、プレーヤー側でキャラクターがジャンプするのに適した場所に見えたときには、Xbox サービス側では、キャラクターがすでに端から落ちている可能性があることを意味します。
ゲームは最終的にネットワークからジャンプ ボタンが押されたことを受信すると、ユーザーの視点で右のビデオフレームのボタンを押したとしても、落下を記録してしまうことがあります。
図 1. ベルトコンベアーにキャラクターが乗ったプラットフォーマー例
待機時間の補正
図 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
はより最近のフレームのトークンを返すかもしれません。
その他のシナリオ
上記の 3 つの API を使用することで、様々なシナリオで待機時間を補正することが可能になります。 以下のセクションでは、一般的なマルチユーザーの待機時間の補正手法に基づく、その他の例を示します。
移動
キャラクター、カメラ、または照準の移動は、2 つのカテゴリーに分類できます。
個々のシーケンスに伴う移動
衝突の中を移動したり狙い撃ちの動きをする場合、動きがどのような結果になったかをプレイヤーが観察して判断しなければなりません。
このような場合、決定が必要とされたフレームと相関のある入力をゲームが受け取るまで、通常はバイナリの決定が遅れます。 衝突やがけから落ちるものについては、ゲームでは待機中に合理的な何かをアニメーション表示しなければならないことがあります。
例えば、ゲームが実際の入力を受け取るまでの時間の間に、ユーザーがオブジェクトにクリップしたり、浮かんだり、崖を飛び越えたりすることがあります。
大まかな移動
これは一般的なナビゲーションや照準にも当てはまりますが、ドライブのように、与えられたフレーム上で何が起こるかよりも、蓄積された動きが重要になるケースでは重要になります。
入力投影
ゲームは、入力の履歴を使用して、ユーザーが入力を提供したフレームを見てから経過した時間に基づいて、入力を前方に投影することができます。 例えば、サムスティックの X 座標が 0.5 にあり、1 フレームあたり平均 0.1 で進行して、待機時間トークンが 3 フレーム古い場合、ゲームはそれを 0.8 にあるかのように扱うことができます。
もちろん、ユーザーがスピードや方向を変えることで、予測ミスにつながることもあります。 ユーザーの実際の入力を反映するために、ゲームは以前に予測された状態のバッファーを保持できます。 その状態の実際の入力が表示された場合、ゲームは実際の入力を使用して、その状態からシミュレーションを再実行し、表示状態を修正できます。
上記で説明したように、ゲームは実際の入力が認識されるまで、どのような結果もトリガーするために待機します。 遅延接続が長くなると、「ポップ」 が表示される可能性があり、ゲームでは、スムージングなど、ミス予測のカバーを提供する必要があります。
この方法で考慮すべき点は、レンダリングされたフレームがクライアントに達するまでに時間がかかることです。 ゲームでは、プレーヤーの視界をサーバーのシミュレーションに同期させるために、平均出力待機時間でさらに前方に投影したい場合があります。 これは、サーバーのシミュレーション速度が外部のマルチユーザー サーバーによって制御されるマルチユーザー ゲームでは、より重要となる可能性があります。
ゲーム固有の予測
入力履歴を投影するのではなく、ゲームではプレーヤーの行動を推測しやすくなります。 これは、2番目のプラットフォーマーのキャラクターの右への動きのような単純なヒューリスティックから、ユーザーの履歴に基づく機械学習まで、多岐にわたる可能性があります。 入力予測と同様に、ゲームは予測のバッファを保持し、実際の入力が入ってくるとそのシミュレーションを再実行することができます。
タッチ トレーシング
ネイティブ タッチを使用したゲームでは、ユーザーの指の下にカーソルや十字線を配置することができます。 待機時間が長くなると、ユーザーは動いてる指の後をカーソル移動するのに気づくことになります。 このトピックの一般的な動きのセクションで述べたように、ゲームは、カーソルを一般的に移動する指の下に維持するために、移動するタッチ入力の方向と速度を予測するかもしれません。
マルチユーザー
Xbox ゲーム ストリーミング上で動作するマルチプレイヤー ゲームの利点は、ユーザーの Xbox サーバーが同じ Azure データセンターにある可能性が高いことです。 また、ゲームのマルチユーザー サーバーもその Azure リージョンにある場合、Xbox とマルチユーザー サーバー間の待機時間は 1 ミリ秒を下回る可能性があります。 ただし、ユーザーのクライアント デバイスは、さらに離れた場所にあります。
マルチユーザー ゲームでは、通常、ゲーム対マルチユーザーのサーバーの待機時間を処理するための手段が用意されています。 多くの場合、マルチユーザー サーバーからのタイムスタンプやフレーム カウンターが必要になります。
これらのタイムスタンプとカウンターをフレーム トークンに関連付けることで、マルチユーザー ゲームでは、待機時間の計算にストリームを含めることができます。 これにより、マルチユーザー ゲームでは、ユーザーをストリーミングするだけでなく、ストリーミング ユーザーと非ストリーミング ユーザーとの間でフィールドを平準化できます。
関連項目
ゲーム ストリーミング待機時間補正の概要
ゲーム ストリーミング待機時間の測定
ゲームのテスト中に待機時間をシミュレーションする
XGameStreaming (API コンテンツ)