1. 程式人生 > 其它 >《網路多人遊戲架構與程式設計》之序列化、RPC、網路拓撲

《網路多人遊戲架構與程式設計》之序列化、RPC、網路拓撲

/////////////////////////////////////       對 象 序 列 化      //////////////////////////////////////////////////   Q.什麼是序列化? 序列化 是一種將 物件 從 記憶體中 的 隨機訪問格式 轉換為 位元流格式 的 行為。這些位元流可以在硬碟上儲存,也可以通過網路傳輸,之後再恢復成原始格式。   Q.什麼是流? 流stream 是一種資料結構,封裝了一組有序的資料元素,並允許使用者對其進行讀寫。流可以是輸出流(允許順序插入但不許讀取)、輸入流(允許順序提取但不許插入),或者輸入輸出流。   Q.什麼是位元組序?不同平臺怎麼保證位元組序? 位元組序 是 位元組 在一個平臺上的 儲存順序。有小端位元組序(低位編址) 和 大端位元組序(高位編址)。可以通過位元組交換演算法或內部函式和彙編指令。   Q.怎麼壓縮資料?
  1. 去除任何不需要通過網路傳送的資料,例如稀疏的不被完全填充的資料結構。
  2. 熵編碼:比如用bool值同義表達int值。
  3. 定點:所有可能取值總數=(最大值-最小值)/精度+1  , 需要log2(所有可能取值總數)位。
  4. 幾何壓縮:四元數只傳3個分量,剩下那個可以用1-其他分量得到。

/////////////////////////////////////////////       對 象 復  制     ////////////////////////////////////////////////

  作用:支援遠端程序之間遊戲世界和物件狀態的同步。   複製:從一臺主機向另一臺主機傳輸物件狀態的行為。   複製預處理
  1. 標記資料包為包含物件狀態的資料包;
  • 建立1個列舉型別,來標識每個資料包的型別。
  • 接收方從資料包中讀取資料包型別,然後決定如何處理。
  • 習慣上,主機之間交換的第一個資料包被標記為"hello"資料包,用於建立連線、分配狀態。
  • 唯一標識複製物件;
    • 接收方根據標識,確認是否有這個傳入物件的副本。有,直接更新;沒有,例項化一個物件。
  • 指明被複制物件的型別。
  •   世界狀態增量:傳送方建立表示世界狀態變化的資料包,然後接收方在自己的世界狀態中更新這些變化。每個資料包都包含世界狀態增量。 物件狀態增量:世界狀態增量包含需要改變的每個物件的物件狀態增量(建立、更新、銷燬遊戲物件)。   區域性物件狀態的複製:列舉值可以通過按位或運算組合在一起表示多個屬性。   遠端過程呼叫 RPC:一臺主機可以在另一臺或多臺遠端主機上執行程式的動作。每個呼叫都可以被認為是 一個唯一的物件,每個引數對應一個成員變數。 遠端方法呼叫 RMI
    :主機在一個特定物件上呼叫一個方法。   ———————————————————————— 總結:
    • 應用層協議必須定義所有可能的資料包型別。
    • 每個物件需要一個唯一的識別符號。
    • 物件的類需要一個唯一的識別符號,這樣接收不存在該物件時可以建立該物件。
    • 網路程式碼不依賴遊戲類,所以使用間接對映來向網路模組註冊類和建立函式。
    • 大規模的遊戲無法將所有物件的複製裝入一個數據包,所以使用一個協議來支援世界狀態增量的傳輸。
    • 為了提高效率,更新物件動作所傳送的序列化資料可以是物件屬性的子集。
    • 除了複製物件狀態資料,有時還需要觸發遠端過程呼叫。
    /////////////////////////////////////////////      網  絡  拓  撲    ////////////////////////////////////////////////   作用:決定了參與遊戲的主機是如何組織在一起的。 目標:保證所有玩家都可以看到遊戲狀態的最新版本。   /////////////////// 客戶端-伺服器 C/S 結構 /////////////////////// 複雜度:n個客戶端,就有O(n2)個連線。   伺服器頻寬:上行頻寬(傳送):b*n/s ,n個客戶端每秒傳送b位元組資料。                     下行頻寬(接收):c*n/s,伺服器每秒傳送c位元組給n個客戶端。   客戶端頻寬:上行頻寬(傳送):b個位元組的上傳流。                     下行頻寬(接收):c個位元組的下載流。   缺點:客戶端數量增加,伺服器的頻寬要求線性增加,客戶端需要複製的世界物件數目增加,每個客戶端頻寬略有增加。   權威伺服器:以伺服器為準,避免客戶端欺騙。不過客戶端會有一點延遲。 往返時間 RTT:資料包從傳送端到目標端,再從目標端到傳送端的總時長。是影響權威伺服器下,客戶端延遲的主要原因。理想值是100ms以下。 缺點:客戶端B接收時間是A的RTT的1/2+伺服器處理時間+B的RTT的1/2。   專用伺服器
    • 只運行遊戲狀態並與所有客戶端通訊。
    • 專用伺服器的程序與客戶端程序是完全分開的。
    • 無外設,不顯示任何影象。
    • 允許在一臺高效能運算機上執行多個專用伺服器。
      監聽伺服器
    • 端可以即作為客戶端也作為服務端。
    • 優點:降低部署成本,不需要租用伺服器。
    • 缺點:端的效能必須足夠高,需要足夠快的網路連線以應付伺服器的額外負載;玩家惡意退出或網路不佳,都非常影響遊戲進行。
    • 監聽伺服器不等於對等網路連線,應該是對等託管,有伺服器,但是由玩家託管。 
    進階版:主機遷移:監聽伺服器斷開,客戶端中的一個被晉升為新的伺服器。   對等網路:端和端之間互相連線。每個端都有n-1個連線,總複雜度O(n2)。 輸入共享模型:每個端共享所有動作,模擬動作的執行。 缺點:最壞情況下,端之間的延遲是RTT的1/2。很難確保所有對等體保持同步。 改進:確定性鎖步。同步偽隨機數生成器。P187 ———————————————————————— 迴圈冗餘檢驗 CRC:生成一個32位的檢驗和值。開源庫zlib的函式crc32實現。