網路遊戲同步方式(幀同步和狀態同步)
在做網路遊戲的時候首先要做的是選擇一種同步方式來使用,網上的文章都是說幀同步與狀態同步的選擇,但是又經常講的模糊不清,我大概整理了一下,並且有一種我們現在專案用的網路同步方式
狀態同步
狀態同步就有好幾個說法,說是同步狀態,同步操作等,又找不到一遍文章能清楚的講一遍什麼是狀態同步。
所以大概總結一下就是,狀態同步是通過每個客戶端傳送自己的操作給伺服器,這時客戶端不進行任何動作,伺服器統一計算後並把結果同步個每一個客戶端。
這裡要點就是,同步操作,伺服器結算結果。
這裡推薦兩篇文章
http://www.cnblogs.com/sevenyuan/p/5283265.html
https://www.zhihu.com/question/36258781
這裡講了這兩種同步方式的區別,但是依然沒有很清楚。狀態同步也找不到更好的文章,如果你有的話也請在評論區分享一下一起學習。
幀同步
幀同步是在關鍵幀的時候同步操作給伺服器,伺服器轉發操作給每個客戶端。客戶端之間要接受到關鍵幀才可以進行操作。
幀同步裡面有一個關鍵技術就鎖幀,也就是如果沒有收到廣播的關鍵幀不能進行下一步操作。大家靜止不動。
而現在的遊戲會有一個聰明一點的方法叫做樂觀幀鎖定
樂觀幀鎖定通過定時傳送關鍵幀的方法,不鎖定任何客戶端,伺服器一定時間間隔就發包給每個客戶端,包裡可能是空包也有可能是你自己活著別人的操作。而客戶端就通過定時或者每當操作就發包的形式告訴伺服器自己的操作。
但不論是什麼形式的幀同步都是客戶端收到其他玩家的操作後自己模擬行為。所以這個就需要大家如果是隨機的時候要保證一致,也就是有一樣的隨機種子,而且在每個客戶端中無法保證一定一致,也就是這個原因幀同步一般會用著競技類遊戲,遊戲都是一盤一盤的來,每盤開始就給大家統一的第一幀和隨機種子,保證這個遊戲在每個客戶端中基本一致
其實在網速好的時候這些都不是問題,基本上不同客戶端上的表現基本一致。
而當網速不一致時,當你選用樂觀幀同步的話就可以保障網速好的不會被網速差的玩家卡住
幀同步有好多好文章,這裡也推薦兩篇
http://mp.weixin.qq.com/s?__biz=MzA5ODExMTkwMA==&mid=2650255562&idx=1&sn=a457e6dbf7bdd99d1e75dbf7e500dd44&scene=0#wechat_redirect?ref=myread
http://www.skywind.me/blog/archives/131
這兩篇是已經講的非常清楚,非常好的兩篇文章
所以能看到,其實在手遊時代,狀態同步基本是不可取的,伺服器壓力太大,對網路要求太高。
而幀同步的話也會選擇樂觀幀同步,保證在網速好壞不同的情況下還能一起玩,並且網速好的玩家不會受干擾。
自己遊戲的同步方式
我們是一個mmoarpg手遊,也就是動作類網遊。
由於我們的遊戲型別,其實不需要真的非常同步,並且可能有很多個玩家同屏,首先拋棄狀態同步
接著我們也不是競技類遊戲,所以基本上也不需要幀同步。
所以我們同步也就是客戶端傳送請求給伺服器,伺服器驗證一下,如果出入太大強行拉回,不然也不返回給自己客戶端,只同步位置給其他客戶端。
技能上就是客戶端請求使用技能,在技能中的打擊幀告訴伺服器這個人我能不能傷害,伺服器判斷並同步給大家這個傷害。
所以基本上算不上什麼同步方式。
但是如果我們之後需要做更為嚴肅的pvp玩法,則需要幀同步來進行操作。這個可能會在後面補充
這裡面還有很多可以一起討論的地方,也希望大家評論一下一起討論
還有一篇王者榮耀的同步技術文章
http://mp.weixin.qq.com/s/agXeHpN2vkgl5jKsLvi2Ug
轉自:https://blog.csdn.net/chrisfxs/article/details/73655934
相關文章
- 幀同步遊戲的設計遊戲
- vue父子元件狀態同步的最佳方式Vue元件
- 同步和非同步非同步
- C# 同步 非同步 回撥 狀態機 async await DemoC#非同步AI
- 手遊幀同步的研究[轉]
- 微軟同步框架入門之二--增量和修改同步方式微軟框架
- 非同步API中事件、命令和狀態區別非同步API事件
- nagios監控drbd同步狀態iOS
- 網路同步在遊戲歷史中的發展變化(五)—— 物理同步遊戲
- JS 非同步和同步JS非同步
- 網路通訊——socket(TCP/IP).Http,同步和非同步的區別TCPHTTP非同步
- 王者榮耀技術分析(二):遊戲的幀同步遊戲
- 時態同步
- javascript中同步和非同步JavaScript非同步
- mysql主從同步(5)-同步延遲狀態考量(seconds_behind_master和pt-heartbea)MySql主從同步AST
- 網路IO之阻塞、非阻塞、同步、非同步總結非同步
- Java執行緒狀態及同步鎖Java執行緒
- nagios監控 ogg同步狀態iOS
- UnrealEngine - 網路同步入門Unreal
- steam雲狀態無法同步怎麼辦 steam雲狀態無法同步會有什麼影響
- vue父子元件狀態同步的最佳方式續章(v-model篇)Vue元件
- 網路安全和網路發展需同步推進
- 檔案讀寫網路IO簡單瞭解,同步IO和非同步IO非同步
- AJAX同步和非同步區別非同步
- 同步、非同步、阻塞和非阻塞非同步
- mysql檢視主從同步狀態的方法MySql主從同步
- 狀態同步,究竟是推還是拉?
- MongoDB原理:複製集狀態同步機制MongoDB
- Web3開發中的狀態同步Web
- 同步通訊和非同步通訊非同步
- 純前端如何利用幀同步做一款聯機遊戲?前端遊戲
- 使用rsync同步網路備份
- Linux 網路時間同步Linux
- XHR 例項 GET 和 POST 非同步和同步非同步
- (6)同步復位非同步釋放電路非同步
- 基於 swoole 的 websocket 服務一:狀態同步Web
- 論企業生產網NTP時鐘同步(網路時間同步服務)
- Golang非同步程式設計方式和技巧Golang非同步程式設計