《網路多人遊戲架構與程式設計》之延遲、抖動、可靠、可擴充套件性
阿新 • • 發佈:2022-05-27
/////////////////// 延 遲 ///////////////////////
虛擬現實遊戲:<=20ms
格鬥、射擊遊戲:16~150ms
RTS遊戲:<=500ms
非網路延遲:
保守演算法:客戶端作為沉默的終端,只管傳送輸入、接收結果、顯示給使用者,以伺服器發出的狀態為準,以延遲為代價,但至少是絕對正確的。
插值週期:客戶端從舊狀態插值到新狀態需要的時間。
客戶端插值:客戶端收到一個新狀態,使用本地感知過濾器根據時間平滑的插值到這個狀態。
客戶端預測:
:不保守的演算法,又叫樂觀演算法。基於實體繼續做當前正在做的事情的這一假設,進行實體行為預測的過程。
本地模擬錯誤彌補:
- 輸入取樣延遲:比如在每一幀開始時檢測輸入,如果在2ms按下操作,到下一幀才被檢測到。可以在幀結束時再次取樣。
- 渲染流水線延遲:CPU傳送渲染命令後,先插入到緩衝區,GPU在將來某個時刻執行。如果有許多渲染任務,GPU渲染影象可能滯後CPU一幀。
- 多執行緒渲染流水線延遲:理由同上。
- 垂直同步:顯示器在螢幕上更新影象是從上至下逐行更新,如果在繪製過程中變了,就會有撕裂效果。
- 顯示延遲:顯示器在真正顯示影象之前會做一些處理,比如去隔行、降噪、自適應亮度、影象過濾等等。
- 畫素響應時間:畫素亮度的改變需要時間。老一點的顯示器會比較明顯。
- 處理延遲:檢查源地址和確定合適路由的時間。還包括NAT、加密時間。
- 傳輸延遲:向物理介質寫位元流所花費的時間。
- 排隊延遲:接收佇列和傳輸佇列的等待時間。//路由器僅檢查資料包頭部,所以傳送少量大資料包代替大量小資料包可以減少排隊延遲
- 傳播延遲:在傳播中花費的時間。//在對等網遊中,匹配玩家時優先優化幾何位置;在C/S遊戲中,要保證遊戲伺服器離客戶端近
- 通過推測演算法,顯示給玩家近似的最新狀態。
- 為了推測當前狀態,客戶端必須能執行與伺服器相同的程式碼。
- 為了保持近似,客戶端每幀執行模擬,並顯示給玩家。
- 為了執行推測,客戶端首先要能粗略估計RTT,最簡單的辦法是伺服器給資料包打上時間戳。
- 即時狀態更新:立即更新到最新狀態。航位推測+最新狀態來模擬額外的1/2RTT。
- 插值:三次樣條插值建立路徑。
- 二階狀態調整:如加速度。
- 不可靠的物理介質
- 不可靠的鏈路層
- 不可靠的網路層
- 低優先順序資料的丟失,干擾高優先順序資料的接收;
- 兩個單獨可靠有序的資料流互相干擾;
- 過時遊戲狀態的重傳;
- 傳輸時,唯一標識資料包;
- 接收時,檢查傳入資料包,併發送一個確認;
- 傳送端處理傳入的確認,並通知依賴模組哪個資料包被接收了哪個被丟棄了。
/////////////////// 可擴充套件性 ///////////////////////
可見性裁剪:在渲染過程中儘可能早的剪掉不可見的物件。 靜態區域:只有和玩家在同一個靜態區域的物件才被認為是相關的。比如同一個地圖的物件是相關的。 視錐和基於距離的系統:距離內或視錐內的物件被認為是相關的。 道路能見距離:如果伺服器知道玩家的位置,那麼也可以預判玩家能看見的範圍。 可見集PVS:世界可以被劃分為凸多邊形的集合,玩家位於的凸多邊形集合作為潛在可見的物件集。 層次裁剪技術:適用於樹狀資料結構劃分的世界中的物件,方法有:二叉樹、四叉樹、八叉樹... 伺服器分割槽:- 有一個主程序決定什麼時候在哪臺機器上建立伺服器程序。
- 遊戲結束時,伺服器程序在退出前寫任何永久性資料。
- 當玩家決定開始一個新的比賽,主程序可以確定最小負載的機器是哪臺,並在這臺機器上建立新的伺服器程序。