> ## 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`，這些 API **自 2604 GDK 版本起已淘汰**，並將在未來的版本中移除。一般延遲測量 API `XGameStreamingGetStreamAddedLatency` 仍可使用。如需不依賴畫面關聯的延遲感知技術，請參閱[遊戲串流延遲測量](/zh-TW/build/core-features/common/game-streaming/game-streaming-latency-measurement)。</Info>

使用本主題來判斷透過 XBOX Game Streaming 遊玩您的遊戲時的延遲補償。

電子遊戲可能對快速動作有時間敏感的輸入處理。想像一款平台遊戲，使用者的角色站在一條通往懸崖的移動輸送帶上，如圖 1 所示。

使用者必須在正確的時機跳躍：太早會錯過下一個平台，太晚則會在跳躍前掉落。遊戲串流中的網路延遲意味著，當使用者看到角色到達正確的跳躍位置時，從 XBOX services 的角度來看，角色可能已經從邊緣掉落了。

當遊戲最終透過網路收到按鈕按下時，即使使用者從自己的角度是在正確的視訊畫面上按下按鈕，遊戲仍可能記錄為掉落。

**圖 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="角色位於輸送帶上的平台遊戲螢幕擷取畫面" width="451" height="133" data-path="images/gdk/features/common/game-streaming-platformer-diagram.png" />

## 延遲補償

為了補償如圖 1 所示範例中的延遲，遊戲會保留其先前狀態的記錄。

當使用者按下跳躍按鈕時，遊戲會搜尋遊戲中的該時間點，以判斷從使用者的角度來看，是否在正確的時機按下按鈕。

正確延遲補償的關鍵在於知道要往回搜尋多久。XBOX Game Streaming API 為此提供了數種選項。

## 平均延遲

在某些情況下，最簡單但最不精確的方法是使用平均延遲。

[XGameStreamingGetStreamAddedLatency](/zh-TW/reference/system/xgamestreaming/functions/xgamestreaminggetstreamaddedlatency) API 會傳回串流所增加之延遲的近期平均值。該平均值分為輸入延遲和輸出延遲。

輸入延遲是伺服器接收使用者輸入所需的時間，而輸出延遲是遊戲轉譯的視訊畫面被用戶端裝置接收並處理所需的時間。

對於以時間為基礎的動作，遊戲可以使用此平均值來估計動作發生的時間。不過，網路延遲可能會有所變化，甚至每個畫面都不同，因此這種方法並不精確。此外，串流增加的延遲測量並不包含非串流部分的延遲，例如遊戲執行模擬和轉譯所花費的時間。

## 包含輸入的畫面權杖

[XGameStreamingGetAssociatedFrame](/zh-TW/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](/zh-TW/reference/system/xgamestreaming/functions/xgamestreaminggetlastframedisplayed) API 會傳回串流用戶端最近顯示之畫面的 `D3D12XBOX_FRAME_PIPELINE_TOKEN`。由於它會持續更新，您可以隨時呼叫它，查看使用者是否已看到動畫的結尾。

<Note>您可以用與 `XGameStreamingGetAssociatedFrame` 相同的方式使用 `XGameStreamingGetLastFrameDisplayed`。我們建議您在處理輸入時使用 `XGameStreamingGetAssociatedFrame`，因為它會傳回該輸入發生時畫面上的權杖。如果經過了更多時間，`XGameStreamingGetLastFrameDisplayed` 可能會傳回較新畫面的權杖。</Note>

## 更多案例

使用上一節中的三個 API，可以在各種案例中補償延遲。下列各節提供更多以常見多使用者延遲補償技術為基礎的範例。

### 移動

移動角色、攝影機或瞄準可分為兩種類別。

#### 具有離散結果的移動

當使用者移動而發生碰撞，或瞄準並開火時，遊戲必須對移動的結果做出使用者可觀察到的決定。

在這些情況下，通常會延遲二元決定，直到遊戲收到與需要做出決定之畫面相關聯的輸入為止。對於碰撞或從懸崖掉落之類的情況，遊戲可能需要在等待期間播放某些動畫。

例如，在遊戲接收實際輸入所需的時間內，使用者可能會穿入物件，或在懸崖上方漂浮或跳過懸崖。

#### 一般移動

一般移動是指任何導覽或瞄準，但在駕駛等情況下可能很重要，因為累積的移動比特定畫面上發生的事情更重要。

##### 輸入投射

