幀同步--競技類網路遊戲設計方案
一、 前言
幀同步,根據wiki百科的定義是,一種對同步源進行畫素級同步顯示的處理技術,對於網路上的多個接入者,一個訊號將會通過主機同步傳送給其他人,並同步顯示在各個終端上。同步訊號可以是每幀的畫素資料,也可以是影響資料變化的關鍵事件資訊。
幀同步在網路遊戲中的應用,設計上有異於傳統的mmorpg遊戲,因為可以承載更大量的後臺計算,實現類單機的效果,所以可應用在類似射擊類、飛機類中實現彈幕計算或者格鬥類的高精度打擊體驗
本文將主要介紹下幀同步與傳統mmorpg設計框架的異同點以及相關的幾個設計方案,最後,深入展開對其中一種實現方案的分析,而相關的反外掛和斷線重連機制等技術難點暫不在本文討論。
二、 幀同步在遊戲中的應用
網路遊戲中,遊戲服務的架構大致可以分為2種模式,分別是cs模式和p2p模式
cs模式框架如圖1(c為客戶, GSS為遊戲狀態伺服器)
如圖1,遊戲狀態伺服器(GSS)單獨部署,負責對網路上各個接入者提供服務,當GSS狀態發生變化時,將狀態同步傳送給各個接收者。
p2p模式框架如圖2(c為客戶,GSS為遊戲狀態伺服器):
圖2中,遊戲狀態伺服器存在於各個客戶主機上,遊戲狀態的改變直接來自於各個客戶端的輸入。
以上2個服務框架中,cs模式,由於GSS伺服器只有一個,遊戲狀態能保證絕對一致,但GSS可能同時服務上萬個玩家,由於機器效能以及網路頻寬等硬體資源限制,伺服器對大部分情況都無法進行非常嚴格的檢查和處理;
p2p模式中,由於存在多份的GSS,如何保證各個GSS一致也需要特殊考慮,幀同步演算法在遊戲中的應用,主要就是為了解決p2p模式下的GSS一致性問題。實現原理是將遊戲處理細化為幀,對於每幀,在同樣的執行環境中,保證同樣的輸入的情況下,將得到同樣的輸出結果。
圖3中,初始狀態都為1,序列幀第二幀時,輸入加1操作,則狀態變為
通常,為了使用者的輸入能及時的響應以及遊戲狀態的過度能夠平滑,會將GSS設定為20到30幀以上。並且,由於客戶端機器效能或者設定的差異,GSS的狀態無法與遊戲渲染幀實現一一對應,所以,GSS與表現層必須做到完全的分離,否則將因為某些細小的誤差被放大最終導致遊戲出現完全不同的結果。
如圖5,非確定的渲染層的輸出,完全由GSS來驅動,GSS保證幀數的穩定,即使出現網路延遲,也必須在確保收到該幀的所有輸入後才執行該幀的處理。
實現方案上,大致可以分出3種,分別是無主機結構、有主機結構、伺服器主機結構
u 無主機結構
在圖2的拓撲結構中,所有GSS功能對等,該方案需要進行特殊的對幀處理,確保所有客戶端都已經同步並且收到所有的輸入。但是,由於網路上的各個客戶端完全對等,一旦某個使用者網路狀況出現延遲或者中斷等異常,將影響其他使用者的操作體驗,所以該方案簡單公平但體驗容易受限
u 有主機結構
如圖6,在各個客戶端中隨機選擇一個的GSS作為主機,同時負責對幀控制及輸入輸出管理,其他GSS僅跟GSS主機通訊,GSS之間互相不通訊。該方案的好處是,遊戲的體驗只受主機與本機的網路與本機器狀況的影響,其他GSS出現的任何故障都不會影響其他人,當GSS主機完全失去聯絡時,其他GSS也可以重新仲裁得出新的GSS主機來,但該結構主機在客戶端,容易給外掛有可乘之機,對輸入對幀等能進行特殊處理,最終導致遊戲喪失公平性。此方案能保證玩家體驗,但安全性較低
u 伺服器主機結構
伺服器主機結構,是將圖6的結構中的GSS主機的的對幀控制及輸入輸出管理功能放在伺服器上,降低GSS客戶端的客觀影響,保證了大部分玩家的體驗,且其中有玩家作弊,也能馬上檢測到,保證遊戲的公平性,但結構上已脫離p2p設計,通訊流量隨使用者增加,負額指數級增長。該方案安全性高,保證玩家體驗,但對服務負載有一定的要求。
u 其他
融合有/無主機與伺服器主機的結構。伺服器主機結構的特點在於控制權在服務端,在有狀態的網路遊戲中,可以有效防止遊戲資料修改、遊戲加速等外掛,在服務端硬體資源方面,可以增加有/無主機結構減輕負擔,大部分功能用有/無主機結構處理,關鍵操作由伺服器主機結構處理等,讓GSS主機與伺服器主機協同服務
三、 伺服器主機結構設計
伺服器主機結構的特點如上所述,這裡再深入展開對該結構的分析與設計。
伺服器設計
圖7
伺服器主要是起到控制作用,進行客戶端的對幀控制和輸入輸出管理。如圖7,伺服器每幀都發驅動幀驅動客戶端執行幀處理,當客戶端有輸入被伺服器接收到,則伺服器當前幀內將輸入同步輸出給各個客戶端.
網路上由於客戶端的狀況多種多樣,客戶端幀數可能跟不上伺服器,如圖8所示,如果客戶端出現掉幀情況,則在收到驅動幀後需要加速執行,以追上其他客戶端的速度,避免掉幀的使用者一直在對過去的事件進行響應。
遊戲應該優先保證正常使用者的體驗,所以當有玩家出現卡幀情況的時候,不應選擇暫停其他玩家,而是讓他慢慢的追趕上來,設計上,伺服器即可以採用客戶端的正常速度,按幀驅動客戶端,但當網路都出現突發狀況的時候,如圖9,通訊異常時,2個客戶端都對幀數2缺失,如果伺服器照常執行,到恢復網路狀況時,會出現情況是,每個客戶端都卡了幾幀之後,加速拉了幾幀。所以,針對這種情況,增加客戶端的對幀操作,即客戶端執行第1幀時,跟伺服器說可以播放第二幀了,然後伺服器開始驅動第二幀動作,考慮網路延遲情況,可以提前對幀第n幀的,效果如圖9,左邊客戶端第二個對幀操作使伺服器開始推動第二幀進行,而右邊客戶端的第二個對幀動作其實不起任何作用
圖8
圖9
客戶端設計
客戶端設計由兩部分組成,分別是GSS模組和渲染模組。
GSS模組包含物品系統、角色系統、AI系統、場景系統還有其他相關係統等,同時,輸入輸出和幀數控制也一起整合在GSS模組中。GSS中各系統功能分別是:
物品系統: 遊戲物品以及物品的效果
角色系統: 角色包括玩家角色、npc及apc等
ai系統: 驅動apc行動的控制模組
場景系統: 場景物件、地圖、尋路等
其他系統: 其他類似技能、狀態等系統
輸入輸出模組: 監聽玩家輸入,將玩家輸入上報伺服器,同時監聽伺服器輸入,綁定當前幀輸出
幀數控制模組: 監聽伺服器驅動幀,驅動執行每幀處理
GSS模組中各個系統的執行,由幀數驅動,不引入其他時間線。有如物品持續時間、狀態持續時間等都以幀數作為唯一的時間軸。幀與幀之間的播放頻率,則由伺服器統一控制,但由於網路抖動等影響,幀的頻率並不是太穩定,為避免播放抖動,幀數控制器需要進行一定的平滑處理。
客戶端的渲染層,由GSS模組驅動,為減少模組間的耦合,GSS模組使用事件通知機制驅動渲染層表現。具體細分事件型別如圖12(具體專案具體事件拆解)
由於渲染層與GSS只做到事務級的同步,而GSS與渲染層的播放速率有可能不同,則為保證較好的表現效果,GSS的邏輯幀需要與渲染層的渲染幀做固定比率的繫結,譬如圖13的1:2,當GSS邏輯幀數不變的情況下,渲染幀掉幀時,能經過換算得到當前邏輯幀對應的渲染幀數,出現GSS幀數暫停時,則邏輯幀也跟著一起暫停
其中 OnUpdate由引擎在每幀呼叫,GetNewestFrame獲得邏輯幀通知過來的最新幀,這樣,保證了邏輯幀中關鍵幀進行傷害計算時,渲染幀不會脫幀嚴重。
四、 反外掛與斷線重連
稍等後續文章
相關推薦
幀同步--競技類網路遊戲設計方案
一、 前言 幀同步,根據wiki百科的定義是,一種對同步源進行畫素級同步顯示的處理技術,對於網路上的多個接入者,一個訊號將會通過主機同步傳送給其他人,並同步顯示在各個終端上。同步訊號可以是每幀的畫素資料,也可以是影響資料變化的關鍵事件資訊。 幀同步在網路遊戲中的應用,
iOS應用架構談 網路層設計方案
前言 網路層在一個App中也是一個不可缺少的部分,工程師們在網路層能夠發揮的空間也比較大。另外,蘋果對網路請求部分已經做了很好的封裝,業界的AFNetworking也被廣泛使用。其它的ASIHttpRequest,MKNetworkKit啥的其實也都還不錯,但前者已經棄
iOS應用架構談(3):網路層設計方案
前言 網路層在一個App中也是一個不可缺少的部分,工程師們在網路層能夠發揮的空間也比較大。另外,蘋果對網路請求部分已經做了很好的封裝,業界的AFNetworking也被廣泛使用。其它的ASIHttpRequest,MKNetworkKit啥的其實也都還不錯,但前者已經棄坑,後者
中小型棋牌類網路遊戲服務端架構
Gateway 伺服器僅暴露 Gateway 監聽埠,Client 與 Server 之間通訊均通過 Gateway 轉發 Client 與 Gateway 僅建立一條連線,Gateway
如何高效設計遊戲——塔防遊戲設計方案
版權所有 轉載須註明 作者:Einsphoton 任江楓 任何帶有利益性而未經過本人同意的轉載必究 前言 目前國內市場的遊戲普遍為一些帶有“快餐特色的RPG”遊戲居多,並且這一型別的遊戲的設計思路已經發展成為遊戲開發者們“月經”一樣的存在,
NIO+reactor模式的網路伺服器設計方案
NIO+reactor 模式的網路伺服器設計方案 1、前言 在前一篇文章中,介紹了基於 BlockingIO +thread-per-connection 的方案,由於該方案為每一個連線分配一個執行緒,而執行緒裡的大部分操作都是阻塞式的,所以在高併發的情況下,會導致產生大量的執行緒
總結moba遊戲與皇室戰爭類遊戲幀同步區別
之前公司做一款類皇室戰爭遊戲,實時性操作要求不是那麼強,最近在找工作,自己做了一個demo,模仿王者榮耀的moba遊戲,實時性操作非常強,兩個遊戲都是幀同步,因為實時操作的問題,導致兩個專案架構有很大不同。例如:伺服器給客戶端同步間隔時長,客戶端邏輯層驅動,操作執行時間各不相同等。今天
雲風的 BLOG: lockstep 網路遊戲同步方案
首先,我認為把 lockstep 翻譯成幀同步,還有與之對應的所謂“狀態同步” (我在多次面試中聽過這個名詞),都是對同步演算法的錯誤理解造成的。把自己所理解的演算法牽強附會到已有的在歐美遊戲先行者中經過實踐的方案上。 btw, 前幾天和幾位做區
實時對戰網路遊戲--基於幀同步的最佳實踐
網路遊戲概述 網路遊戲的發展始於90年代。歷經超過20年的發展,遊戲結構和內容發生了天翻地覆的變化。自2005年以後,網路遊戲的結構逐漸趨於穩定。網路遊戲從聯網特性上,可以大致分為弱聯網和強聯網兩大類。弱聯網,如大部分的頁遊,部分的手遊。除此之外的網路
網路遊戲之幀同步物理模擬
筆者介紹:姜雪偉,IT公司技術合夥人,IT高階講師,CSDN社群專家,特邀編輯,暢銷書作者,已出版書籍:《手把手教你架構3D遊戲引擎》電子工業出版社和《Unity3D實戰核心技術詳解》電子工業出版社等。本篇部落格我們將用網路中的幀同步技術進行物理模擬,幀同步是通過僅傳送控制該
什麽是遊戲中的幀同步
提高 服務 顯示 多個 網絡數 操作 導致 其他 方式 遊戲中的幀同步是一種客戶端與服務器的同步方式,是為了實現高實時性的需求而設計的。在實時pvp遊戲中,要求每個客戶端高度同步,怎麽做到精確的同步呢,那就是向同步的所有客戶端廣播同步消息。由於網絡存在延遲,因此一個客戶端發
框架基礎:ajax設計方案(六)--- 全局配置、請求格式拓展和優化、請求二進制類型、瀏覽器錯誤搜集以及npm打包發布
rri seve win 最大 regexp isempty lee 出現問題 hub 距離上一次博客大概好多好多時間了,感覺再不搞點東西出來,感覺就廢了的感覺。這段時間回老家學習駕照,修養,然後7月底來上海求職(面了4家,拿了3家office),然後入職同程旅遊,項目趕進
動作手遊實時PVP幀同步方案(圖解客戶端)
1、概述 1.1、基於UDP的幀同步方案 在技術選型方面,之所以選擇幀同步方案,在Kevin的一篇介紹PVP幀同步後臺實現的文章中已經做了詳細敘述,這裡簡單摘要如下: 高一致性。如果每一幀的輸入都同步了,在同樣的上下文中,計算得出的結果應該也是同步的。 低流量消耗。除了幀
【多資料中心】分散式資料同步設計方案
介紹 JD_databus是為滿足多資料中心專案的mysql在資料中心間複製的需求所產生的。最開始JD_databus是在LinkedIn的databus的基礎上開發的,本次設計考慮到可維護性、程式碼的簡潔、需求的快速迭代,決定重新開發。設計
大型企業網路系統整合方案如何設計?
網路系統整合是企業實現無紙化辦公和即時通訊辦公的基礎建設,在以生產效率為核心競爭力的市場中,企業想要快速獲取資訊並有效提高企業工作效率及業務能力,企業網路系統整合是必不可少的,由於目前網路技術複雜多樣化,企業網路系統整合不再那麼簡單,必須經過詳細、周密的規劃設計,才能確保網路系統達到目的,那麼企業網路系統整合
JavaSE基礎(day20)(1)執行緒類的常用方法(2)執行緒的同步機制(3)網路程式設計的常識(4)基於tcp協議的程式設計模型
默寫: 1.程式設計題 分別使用兩種方式啟動一個執行緒,在該執行緒的run()方法中列印1 ~ 20之間的整數。 作業: 1.思考:建立和啟動執行緒兩種方式之間的區別? a.自定義類繼承Thread類並重寫run()方法,建立該類的例項去呼叫start()方法。 b.
手遊網絡遊戲Unity3D幀同步
一、 前言 幀同步,根據wiki百科的定義是,一種對同步源進行畫素級同步顯示的處理技術,對於網路上的多個接入者,一個訊號將會通過主機同步傳送給其他人,並同步顯示在各個終端上。同步訊號可以是每幀的畫素資料,也可以是影響資料變化的關鍵事件資訊。 幀同步在網路遊
網路遊戲伺服器架構設計
入手 假如,我現在接手一個新專案,我的身份還是主程式。在下屬人員一一到位之前,在和製作人以及主策劃充分溝通後,我需要先獨自思考以下問題: 1、伺服器跑在什麼樣的作業系統環境下? 2、採用哪幾種語言開發?主要是什麼? 3、伺服器和客戶端以什麼樣的介面通訊? 4、採用哪些第三方的類庫? 除了技術背景之外,考慮
基於Hadoop開發網路雲盤系統架構設計方案第一稿
引言 雲端計算技術的發展,各種網路雲盤技術如雨後春筍,層出不窮,百度、新浪、網易都推出了自己的雲盤系統,本文基於開源框架Hadoop設計實現了一套自己的網路雲盤系統,方案為初步設計方案,不斷完善中。 一、總體架構 二、方案說明 2.1 系統切分 從使用者角度,整個系統劃分為ECDisk客戶端、EC
大型遊戲行業網路技術解決方案
大型遊戲行業網站該如何解決雲業務問題?大遊戲雲以阿里雲成熟的商業化雲服務為基礎,為遊戲開發、運營企業,提供專屬叢集、尊享VIP服務、專項扶持基金、及多場景多型別的遊戲部署解決方案,幫助中小型遊戲企業快速成長。 購買阿里雲伺服器或其它任何產品,記得先領取阿里雲通用代金券1000元禮包!