1. 程式人生 > 其它 >《網路多人遊戲架構與程式設計》之延遲、抖動、可靠、可擴充套件性

《網路多人遊戲架構與程式設計》之延遲、抖動、可靠、可擴充套件性

///////////////////  延 遲  /////////////////////// 虛擬現實遊戲:<=20ms 格鬥、射擊遊戲:16~150ms RTS遊戲:<=500ms   非網路延遲:
  • 輸入取樣延遲:比如在每一幀開始時檢測輸入,如果在2ms按下操作,到下一幀才被檢測到。可以在幀結束時再次取樣。
  • 渲染流水線延遲:CPU傳送渲染命令後,先插入到緩衝區,GPU在將來某個時刻執行。如果有許多渲染任務,GPU渲染影象可能滯後CPU一幀。
  • 多執行緒渲染流水線延遲:理由同上。
  • 垂直同步:顯示器在螢幕上更新影象是從上至下逐行更新,如果在繪製過程中變了,就會有撕裂效果。
  • 顯示延遲:顯示器在真正顯示影象之前會做一些處理,比如去隔行、降噪、自適應亮度、影象過濾等等。
  • 畫素響應時間:畫素亮度的改變需要時間。老一點的顯示器會比較明顯。
  網路延遲:
  • 處理延遲:檢查源地址和確定合適路由的時間。還包括NAT、加密時間。
  • 傳輸延遲:向物理介質寫位元流所花費的時間。
  • 排隊延遲:接收佇列和傳輸佇列的等待時間。//路由器僅檢查資料包頭部,所以傳送少量大資料包代替大量小資料包可以減少排隊延遲
  • 傳播延遲:在傳播中花費的時間。//在對等網遊中,匹配玩家時優先優化幾何位置;在C/S遊戲中,要保證遊戲伺服器離客戶端近
   ///////////////////  抖 動  ///////////////////////   定義:RTT一般圍繞著一個基於平均延遲的特定值變化。這些延遲隨著時間的推移會變化,導致RTT與期望值有偏差。這個偏差稱為抖動。   缺點:抖動會影響RTT抑制演算法,會導致資料包亂序到達。  解決:使用TCP來保證資料包按序到達;實現自定義的系統進行包重組。     ///////////////////  改進的延遲處理 ///////////////////////
  保守演算法:客戶端作為沉默的終端,只管傳送輸入、接收結果、顯示給使用者,以伺服器發出的狀態為準,以延遲為代價,但至少是絕對正確的。 插值週期:客戶端從舊狀態插值到新狀態需要的時間。 客戶端插值:客戶端收到一個新狀態,使用本地感知過濾器根據時間平滑的插值到這個狀態。 客戶端預測
  • 通過推測演算法,顯示給玩家近似的最新狀態。
  • 為了推測當前狀態,客戶端必須能執行與伺服器相同的程式碼。
  • 為了保持近似,客戶端每幀執行模擬,並顯示給玩家。
  • 為了執行推測,客戶端首先要能粗略估計RTT,最簡單的辦法是伺服器給資料包打上時間戳。
———————————————————————— 怎樣估計RTT:客戶端給伺服器傳送一個基於客戶端本地時間的時間戳資料包;伺服器複製該時間戳到新的資料包併發送回客戶端;客戶端收到新資料包,從當前時間-舊時間戳,就得到了RTT。   航位推測法
:不保守的演算法,又叫樂觀演算法。基於實體繼續做當前正在做的事情的這一假設,進行實體行為預測的過程。   本地模擬錯誤彌補:
  • 即時狀態更新:立即更新到最新狀態。航位推測+最新狀態來模擬額外的1/2RTT。
  • 插值:三次樣條插值建立路徑。
  • 二階狀態調整:如加速度。
  ///////////////////  資料包丟失  ///////////////////////   原因:
  • 不可靠的物理介質
  • 不可靠的鏈路層
  • 不可靠的網路層
解決:較少的路由器;較少的電纜;儘可能少的資料包。   ///////////////////  可靠性 ///////////////////////   TCP:優點:穩定的、可靠的、魯棒的、有序的、擁塞控制;            缺點:
    • 低優先順序資料的丟失,干擾高優先順序資料的接收;
    • 兩個單獨可靠有序的資料流互相干擾;
    • 過時遊戲狀態的重傳;
  也可以通過自定義UDP伺服器,增加傳輸檢驗模組,來達到可靠性。
  1. 傳輸時,唯一標識資料包;
  2. 接收時,檢查傳入資料包,併發送一個確認;
  3. 傳送端處理傳入的確認,並通知依賴模組哪個資料包被接收了哪個被丟棄了。

///////////////////  可擴充套件性 ///////////////////////

可見性裁剪:在渲染過程中儘可能早的剪掉不可見的物件。 靜態區域:只有和玩家在同一個靜態區域的物件才被認為是相關的。比如同一個地圖的物件是相關的。 視錐和基於距離的系統:距離內或視錐內的物件被認為是相關的。 道路能見距離:如果伺服器知道玩家的位置,那麼也可以預判玩家能看見的範圍。 可見集PVS:世界可以被劃分為凸多邊形的集合,玩家位於的凸多邊形集合作為潛在可見的物件集。 層次裁剪技術:適用於樹狀資料結構劃分的世界中的物件,方法有:二叉樹、四叉樹、八叉樹... 伺服器分割槽
  1. 有一個主程序決定什麼時候在哪臺機器上建立伺服器程序。
  2. 遊戲結束時,伺服器程序在退出前寫任何永久性資料。
  3. 當玩家決定開始一個新的比賽,主程序可以確定最小負載的機器是哪臺,並在這臺機器上建立新的伺服器程序。
例項化:一個特定區域玩家數量達到上限,再分出來第二個例項。