吳晶晶,戴智超
(泉州師范學院 數(shù)學與計算機科學學院,泉州 362000)(福建省大數(shù)據(jù)管理新技術(shù)與知識工程重點實驗室,泉州 362000)(智能計算與信息處理福建省高校重點實驗室,泉州 362000)
多人在線網(wǎng)絡(luò)游戲服務(wù)器的設(shè)計與開發(fā)①
吳晶晶,戴智超
(泉州師范學院 數(shù)學與計算機科學學院,泉州 362000)(福建省大數(shù)據(jù)管理新技術(shù)與知識工程重點實驗室,泉州 362000)(智能計算與信息處理福建省高校重點實驗室,泉州 362000)
服務(wù)器的效率是網(wǎng)絡(luò)游戲能否提供高質(zhì)量的網(wǎng)絡(luò)服務(wù)的重要因素之一.本文針對這一問題,提出了模板化回調(diào)策略改良現(xiàn)有的網(wǎng)絡(luò)游戲的會話信息交互.文中基于VisualStudio與C++,重點剖析服務(wù)器架設(shè)過程中的關(guān)鍵技術(shù)和策略,設(shè)計開發(fā)了經(jīng)典網(wǎng)絡(luò)人物扮演游戲服務(wù)器,分別由“數(shù)據(jù)庫”、“賬號服務(wù)器”、“網(wǎng)絡(luò)服務(wù)”和“副本”組成.實驗結(jié)果表明,采用模板化回調(diào)技術(shù),有效降低服務(wù)器信息交互的延遲.實踐證明,本文所討論的關(guān)鍵技術(shù)可應(yīng)用于場景漫游、游戲開發(fā)等多個領(lǐng)域,具有一定的實際應(yīng)用價值.
服務(wù)器效率; 多人在線網(wǎng)絡(luò)游戲; 模板化回調(diào)設(shè)計; 高質(zhì)量的網(wǎng)絡(luò)服務(wù)
隨著Android平臺游戲、iPhone平臺游戲以及Web網(wǎng)頁游戲迅猛發(fā)展,3D游戲成為當前游戲的發(fā)展熱點.MMORPG游戲即多人在線角色扮演類游戲,是現(xiàn)在最為流行的經(jīng)典網(wǎng)絡(luò)游戲形式.隨著高性能智能手機的普及,市場上出現(xiàn)了如“王者榮耀”、“陰陽師”等這類極為優(yōu)秀的次時代MMORPG.但這依然不足以滿足手機游戲玩家的需求,玩家們開始追求手機平臺游戲與PC平臺游戲的聯(lián)動.
固然手機性能已經(jīng)可與PC比肩,但手機網(wǎng)絡(luò)問題依然高懸.現(xiàn)今普及的4G網(wǎng)絡(luò),其速度已經(jīng)接近PC網(wǎng)絡(luò)水平,但網(wǎng)絡(luò)穩(wěn)定性依然遠遠達不到PC網(wǎng)絡(luò)水平,而且高額的流量費用也成了手機游戲難以與PC聯(lián)動的巨大障礙.為實現(xiàn)手機網(wǎng)絡(luò)游戲與PC網(wǎng)絡(luò)游戲的聯(lián)動,必須搭建高網(wǎng)絡(luò)穩(wěn)定性、低流量消耗、低延遲的高性能多平臺通用服務(wù)器.通過這樣的服務(wù)器來實現(xiàn)高質(zhì)量網(wǎng)絡(luò)服務(wù).
高質(zhì)量的網(wǎng)絡(luò)服務(wù)受限于三大因素:首先是網(wǎng)絡(luò)運營商的網(wǎng)絡(luò)質(zhì)量,由第三方提供,如電信或是聯(lián)通等運營商; 其次是網(wǎng)絡(luò)協(xié)議層和路由算法的優(yōu)化程度[1,2],游戲開發(fā)者在這方面則作為用戶,故本文不對其進行討論; 最后是服務(wù)器的效率.
關(guān)于如何提高網(wǎng)絡(luò)服務(wù)質(zhì)量,國內(nèi)的研究大多數(shù)針對網(wǎng)絡(luò)協(xié)議層,但國內(nèi)也有針對提高服務(wù)器效率的優(yōu)秀策略.如王瑞彪等人基于IOCP機制完成服務(wù)器通信層的實現(xiàn)[3].該方案實現(xiàn)了多線程信息投遞并實時監(jiān)聽,降低了信息重復發(fā)送、排序錯誤概率,并為用戶留下完整的操作接口.林泊等人基于J2EE集成了應(yīng)用服務(wù)器框架[4],實現(xiàn)在不對讀取速度造成影響的情況下降低了維護和操作難度.
本文針對如何提高服務(wù)器效率,提出“模板化回調(diào)”策略改良現(xiàn)有的網(wǎng)絡(luò)游戲的會話信息交互.實踐證明,本文所討論的關(guān)鍵技術(shù)可應(yīng)用于場景漫游、游戲開發(fā)等多個領(lǐng)域,具有一定的實際應(yīng)用價值.
本文中的服務(wù)器對應(yīng)于文中由基于Unity3D開發(fā)的MMORPG游戲客戶端.玩家在游戲客戶端注冊并登錄個人賬號,服務(wù)器則將玩家錄入的信息新建為SQL表并存入數(shù)據(jù)庫[5]中.服務(wù)器核心處理客戶端發(fā)送來的所有信息請求.以“組隊”請求為例,由一位“隊長”發(fā)起請求,在經(jīng)過服務(wù)器處理后,服務(wù)器再將信息同步到所有賬號被請求的“隊員”.通過服務(wù)器實現(xiàn)的“組隊”如圖1所示.基于這種會話形式,本文實現(xiàn)了多個客戶端之間依賴于彼此的賬號,在服務(wù)器中進行數(shù)據(jù)同步.
在服務(wù)器的設(shè)計上,傳統(tǒng)的高同步幀率普通RPG游戲為30幀,高更新率的動作游戲為60幀.相較于傳統(tǒng)同步率,本文則采取10幀的同步率,10幀的設(shè)定足夠?qū)崿F(xiàn)事件流暢同步,同時避免了過高同步率導致的流量的不必要流失.
圖1 服務(wù)器“組隊系統(tǒng)”的設(shè)計
為了更好地符合用戶的需求,本文對于服務(wù)器的設(shè)計提出以下策略:
① 服務(wù)器應(yīng)標識并處理客戶端的靜態(tài)全局型請求,例如賬號登錄、登出請求.
② 服務(wù)器應(yīng)實時處理客戶端對于賬號數(shù)據(jù)的靜態(tài)全局型請求,例如像申請賬號、修改賬號密碼、獲得新的道具等需要修改數(shù)據(jù)庫靜態(tài)表的請求.
③ 服務(wù)器應(yīng)標識并處理客戶端的動態(tài)非全局型請求,例如人物受傷后生命值降低、發(fā)起的攻擊被躲開等.服務(wù)器標識與處理如圖2所示.
圖2 服務(wù)器標識與處理
本文服務(wù)器系統(tǒng)結(jié)構(gòu)如圖3所示,服務(wù)器基于自主研發(fā)的Core核心架構(gòu),通過核心連接“數(shù)據(jù)庫”、“賬號服務(wù)器”、“網(wǎng)絡(luò)服務(wù)”、“副本”四個子程序構(gòu)成.服務(wù)器這樣的設(shè)計模式,使維護、調(diào)試難度降低,并且由于服務(wù)器運行基于Core核心架構(gòu),提高了運行效率和編譯耦合度.
圖3 服務(wù)器核心結(jié)構(gòu)
賬號服務(wù)器是服務(wù)器中剝離出來的重要子程序之一.賬號服務(wù)器只處理客戶端發(fā)出的賬號申請,例如“登錄”、“登出”、“注冊”等行為.在服務(wù)器核心中,由“網(wǎng)絡(luò)服務(wù)”接收賬號請求,然后賬號服務(wù)器管理這些賬號請求,設(shè)定對應(yīng)賬號的訪問狀態(tài).然后將請求對應(yīng)的處理方式經(jīng)由“網(wǎng)絡(luò)服務(wù)”再次發(fā)向?qū)?yīng)的賬號.賬號服務(wù)器運行邏輯如圖4所示,以下是對賬號服務(wù)器運行邏輯的分析:
(1)預(yù)先聲明定義好 Account類型,構(gòu)造兩個Account對象的數(shù)組:“登錄賬號數(shù)組”和“登出賬號數(shù)組”.
(2)Run每一幀監(jiān)聽客戶端請求,若存在“登錄請求”就在“登錄賬號數(shù)組”中創(chuàng)建一個新的Account對象,并把“登錄請求”傳入的Account信息寫入新建的Account對象中達到復制構(gòu)造的特性.
(3)Run每一幀監(jiān)聽客戶端請求,若存在“登出請求”就在“登出賬號數(shù)組”中保存“登出玩家”,方法同(2).
(4)登出處理是在Run函數(shù)一開始就執(zhí)行的.在每次下一幀的開始,遍歷“登出賬號數(shù)組”,然后將“登錄賬號數(shù)組”中所有相同的Account刪除,再清除“登出賬號數(shù)組”.
本文采用常用的會話通信方式,完成服務(wù)器與客戶端之間的數(shù)據(jù)交互.對于每次客戶端行為,例如來自客戶端的一次登陸請求,客戶端都會向服務(wù)器發(fā)起一次會話.服務(wù)器接收該會話內(nèi)容,并通過RTTI[6,7]技術(shù)的設(shè)計,將相應(yīng)的會話內(nèi)容進行識別并加以打包.通過網(wǎng)絡(luò)監(jiān)聽器監(jiān)聽服務(wù)器狀態(tài),網(wǎng)絡(luò)監(jiān)聽器的設(shè)計基于訪問者設(shè)計模式[8].通過這一系列過程,完成服務(wù)器和客戶端間的信息交互,信息交互的實現(xiàn)思路如圖5所示.
圖4 賬號服務(wù)器運行邏輯
① 若服務(wù)器處于可訪問狀態(tài)時,服務(wù)器可以不斷接受信息,并不斷處理信息.
② 若服務(wù)器處于不可訪問狀態(tài)時,則服務(wù)器中斷接收新信息,并處理完拋出當前未接受完的數(shù)據(jù)包.
③ 當信息接收失敗時,服務(wù)器直接放棄接收該數(shù)據(jù)包.在服務(wù)器將該數(shù)據(jù)包拋出后,服務(wù)器進入下一幀的數(shù)據(jù)讀取.
圖5 服務(wù)器信息交互
對于MMORPG游戲而言,網(wǎng)絡(luò)延遲是一個長久以來的難題.為了提供玩家良好的游戲體驗,服務(wù)器的設(shè)計不僅要實現(xiàn)“時刻等待并處理”玩家發(fā)送的信息,同時還要保證網(wǎng)絡(luò)延遲不會對玩家的游戲體驗造成可視的影響.但網(wǎng)絡(luò)狀況往往遭受例如路由協(xié)議、網(wǎng)絡(luò)運營商等因素的干擾,因而服務(wù)器的設(shè)計中,應(yīng)有應(yīng)對網(wǎng)絡(luò)延遲的策略[9].
本次服務(wù)器通信協(xié)議采用TCP協(xié)議,但TCP協(xié)議與服務(wù)器的平臺Windows的數(shù)據(jù)標準不同.TCP協(xié)議只允許數(shù)據(jù)以8bits為單位進行發(fā)送與接收,而Windows中默認C++以32bits為單位將數(shù)據(jù)整齊排列到內(nèi)存中.此時將數(shù)據(jù)發(fā)送出,如圖6所示,數(shù)據(jù)在TCP協(xié)議層還需經(jīng)過拆解,并讀取接收,這一過程造成無意義的消耗.
同時,不同于客戶端中的數(shù)據(jù)接收,在服務(wù)器中,數(shù)據(jù)的接收是短暫性的動作,生命周期較短.因而數(shù)據(jù)流始終都是局部變量.因此,服務(wù)器的數(shù)據(jù)接收器應(yīng)該是全局的變量,并且始終處于可接收新數(shù)據(jù)的狀態(tài).再者,因為客戶端的數(shù)據(jù)發(fā)送都是成段數(shù)據(jù)包一起發(fā)送,一旦出現(xiàn)了網(wǎng)絡(luò)延而中斷傳輸,數(shù)據(jù)包丟包將會引起很明顯的游戲卡頓現(xiàn)象.因此若不進行特別的處理,一次十幾毫秒的網(wǎng)絡(luò)延遲就會帶來數(shù)個或是數(shù)十個數(shù)據(jù)包丟失.
圖6 傳統(tǒng)的網(wǎng)絡(luò)處理
故而本文采取了提前拆解所有數(shù)據(jù)包,以字節(jié)為單位進行多次傳輸.這樣每次就算丟包,也只丟失幾個字節(jié),而不是一整個包.并且,這個過程中,加快了數(shù)據(jù)交換的進程.因為數(shù)據(jù)在平臺中以被拆解為8bits單位,因而在進入TCP協(xié)議層時,可以略過繁雜的從32bits到8bits單位的拆解過程.通過提前割裂數(shù)據(jù)來對應(yīng)高時延網(wǎng)絡(luò),進而提高了網(wǎng)絡(luò)容斷性[10].數(shù)據(jù)拆解傳輸?shù)幕舅悸啡鐖D7.
對應(yīng)上文存在的問題,需要設(shè)計一個合理的算法來完成信息的處理.前文中已提到服務(wù)器接收是一個全局的行為,接收一次數(shù)據(jù)是一個極為短暫的行為,因為每次接收的數(shù)據(jù)僅僅只有8bits.如果每次都聲明一個新的接收器對象,然后把數(shù)據(jù)包賦值給接收器,這期間的構(gòu)造和析構(gòu)成本就太大了.
因而本文提出以下解決方法:不予接收器賦值,而是讓接收器內(nèi)只存放一個函數(shù)指針.每次接收數(shù)據(jù)時,數(shù)據(jù)的緩沖將會在函數(shù)指針指向的函數(shù)中完成.然后對該函數(shù)再封裝一層,并在封裝層中進行函數(shù)的回調(diào).這樣就可以避免了不斷對一個遠大于8bits的接收器進行構(gòu)造和析構(gòu).最后,再將這一過程進行模板化,使接收器可以接受其他各種類型的數(shù)據(jù).
圖7 對網(wǎng)絡(luò)延遲的特殊處理
出于提高效率的目的,本文采用了回調(diào)而不使用遞歸.如果使用遞歸,可以有效的利用運行棧[11],通常認為這是高效的做法,其實不盡然.因為這期間的數(shù)據(jù)接收,接收次數(shù)不可知.從理論上而言,只要電源不斷、數(shù)據(jù)包足夠大,服務(wù)器將為接受一個數(shù)據(jù)包,而不斷地接受它的每一個8bits.這可能導致二叉樹的深度永遠無法測量[12],這個問題很致命,意味著需求的內(nèi)存將永遠無法被估測.據(jù)此,本文使用回調(diào)代替遞歸,回調(diào)信息處理關(guān)鍵代碼如下:
(1)定義模板用于導入數(shù)據(jù)包,定義與回調(diào)相關(guān)的函數(shù)指針.
(2)重載所需的運算符,滿足模板對象參與計算時的需求.
(3)通過模板中傳入的對象 Holder,找到 Holder中的函數(shù)指針Callback.
(4)調(diào)用異步接收函數(shù)對Callback進行調(diào)用,然后進入Callback的回調(diào)接收數(shù)據(jù).
本文采用上述的設(shè)計策略和關(guān)鍵技術(shù),實現(xiàn)了基于VisualStudio與C++的MMORPG游戲服務(wù)器的開發(fā).服務(wù)器運行狀態(tài)如圖8所示,當玩家登錄、登出時,服務(wù)器對其進行標記,方便服務(wù)器管理員實時觀測當前服務(wù)器運行狀態(tài).以攻擊狀況為例,當攻擊成功時則產(chǎn)生攻擊特效如圖9所示,若玩家因為面朝方向錯誤時進行攻擊,則服務(wù)器如圖8標記該玩家攻擊失敗的信息.
圖8 網(wǎng)絡(luò)游戲服務(wù)器實現(xiàn)
同時,本設(shè)計引用第三方數(shù)據(jù)庫SQLite3,建立賬號對應(yīng)的數(shù)據(jù)庫.服務(wù)器則以數(shù)據(jù)庫中SQL表為依據(jù),記錄賬號對應(yīng)的角色屬性、道具、任務(wù)狀況等個人信息,并在服務(wù)器運行期,以同步幀10為間隔不斷更新數(shù)據(jù)表內(nèi)容.服務(wù)器管理員可以通過第三方軟件SQLiteStudio直接對數(shù)據(jù)庫內(nèi)容進行操作,數(shù)據(jù)庫操作如圖10所示.
圖9 玩家正確攻擊時的特效
圖10 通過 SQLiteStudio 管理數(shù)據(jù)庫
本設(shè)計采取了模板化回調(diào)設(shè)計策略,對傳統(tǒng)網(wǎng)絡(luò)游戲服務(wù)器進行優(yōu)化,服務(wù)器優(yōu)化前后的效能比較如表1所示.從表中可以得出,使用該優(yōu)化策略有效的降低了客戶端運行期的網(wǎng)絡(luò)延遲.同時該策略對于服務(wù)器運行期的數(shù)據(jù)丟包率也具有一定的優(yōu)化作用.在降低了延遲和丟包率的基礎(chǔ)上,該策略對于服務(wù)器運行時的數(shù)據(jù)交互速度并未產(chǎn)生影響.
本文基于VisualStudio與C++,研究經(jīng)典網(wǎng)絡(luò)人物扮演游戲服務(wù)器的設(shè)計與開發(fā).主要研究了通過提高服務(wù)器程序工作效率來提升網(wǎng)絡(luò)服務(wù)質(zhì)量,從而使玩家獲得更好的游戲體驗.在服務(wù)器基本架構(gòu)完成的基礎(chǔ)上,通過“模板化信息回調(diào)處理”策略使網(wǎng)絡(luò)延遲率下降,提高了網(wǎng)絡(luò)服務(wù)質(zhì)量.
表1 服務(wù)器優(yōu)化前后效能
1崔勇,吳建平,徐恪,等.互聯(lián)網(wǎng)絡(luò)服務(wù)質(zhì)量路由算法研究綜述.軟件學報,2002,13(11):2065–2075.[doi:10.13328/j.cnki.jos.2002.11.002]
2羅赟騫,夏靖波,智英建,等.采用策略的 IP 網(wǎng)絡(luò)運行質(zhì)量評估方法實現(xiàn).小型微型計算機系統(tǒng),2011,32(1):112–116.
3王瑞彪,李鳳岐,施玉勛,等.基于 IOCP 機制的網(wǎng)絡(luò)游戲服務(wù)器通信層的實現(xiàn).計算機工程與應(yīng)用,2009,45(7):75–78,81.
4林泊,周明輝,劉天成,等.一個 J2EE 應(yīng)用服務(wù)器的 Web容器集成框架.軟件學報,2006,17(5):1195–1203.
5林培杰,朱安南,程樹英.Android 數(shù)據(jù)庫 SQLite 性能優(yōu)化.計算機系統(tǒng)應(yīng)用,2014,23(4):193–196.
6王玉亭,孫劍.應(yīng)用程序框架中對象動態(tài)創(chuàng)建和RTTI機制的實現(xiàn).計算機與現(xiàn)代化,2007,(8):50–52.
7何洪輝,劉驥宇.RTTI機制淺析.計算機與現(xiàn)代化,2010,(8):120–123.
9邱航,何明耘,陳雷霆.網(wǎng)絡(luò)游戲引擎中同步技術(shù)研究綜述.計算機應(yīng)用研究,2007,24(1):14–17.
10張龍,周賢偉,王建萍,等.容遲與容斷網(wǎng)絡(luò)中的路由協(xié)議.軟件學報,2010,21(10):2554–2572.
11谷曉銘,霍瑋,桂劍,等.一種檢測運行棧與靜態(tài)數(shù)據(jù)區(qū)重疊的新方法.計算機工程與應(yīng)用,2006,42(20):86–88,112.[doi:10.3321/j.issn:1002-8331.2006.20.027]
12王敏,趙曉雷.基于遍歷搜索二叉樹中最長路徑的算法研究.現(xiàn)代電子技術(shù),2010,33(8):54–55,58.
Development of Multiplaying Online Game Server
WU Jing-Jing,DAI Zhi-Chao
(College of Mathematics and Computer Science,Quanzhou Normal University,Quanzhou 362000,China)(Fujian Provincial Key Laboratory of Data Intensive Computing,Quanzhou 362000,China)(Key Laboratory of Intelligent Computing and Information Processing,Fujian Province University,Quanzhou 362000,China)
Nowadays,the run-time performance of server becomes a crucial factor for online games.To solve the problem,this paper proposes a new method,which uses the callback strategy based on templates,to improve the run-time performance of game-server.Based on Visual Studio and C++,the key technology and strategy during the erection of server are researched.In the article,the server is divided into 4 parts:database,account server,network and map.The experimental result shows that the delay in server session reduces obviously by using the callback strategy based on templates.Through this experiment,it is proved that the key technology proposed can be used in VR environments,game development and many other fields and has practical value.
server efficiency; multiplaying-online-game; callback designing based on templates; high-quality network
10.13328/j.cnki.jos.1996.03.001]
吳晶晶,戴智超.多人在線網(wǎng)絡(luò)游戲服務(wù)器的設(shè)計與開發(fā).計算機系統(tǒng)應(yīng)用,2017,26(10):264–269.http://www.c-s-a.org.cn/1003-3254/6005.html
福建省科技廳自然科學基金面上項目(2017J01776); 福建省省屬高??蒲袑m楉椖?JK2015037); 泉州師范學院青年博士預(yù)研基金項目(2015QBKJ02); 泉州師范學院博士科研啟動項目(G17003)
2017-01-24; 采用時間:2017-02-20