遊戲可以使用輸入的歷程記錄，根據使用者看到其提供輸入的畫面後經過了多少時間，將輸入往前投射。例如，如果搖桿的座標位於 0.5，且在延遲權杖已經過 3 個畫面時，平均每個畫面前進 0.1，遊戲就可以將其視為位於 0.8。

當然，如果使用者改變速度和方向，這可能會導致預測錯誤。為了納入使用者的實際輸入，遊戲可以保留先前預測狀態的緩衝區。當該狀態的實際輸入出現時，遊戲可以使用實際輸入從該狀態重新執行模擬，並修正可見的狀態。

如上所述，遊戲應等到得知實際輸入後，才觸發任何結果。在延遲較高的連線上，這可能會導致可見的「跳動」，遊戲可能需要提供平滑處理或其他方式來掩飾預測錯誤。

使用此策略時，轉譯的畫面需要更多時間才能到達用戶端。遊戲可能需要再依平均輸出延遲進一步投射，讓使用者的檢視與伺服器的模擬同步。這在多使用者遊戲中更可能有影響，因為伺服器模擬的速度可能由外部多使用者伺服器控制。

##### 遊戲特定的預測

與其投射輸入歷程記錄，遊戲可能更能猜測使用者會做什麼。這可以從簡單的啟發學習法 (例如 2D 平台遊戲角色向右移動)，到根據使用者歷程記錄的機器學習。與輸入投射一樣，遊戲可以保留預測的緩衝區，並在實際輸入傳入時重新執行模擬。

### 觸控追蹤

使用原生觸控的遊戲可能會在使用者的手指下方放置游標或準星。在延遲較高時，使用者會注意到游標落後於移動中的手指。如本主題的「一般移動」一節所述，遊戲可以預測移動中觸控輸入的方向和速度，讓游標大致保持在移動中的手指下方。

### 多使用者

在 XBOX Game Streaming 上執行之多使用者遊戲的優點是，使用者的 XBOX 伺服器很可能位於相同的 Azure 資料中心。如果遊戲的多使用者伺服器也位於該 Azure 區域，XBOX 主機與多使用者伺服器之間的延遲會低於一毫秒。不過，使用者的用戶端裝置距離較遠。

多使用者遊戲通常具有處理遊戲與多使用者伺服器之間延遲的策略。這些策略通常涉及來自多使用者伺服器的時間戳記或畫面計數器。

藉由將這些時間戳記和計數器與畫面權杖產生關聯，多使用者遊戲就可以將串流納入其延遲計算中。這有助於讓多使用者遊戲對串流使用者而言感覺正確，同時讓串流與非串流使用者處於公平的競爭環境。

## 參考 API 文件

* [XGameStreaming (API 內容)](/zh-TW/reference/system/xgamestreaming/xgamestreaming_members)
  * 函式
    * [XGameStreamingGetStreamAddedLatency](/zh-TW/reference/system/xgamestreaming/functions/xgamestreaminggetstreamaddedlatency)
    * [XGameStreamingGetAssociatedFrame](/zh-TW/reference/system/xgamestreaming/functions/xgamestreaminggetassociatedframe)
    * [XGameStreamingGetLastFrameDisplayed](/zh-TW/reference/system/xgamestreaming/functions/xgamestreaminggetlastframedisplayed)

## 另請參閱

[遊戲串流延遲補償概觀](/zh-TW/build/core-features/common/game-streaming/game-streaming-latency-compensation-overview)
[遊戲串流延遲測量](/zh-TW/build/core-features/common/game-streaming/game-streaming-latency-measurement)
[在測試遊戲時模擬延遲](/zh-TW/build/core-features/common/game-streaming/game-streaming-simulate-latency-while-testing)
[XGameStreaming (API 內容)](/zh-TW/reference/system/xgamestreaming/xgamestreaming_members#Latency)


## Related topics

- [游戏串流延迟补偿深入探讨](/zh-CN/build/core-features/common/game-streaming/game-streaming-latency-compensation-deep-dive.md)
- [游戏串流延迟测量](/zh-CN/build/core-features/common/game-streaming/game-streaming-latency-measurement.md)
- [游戏串流延迟补偿概述](/zh-CN/build/core-features/common/game-streaming/game-streaming-latency-compensation-overview.md)
- [存取 GDK 資源與下載](/zh-TW/home/onboarding-access/access-resources.md)
- [XBOX 主機遊戲的認證測試 XBOX 需求](/zh-TW/publishing/certification/console-cert-tested-requirements.md)
