1. 程式人生 > 實用技巧 >學習筆記(十):遊戲中的網路模組

學習筆記(十):遊戲中的網路模組

上一節主要針對網路同步的細節與手段進行分析與講解,這一節除了對一些常見的同步應用場景作解釋外更多的會針對偏底層一些的網路內容進行分析。

遊戲中的網路與其它軟體系統基本原理並無差異,基本上就是解決如何把網路訊息快速安全的傳送到其他端,然後其他端及時地處理該訊息並做出對應的遊戲表現。

1.伺服器在整個遊戲過程中是一直執行的
一旦伺服器宕,所有的玩家都會掉線,一旦伺服器出現卡頓,所有的玩家也會出現卡頓,所以伺服器的效能與表現必須非常嚴格。很多情況下,有一些並非非常重要的邏輯最好放到客戶端執行,可以減小伺服器壓力,而且伺服器的記憶體,CPU效能都要比一般的玩家機器要強的多。

為了減小硬體設施開銷,一臺伺服器機器可能同時執行多個遊戲伺服器。MMO遊戲,局域網遊戲以及房間匹配遊戲等,各自的伺服器網路架構也是不同的,這個需要讀者去查閱更多的資料。

推薦連結:https://www.cnblogs.com/hwcs/p/7203605.html
http://gcloud.qq.com/forum/topic/56a0bac3a90d8b775e8f3c1b

2.計算機網路基礎——網路模型
這屬於計算機基礎知識方面的內容,如果不熟悉這一模組,建議先去看一看計算機網路相關書籍,如計算機網路自頂向下方法 https://book.douban.com/subject/1391207/。想進一步深入的話可能需要看TCP/IP詳解 捲一捲二卷三,如果對伺服器興趣不是很大或只是想有個大概理解可以先不看這個系列。
這裡寫圖片描述

3.網路遊戲開發中我們通常接觸的是應用層(遊戲邏輯,Socket處理)與傳輸層(TCP,UDP)

4.TCP與UDP

  • TCP特點: 傳輸可靠—保證順序(滑動視窗),
    不丟包(重傳機制RDT),有擁塞控制
    三次握手,建立連結
    資料包沒有限制
    可以依靠網路層去分幀
  • UDP特點:
    傳輸不可靠—不保證順序,可能丟包,
    實現機制比較簡單
    無連線,隨時傳送
    UDP協議一般要求包小於64K

5.關於TCP與UDP的選擇
二者在不同的遊戲裡面都有廣泛的應用,沒有絕對好壞之分。TCP相比UDP資料安全可靠,但是需要建立連結,機制複雜帶來額外的開銷,在網路環境不好的情況下效果非常差。
TCP應用場景:網路條件較好,對安全可靠性有要求的
UDP應用場景:網路環境較差,要求響應速度比較高,安全性其次的

6.程序通訊


在同一個機器上,兩個不同的程序之間有多種通訊方式。如管道,訊息佇列,訊號量
,訊號,共享記憶體等。(這屬於作業系統基礎知識)
如果想在兩個不同機器的程序之間通訊,就需要用到Socket套接字。(當然他也可以用於同一個機器不同程序通訊)

7.socket
從巨集觀概念上理解,socket是一套基於TCP/IP協議封裝的API。他處於網路應用層,給開發者提供方便的介面來快速的實現網路通訊。網上有的朋友把他比喻成插座,處於兩個機器上的兩個程序想要通訊,就需要各自建立一個插座,然後把自己插在這個插座上,這樣你只要把資訊通過這個插座傳輸過去就好了而不需要管插座裡面有什麼特殊的機制與技巧。當然,理論上你不用插座直接用手把線路焊接到一起也是沒問題的,不過裡面的電流過大斷電機制什麼的需要你自己想辦法處理了。
從程式設計的角度來講,socket是一個無符號整型變數,用來標識一個通訊程序。兩個程序想要通訊必須要知道雙方的ip地址和埠號,以及通訊所採用的協議棧。socket就是和這些東西繫結的,socket程式設計可以使用unix介面,也可以使用windows的介面winSock。
參考連結:
socket程式設計到底是什麼?(https://www.zhihu.com/question/29637351/answer/67610424)
談談socket 套接字(http://blog.csdn.net/farsight2009/article/details/53540546)
TCP/IP、Http、Socket的區別? http://www.zhihu.com/question/39541968?utm_source=qq&utm_medium=social

7.遊戲開發中的基本網路架構
理解了socket之後,所謂遊戲中的網路框架也不難理解。其實就是在socket的基礎上進一步封裝一套更方便遊戲內部的訊息傳輸機制,同時將訊息解析細節與邏輯層程式碼進行分離,使邏輯層程式碼更清晰可讀。低配版:比如客戶端想給伺服器傳送一個比較複雜的資料結構(比如一個包含字串和數字的結構體),那這個資料需要在客戶端轉換成二進位制,通過socket傳送到伺服器。伺服器的網路機制通過其socket監聽到該資料包,然後解析二進位制資料並還原到邏輯上層。
高配版:只簡單的傳送與解析一般資料還不夠,遊戲中我們希望直接能將一個物件直接從客戶端發到伺服器,或者直接將某個函式發到伺服器去執行,更甚者想要在邏輯層實現UDP的可靠資料傳輸。這些較為複雜的機制都包含在網路框架裡面,有時候我們可以借用一些開源的庫來幫我們實現,如protobuf。

8.protobuf
Google Protocol Buffer(Protobuf)是一種輕便高效的結構化資料儲存格式,平臺無關、語言無關、可擴充套件,通常用於通訊協議和資料儲存等領域。通俗一點講,就是用來按照二進位制格式儲存與讀取的開源庫,我們在進行網路傳輸的時候需要把資料轉換成二進位制通過網路層傳送過去,但是如何把複雜資料(一個類物件)準確地轉換成二進位制傳送並在接收端快速準確解析就是個問題。protobuf就可以做這個工作,他可以把一個物件序列化成二進位制,然後在接收端再反序列化成原來的物件內容,這樣我們就成功的傳輸了一個類物件!
這個過程我們是在應用層來實現的,所以本質上游戲網路層的實現對應的就是計算機網路模型中的應用層(和Http,ftp是類似的)

9.GUID
該課程中沒有涉及,但是有必要提出來。前面提到我們可以在網路中傳遞一個物件,但是客戶端上的A物件(如玩家A)與伺服器上的A物件(也是玩家A)在記憶體地址上肯定是不一樣的,我們怎麼知道客戶端傳遞過來的A物件就是伺服器上的?
答案就是GUID,伺服器在同步一個物件引用(指標)的時候,會給其分配專門的GUID並通過網路進行傳送。客戶端上通過識別這個ID,就可以找到對應的類物件。具體的細節可以參考虛幻引擎裡面的實現機制,博主也寫了一篇文件,裡面有提到該機制的相關細節http://blog.csdn.net/u012999985/article/details/78384199

10.事件與代理
遊戲中常用的模組之間通訊方式,可以極大的降低模組耦合性。實現原理是函式指標,比如A模組執行了某個操作後,通過廣播向所有模組發訊息,這些模組如果事先綁定了對應訊息的函式指標,就會收到該訊息並處理。這個過程中A並不知道發給了誰,也不知道其他模組又做了什麼。
轉自連結(轉載請標明):http://blog.csdn.net/u012999985/article/details/79090524