部分已淘汰。 本文所述的畫面關聯技術依賴
XGameStreamingGetAssociatedFrame 和 XGameStreamingGetLastFrameDisplayed,這些 API 自 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。由於它會持續更新,您可以隨時呼叫它,查看使用者是否已看到動畫的結尾。
您可以用與
XGameStreamingGetAssociatedFrame 相同的方式使用 XGameStreamingGetLastFrameDisplayed。我們建議您在處理輸入時使用 XGameStreamingGetAssociatedFrame,因為它會傳回該輸入發生時畫面上的權杖。如果經過了更多時間,XGameStreamingGetLastFrameDisplayed 可能會傳回較新畫面的權杖。