原文鏈接:游戲開發(fā)入門(九)游戲同步技術(shù)_游戲數(shù)據(jù)同步機(jī)制流程怎么開發(fā)-CSDN博客
游戲開發(fā)入門(十)游戲中的網(wǎng)絡(luò)模塊_游戲開發(fā)組網(wǎng)-CSDN博客
3.同步技術(shù)的基本常識(shí):
a.同步給誰?
某個(gè)用戶:如私聊的聊天信息
同屏內(nèi)的所有玩家:發(fā)給同一個(gè)區(qū)域內(nèi)的所有玩家
同一個(gè)服務(wù)器的所有玩家:遍歷整個(gè)服務(wù)器所有玩家,然后逐個(gè)通知,如全服喇叭
b.同步的數(shù)據(jù)是?
命令數(shù)據(jù):發(fā)送一個(gè)消息,通知另一端去執(zhí)行某個(gè)操作,一般通過RPC實(shí)現(xiàn)
狀態(tài)數(shù)據(jù):針對(duì)某一個(gè)數(shù)值,按照一定頻率不斷的發(fā)送給另一端,來讓不同端的該數(shù)值保持一致
c.同步的周期? 在特定邏輯觸發(fā)時(shí)執(zhí)行 一定頻率不間斷的發(fā)送
4.網(wǎng)絡(luò)游戲面臨的問題與解決思路
網(wǎng)絡(luò)延遲:由于網(wǎng)絡(luò)延遲無法避免,所有優(yōu)化的核心就是如何根據(jù)當(dāng)前環(huán)境減少延遲以及如何優(yōu)化
客戶端的視覺感受。一般對(duì)同步數(shù)據(jù)的暴力校正效果是非常差的,需要用各種手段去平滑的處理。
網(wǎng)絡(luò)帶寬:手游玩家可能會(huì)對(duì)流量的消耗比較在意,所以要盡可能的減小同步的數(shù)據(jù)量。減少方式有
- a.在對(duì)象第一次同步的時(shí)候?qū)⑼暾膶?duì)象信息同步過去,后續(xù)只同步那些發(fā)生改變的數(shù)據(jù)
- b.對(duì)協(xié)議內(nèi)容進(jìn)行優(yōu)化,比如不需要可靠的同步消息可以使用UDP,減少一些校驗(yàn)等
- c.某些復(fù)雜的數(shù)據(jù)內(nèi)容可以只傳遞簡單的數(shù)據(jù)信息,然后不同的客戶端以及服務(wù)器通過算法在本地計(jì)算出結(jié)果
反外掛:
- a.關(guān)鍵的游戲邏輯要放在服務(wù)器上面
- b.協(xié)議需要加密,密鑰需要頻繁的改變
- c.服務(wù)器對(duì)客戶端發(fā)送的消息要驗(yàn)證,不合理的及時(shí)校正
5.常見的外掛類型
- 修改客戶端內(nèi)存數(shù)據(jù)
- 截取并修改客戶端發(fā)送到服務(wù)器的消息
- 調(diào)整網(wǎng)絡(luò)延遲,讓其他客戶端不能正確獲到玩家位置
外掛的核心思路:不斷去檢測本地?cái)?shù)據(jù)的變化并嘗試去修改,很有可能就找到游戲邏輯的漏洞。理論上,完全避免外掛也是不可能的,不過可以盡量避免同時(shí)增加外掛實(shí)現(xiàn)的難度
6.關(guān)于P2P同步與服務(wù)器同步
有過計(jì)算機(jī)基礎(chǔ)的朋友應(yīng)該了解P2P,即點(diǎn)對(duì)點(diǎn),就是說兩個(gè)游戲端直接相連,消息不需要發(fā)給其他人。服務(wù)器同步的架構(gòu)里面,所有的客戶端都需要鏈接到一個(gè)服務(wù)器上面,然后所有的消息都需要服務(wù)器先驗(yàn)證,然后在發(fā)送給其他客戶端。我們常見的網(wǎng)絡(luò)游戲都是基于服務(wù)器同步的。
7.P2P同步常見的同步策略——時(shí)間軸同步:
a.常規(guī)同步 A產(chǎn)生命令發(fā)給B的同時(shí),立刻執(zhí)行。B收到消息后再去執(zhí)行。這個(gè)過程有延遲
b.約定同步
為了克服上面的執(zhí)行不同步,A在產(chǎn)生命令的同時(shí)將消息與當(dāng)前時(shí)間戳都發(fā)送給B。B收到命令后,根據(jù)
網(wǎng)絡(luò)情況在預(yù)測時(shí)間與A“同時(shí)”執(zhí)行。或者A在產(chǎn)生命令的同時(shí)告訴B,應(yīng)該在哪個(gè)時(shí)間戳開始執(zhí)行,B收到 消息后在與A商量好的時(shí)間去執(zhí)行。
注:該方法肯定也可能會(huì)有延遲的,不過一定范圍內(nèi)可以接收,效果也比常規(guī)同步的好一些
8.P2P同步常見的同步策略——幀同步:
幀同步的核心是保證各個(gè)端的邏輯幀保持一致。如果A在執(zhí)行第N+1幀的時(shí)候需要B的第N幀數(shù)據(jù),那么必須等到B
的第N幀數(shù)據(jù)同步過來后才能執(zhí)行。
- 優(yōu)點(diǎn):保證邏輯上的完全同步
- 缺點(diǎn):如果一個(gè)客戶端的網(wǎng)絡(luò)環(huán)境差,會(huì)導(dǎo)致另一個(gè)客戶端也卡頓。
注:視頻中提到對(duì)視覺要求不是很高的游戲采用幀同步,這句話有待商榷,他這里可能只是針對(duì)P2P。我們所熟知的“王者榮耀”采用的就是幀同步的方法,只不過他是在服務(wù)器同步架構(gòu)下,采用的是樂觀幀以及各個(gè)細(xì)節(jié)的逐步優(yōu)化來完成的,后面簡單講解
9.服務(wù)器常見的同步策略——服務(wù)器時(shí)間軸同步:
前面提到過,服務(wù)器同步架構(gòu)下,所有的消息都要通過服務(wù)器驗(yàn)證與轉(zhuǎn)發(fā)。這與P2P基于時(shí)間軸同步策略是相同的,不過因?yàn)橹虚g多了一道程序,延遲還可能有所增加。視頻中所指的這種同步,在業(yè)界常說的狀態(tài)同步差不多,也就是客戶端的某些同步屬性要與服務(wù)器保持一致。狀態(tài)同步與時(shí)間軸同步的概念側(cè)重點(diǎn)與分類有點(diǎn)不同,大家理解就好。
- 優(yōu)點(diǎn):可以對(duì)客戶端消息進(jìn)行驗(yàn)證,防止外掛。
- 缺點(diǎn):延遲比較高,所以為了表現(xiàn)流暢,一般都是客戶端在執(zhí)行命令的時(shí)候立即執(zhí)行操作,然后發(fā)給服務(wù)器去驗(yàn)證,如果驗(yàn)證不通過,服務(wù)器還會(huì)對(duì)客戶端進(jìn)行校正。
10.服務(wù)器常見的同步策略——服務(wù)器幀同步:
幀同步在服務(wù)器架構(gòu)下仍然可以使用,不過在處理上可能有些差異。一般來說,客戶端玩家在觸發(fā)了某個(gè)按鍵操作的時(shí)候,會(huì)將操作的命令(注意:這個(gè)命令包含的只是玩家按鍵的信息,沒有其他邏輯信息)與當(dāng)前幀發(fā)送給服務(wù)器。服務(wù)器收集到所有客戶端當(dāng)前幀的操作信息后,就會(huì)廣播執(zhí)行給所有客戶端。如果有的客戶端沒有發(fā)送當(dāng)前幀的指令,服務(wù)器就不會(huì)廣播消息,這時(shí)候所有客戶端就會(huì)鎖幀。
幀同步優(yōu)化:為了避免客戶端網(wǎng)絡(luò)出現(xiàn)延遲的問題,產(chǎn)生了“樂觀鎖”的處理手段。就是服務(wù)器不去等待客戶端是否發(fā)送了幀操作數(shù)據(jù),每隔固定時(shí)間就廣播給所有客戶端。(視頻第二節(jié)后面的內(nèi)容就是這種機(jī)制)
11.同步中常見術(shù)語
- 主像:本地玩家角色,當(dāng)前設(shè)備控制的角色
- 影像:本地客戶端看到的其他玩家角色
- 客戶端:包含本地玩家的終端設(shè)備
- FPS:幀數(shù)
12.位置同步
區(qū)域位置同步:給玩家配置一個(gè)范圍,玩家移動(dòng)超出這個(gè)范圍后立刻觸發(fā)同步更新中心坐標(biāo)。同時(shí)為了防止玩家總在一個(gè)很小的范圍移動(dòng),可以設(shè)置每隔一段固定時(shí)間就進(jìn)行一次同步。
13.操作同步
客戶端觸發(fā)某個(gè)操作立刻執(zhí)行,然后發(fā)送給服務(wù)器,服務(wù)器廣播給其他客戶端執(zhí)行
14.命中同步
這個(gè)不同的游戲有不同的方式,可以選擇讓客戶端進(jìn)行判定,把結(jié)果傳給服務(wù)器。也可以把玩家操作
發(fā)給服務(wù)器,讓服務(wù)器去計(jì)算判斷。
15.網(wǎng)絡(luò)同步調(diào)試手段
a.Log/斷點(diǎn) 如果可以在開發(fā)時(shí)就定位到問題,那最直接的辦法就是斷點(diǎn)。如果不好定位,可以采用輸出日志的方式,即log
b.錄像/錄屏(Fraps)
錄像與我們常說的視頻錄像不太一樣,而是我們記錄玩家在各個(gè)時(shí)間點(diǎn)的操作,從游戲開始到結(jié)束完全的模擬一遍。這其實(shí)也是游戲回放的基本思路,很明顯這樣很容易重現(xiàn)我們之前出現(xiàn)的問題,這個(gè)錄像一般需要游戲項(xiàng)目提供相關(guān)的功能才可以。
如果游戲本身不支持錄像功能,那可以借助工具來調(diào)試,如Fraps可以按特定幀數(shù)截屏
c.網(wǎng)絡(luò)模擬軟件(Network-Emulator-Toolkit)
開發(fā)者的游戲環(huán)境與玩家一般是不同的,為了測試在外網(wǎng)環(huán)境下玩家的游戲情況,我們可以借助一些網(wǎng)絡(luò)模擬軟件來調(diào)整當(dāng)前開發(fā)環(huán)境下的網(wǎng)絡(luò)延遲
1.服務(wù)器在整個(gè)游戲過程中是一直運(yùn)行的
一旦服務(wù)器宕,所有的玩家都會(huì)掉線,一旦服務(wù)器出現(xiàn)卡頓,所有的玩家也會(huì)出現(xiàn)卡頓,所以服務(wù)器的性能與表現(xiàn)必須非常嚴(yán)格。很多情況下,有一些并非非常重要的邏輯最好放到客戶端執(zhí)行,可以減小服務(wù)器壓力,而且服務(wù)器的內(nèi)存,CPU性能都要比一般的玩家機(jī)器要強(qiáng)的多。
為了減小硬件設(shè)施開銷,一臺(tái)服務(wù)器機(jī)器可能同時(shí)運(yùn)行多個(gè)游戲服務(wù)器。MMO游戲,局域網(wǎng)游戲以及房間匹配游戲等,各自的服務(wù)器網(wǎng)絡(luò)架構(gòu)也是不同的,這個(gè)需要讀者去查閱更多的資料。
推薦鏈接:游戲服務(wù)器架構(gòu) - 衛(wèi)長青 - 博客園 (cnblogs.com)
http://gcloud.qq.com/forum/topic/56a0bac3a90d8b775e8f3c1b
2.計(jì)算機(jī)網(wǎng)絡(luò)基礎(chǔ)——網(wǎng)絡(luò)模型
這屬于計(jì)算機(jī)基礎(chǔ)知識(shí)方面的內(nèi)容,如果不熟悉這一模塊,建議先去看一看計(jì)算機(jī)網(wǎng)絡(luò)相關(guān)書籍,如計(jì)算機(jī)網(wǎng)絡(luò)自頂向下方法 計(jì)算機(jī)網(wǎng)絡(luò)(第4版) (豆瓣) (douban.com)。想進(jìn)一步深入的話可能需要看TCP/IP詳解 卷一卷二卷三,如果對(duì)服務(wù)器興趣不是很大或只是想有個(gè)大概理解可以先不看這個(gè)系列。
3.網(wǎng)絡(luò)游戲開發(fā)中我們通常接觸的是應(yīng)用層(游戲邏輯,Socket處理)與傳輸層(TCP,UDP)
4.TCP與UDP
TCP特點(diǎn): 傳輸可靠—保證順序(滑動(dòng)窗口),
不丟包(重傳機(jī)制RDT),有擁塞控制
三次握手,建立鏈接
數(shù)據(jù)包沒有限制
可以依靠網(wǎng)絡(luò)層去分幀
UDP特點(diǎn):
傳輸不可靠—不保證順序,可能丟包,
實(shí)現(xiàn)機(jī)制比較簡單
無連接,隨時(shí)發(fā)送
UDP協(xié)議一般要求包小于64K
5.關(guān)于TCP與UDP的選擇
二者在不同的游戲里面都有廣泛的應(yīng)用,沒有絕對(duì)好壞之分。TCP相比UDP數(shù)據(jù)安全可靠,但是需要建立鏈接,機(jī)制復(fù)雜帶來額外的開銷,在網(wǎng)絡(luò)環(huán)境不好的情況下效果非常差。
TCP應(yīng)用場景:網(wǎng)絡(luò)條件較好,對(duì)安全可靠性有要求的
UDP應(yīng)用場景:網(wǎng)絡(luò)環(huán)境較差,要求響應(yīng)速度比較高,安全性其次的
6.進(jìn)程通信
在同一個(gè)機(jī)器上,兩個(gè)不同的進(jìn)程之間有多種通信方式。如管道,消息隊(duì)列,信號(hào)量
,信號(hào),共享內(nèi)存等。(這屬于操作系統(tǒng)基礎(chǔ)知識(shí))
如果想在兩個(gè)不同機(jī)器的進(jìn)程之間通信,就需要用到Socket套接字。(當(dāng)然他也可以用于同一個(gè)機(jī)器不同進(jìn)程通信)
7.socket
從宏觀概念上理解,socket是一套基于TCP/IP協(xié)議封裝的API。他處于網(wǎng)絡(luò)應(yīng)用層,給開發(fā)者提供方便的接口來快速的實(shí)現(xiàn)網(wǎng)絡(luò)通信。網(wǎng)上有的朋友把他比喻成插座,處于兩個(gè)機(jī)器上的兩個(gè)進(jìn)程想要通信,就需要各自創(chuàng)建一個(gè)插座,然后把自己插在這個(gè)插座上,這樣你只要把信息通過這個(gè)插座傳輸過去就好了而不需要管插座里面有什么特殊的機(jī)制與技巧。當(dāng)然,理論上你不用插座直接用手把線路焊接到一起也是沒問題的,不過里面的電流過大斷電機(jī)制什么的需要你自己想辦法處理了。
從編程的角度來講,socket是一個(gè)無符號(hào)整型變量,用來標(biāo)識(shí)一個(gè)通信進(jìn)程。兩個(gè)進(jìn)程想要通信必須要知道雙方的ip地址和端口號(hào),以及通信所采用的協(xié)議棧。socket就是和這些東西綁定的,socket編程可以使用unix接口,也可以使用windows的接口winSock。
參考鏈接:
socket編程到底是什么?(socket編程到底是什么? - 知乎 (zhihu.com))
談?wù)剆ocket 套接字(談?wù)剆ocket 套接字_華清遠(yuǎn)見linux的socket套接字-CSDN博客)
TCP/IP、Http、Socket的區(qū)別? TCP/IP、Http、Socket的區(qū)別? - 知乎 (zhihu.com)
7.游戲開發(fā)中的基本網(wǎng)絡(luò)架構(gòu)
理解了socket之后,所謂游戲中的網(wǎng)絡(luò)框架也不難理解。其實(shí)就是在socket的基礎(chǔ)上進(jìn)一步封裝一套更方便游戲內(nèi)部的消息傳輸機(jī)制,同時(shí)將消息解析細(xì)節(jié)與邏輯層代碼進(jìn)行分離,使邏輯層代碼更清晰可讀。低配版:比如客戶端想給服務(wù)器發(fā)送一個(gè)比較復(fù)雜的數(shù)據(jù)結(jié)構(gòu)(比如一個(gè)包含字符串和數(shù)字的結(jié)構(gòu)體),那這個(gè)數(shù)據(jù)需要在客戶端轉(zhuǎn)換成二進(jìn)制,通過socket發(fā)送到服務(wù)器。服務(wù)器的網(wǎng)絡(luò)機(jī)制通過其socket監(jiān)聽到該數(shù)據(jù)包,然后解析二進(jìn)制數(shù)據(jù)并還原到邏輯上層。
高配版:只簡單的發(fā)送與解析一般數(shù)據(jù)還不夠,游戲中我們希望直接能將一個(gè)對(duì)象直接從客戶端發(fā)到服務(wù)器,或者直接將某個(gè)函數(shù)發(fā)到服務(wù)器去執(zhí)行,更甚者想要在邏輯層實(shí)現(xiàn)UDP的可靠數(shù)據(jù)傳輸。這些較為復(fù)雜的機(jī)制都包含在網(wǎng)絡(luò)框架里面,有時(shí)候我們可以借用一些開源的庫來幫我們實(shí)現(xiàn),如protobuf。
8.protobuf
Google Protocol Buffer(Protobuf)是一種輕便高效的結(jié)構(gòu)化數(shù)據(jù)存儲(chǔ)格式,平臺(tái)無關(guān)、語言無關(guān)、可擴(kuò)展,通常用于通訊協(xié)議和數(shù)據(jù)存儲(chǔ)等領(lǐng)域。通俗一點(diǎn)講,就是用來按照二進(jìn)制格式保存與讀取的開源庫,我們?cè)谶M(jìn)行網(wǎng)絡(luò)傳輸?shù)臅r(shí)候需要把數(shù)據(jù)轉(zhuǎn)換成二進(jìn)制通過網(wǎng)絡(luò)層發(fā)送過去,但是如何把復(fù)雜數(shù)據(jù)(一個(gè)類對(duì)象)準(zhǔn)確地轉(zhuǎn)換成二進(jìn)制發(fā)送并在接收端快速準(zhǔn)確解析就是個(gè)問題。protobuf就可以做這個(gè)工作,他可以把一個(gè)對(duì)象序列化成二進(jìn)制,然后在接收端再反序列化成原來的對(duì)象內(nèi)容,這樣我們就成功的傳輸了一個(gè)類對(duì)象!
這個(gè)過程我們是在應(yīng)用層來實(shí)現(xiàn)的,所以本質(zhì)上游戲網(wǎng)絡(luò)層的實(shí)現(xiàn)對(duì)應(yīng)的就是計(jì)算機(jī)網(wǎng)絡(luò)模型中的應(yīng)用層(和Http,ftp是類似的)
9.GUID
該課程中沒有涉及,但是有必要提出來。前面提到我們可以在網(wǎng)絡(luò)中傳遞一個(gè)對(duì)象,但是客戶端上的A對(duì)象(如玩家A)與服務(wù)器上的A對(duì)象(也是玩家A)在內(nèi)存地址上肯定是不一樣的,我們?cè)趺粗揽蛻舳藗鬟f過來的A對(duì)象就是服務(wù)器上的?
答案就是GUID,服務(wù)器在同步一個(gè)對(duì)象引用(指針)的時(shí)候,會(huì)給其分配專門的GUID并通過網(wǎng)絡(luò)進(jìn)行發(fā)送。客戶端上通過識(shí)別這個(gè)ID,就可以找到對(duì)應(yīng)的類對(duì)象。具體的細(xì)節(jié)可以參考虛幻引擎里面的實(shí)現(xiàn)機(jī)制,博主也寫了一篇文檔,里面有提到該機(jī)制的相關(guān)細(xì)節(jié)UE4網(wǎng)絡(luò)同步(二)——深入同步細(xì)節(jié)_ue4 網(wǎng)絡(luò)同步 csdn-CSDN博客文章來源:http://www.zghlxwxcb.cn/news/detail-836224.html
10.事件與代理
游戲中常用的模塊之間通信方式,可以極大的降低模塊耦合性。實(shí)現(xiàn)原理是函數(shù)指針,比如A模塊執(zhí)行了某個(gè)操作后,通過廣播向所有模塊發(fā)消息,這些模塊如果事先綁定了對(duì)應(yīng)消息的函數(shù)指針,就會(huì)收到該消息并處理。這個(gè)過程中A并不知道發(fā)給了誰,也不知道其他模塊又做了什么。文章來源地址http://www.zghlxwxcb.cn/news/detail-836224.html
到了這里,關(guān)于游戲同步+游戲中的網(wǎng)絡(luò)模塊的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!