發(fā)布時間:2023-11-29 16:05:07 瀏覽量:106次

隨著游戲市場的興起,特別是網(wǎng)頁游戲、手機游戲的崛起,對游戲開發(fā)技術的需求越來越多。網(wǎng)絡游戲開發(fā)是一個龐大的體系,總體來說是客戶端與服務器端??蛻舳耸峭婕医佑|的游戲圖像顯示端,服務器是處理游戲運行中的各種數(shù)據(jù),由于一臺服務器要支持眾多玩家的請求,所以服務器的性能高低決定了同一個游戲的用戶數(shù)量。
我們公司選擇使用Java做服務器開發(fā)語言,主要原因是:1.Java是跨平臺的,方便部署;2.Java是安全的高級語言,可以提高開發(fā)效率;3.Java是面向對象的,代碼可以重用;4.Java的分布式應用。
圖1 服務器架構圖
服務器架構
Java在我們的服務器開發(fā)中的應用。服務器架構如圖1所示。服務器架構的幾個模塊:
這些模塊都是分開的,可以靈活地分布式部署到不同的物理服務器上。只需要修改一些配置文件即可,非常方便。
服務器詳細功能模塊
登錄服務器
負責處理玩家登錄的請求。一個登錄服務器對應多個游戲邏輯分區(qū)。當玩家登錄的時候,登錄服務器向用戶中心服務器發(fā)送登錄信息。請求對登錄信息的驗證。通過驗證之后,返回分區(qū)地址,之后,客戶端與登錄服務器斷開,連接到游戲邏輯服務器。登錄服務器是一個單獨的Java運行程序,當訪問量增加大,可以增加部署到多個物理服務器上面,均衡負載訪問壓力。它通過使用Java的NIO(非阻塞)方式與客戶端進行通信。通過用戶中心服務器提供的接口訪問用戶中心,進行數(shù)據(jù)處理。
邏輯服務器
對玩家的操作進行邏輯處理。邏輯服務器是整個游戲的心臟。它的工作效率直接影響玩家在游戲中的體驗,所以對它的要求就是速度,快速返回處理結果。為了達到滿足要求的速度,邏輯服務器的大部分操作必須在內存中操作,避免I/O操作,I/O操作可以放到另外的線程中進行。說是大部分,是因為玩家在第一次登錄的時候可能會從數(shù)據(jù)庫加載所要用到的數(shù)據(jù)。在圖中,大家看到了緩存,緩存的作用就是把數(shù)據(jù)放在內存中。當玩家退出時,它的數(shù)據(jù)也會在緩存中保存一段時間,在一定時間內,玩家再次登錄,將不會再重新從數(shù)據(jù)庫加載數(shù)據(jù)。在邏輯服務器中對數(shù)據(jù)庫的操作可以先放入一個Java隊列中,再另起一個Java線程負責從這個隊列取數(shù)據(jù),并發(fā)送到數(shù)據(jù)庫服務器,這就是使用Java的阻塞隊列,快速實現(xiàn)一個生產(chǎn)者—消費者模式,數(shù)據(jù)生產(chǎn)與處理相分離,這樣既減輕了邏輯服務器的壓力,也保證了數(shù)據(jù)處理的效率。邏輯服務器的日志也不在邏輯服務器入庫,同樣的發(fā)送到日志服務器處理。還有一種方法是以一種特定格式的方式,記錄到本地文件中,再啟動一個進程,讀取這個文件,然后入庫。
用戶中心服務器
現(xiàn)在很多游戲都對用戶進行了集中管理。這方便了對用戶提供更好的服務,比如充值、活動、禮包領取、新游戲導入用戶等。有的游戲公司可能會用用戶中心的數(shù)據(jù)發(fā)展游戲運營平臺。這部分與游戲邏輯服務器分開,也減少了游戲邏輯服務器的壓力。用戶中心采用JavaWeb開發(fā),它對游戲服務器只提供特定訪問的接口,把數(shù)據(jù)與邏輯分離開來,方便管理,以及分布式部署,增強了架構的靈活性。
充值服務器
充值是游戲收入的唯一方式,所以這個功能必須流暢,毫無壓力。如果由于網(wǎng)絡或服務器性能原因,導致玩家充值不了,會直接影響收益的。所以充值服務器最好部署在一臺單獨的物理機上面,也可以多個分區(qū)使用一個充值服務器,這要視游戲人數(shù)而定。
數(shù)據(jù)庫服務器
負責對數(shù)據(jù)入庫及更新的操作。把這部分操作從邏輯服務器分離出來,就是為了減輕邏輯服務器的壓力,減少邏輯服務器資源的占用。而且,如果邏輯服務器突然宕機的話,也能盡量保證數(shù)據(jù)少丟失。為了保證對數(shù)據(jù)的更新是順序性的,這里把數(shù)據(jù)入庫的操作使用隊列單線程化。邏輯服務器與數(shù)據(jù)庫服務器通過Java的TCP/IPSocket進行長連接,而且為了防止由于意外原因導致連接中斷,在邏輯服務器與數(shù)據(jù)庫服務器之間加入了一個心跳連接,這樣短暫的中斷可以被很快恢復,防止數(shù)據(jù)的丟失。
日志服務器

處理玩家日志的入庫。日志入庫方便游戲運營管理游戲,統(tǒng)計玩家信息。當玩家人數(shù)比較多的時候,日志也會占用很多資源。所以把日志從邏輯服務器也分開了,因為日志只是插入操作,所以可以開幾個線程進行并發(fā)插入到數(shù)據(jù)庫。線程數(shù)要根據(jù)你數(shù)據(jù)庫的連接池的最大連接數(shù)進行設置,要不然會導致連接資源被占完,數(shù)據(jù)插入不了數(shù)據(jù)庫。
注意事項
在游戲服務器開發(fā)中,有幾個需要注意的問題。
通信協(xié)議
開始的時候,我們?yōu)榱丝焖匍_發(fā),采用了JSON的變長協(xié)議處理方式,即把要傳送的數(shù)據(jù)編碼成json的字符串,再把json字符串轉化為字節(jié)數(shù)據(jù),傳輸過程中包的總結構為:總包長度(int四個字節(jié))+消息長度(int四個字節(jié))+消息體,即數(shù)據(jù)長度,n個字節(jié)。這樣做的好處是可以快速開發(fā),缺點是在傳輸過程中無效的字節(jié)太多。而且這部分完全可以用代碼自動完成。后來我們采用Java的反射機制,從定義好的xml描述協(xié)議文件中讀取傳輸?shù)膬热莞袷?,自動化生成傳輸?shù)膶ο?,在發(fā)送信息時,根據(jù)這個對象再把數(shù)據(jù)轉化為二進制的數(shù)據(jù)流,解析的時候,同樣也根據(jù)xml的描述文件,按順序讀取數(shù)據(jù)并轉化為對象的JavaBean對象。如果時間充足,在游戲開發(fā)前期應該把這個做好。
多線程并發(fā)
游戲服務器是一個多用戶的環(huán)境,其中多線程是必不可少的,它可以提交程序對CPU的利用率,提高處理性能。但它也有一個致命的缺點,就是在多線程下,數(shù)據(jù)同步的問題。因為在目前多核CPU下,線程算得上是可以并行執(zhí)行的了。比如競技場中的排行榜,每個玩家的名次變化都會對排行榜進行操作。如果不考慮數(shù)據(jù)同步的話,每個玩家可以隨意更新排行榜,那這個排行榜的數(shù)據(jù)就會非常亂,名次也不正確。這個時間就需要保證在一個玩家更新排行的時候,其他玩家不能更新,只能阻塞等待。一般有兩種方法可以解決:1.直接使用鎖,當一個玩家更新排行榜時,使用鎖鎖定排行榜集合,讓其他玩家不能再對排行榜操作,Java有自帶的兩種方式,非常方便,一個是Lock接口,一個是Synchronized;2.使用樂觀同步,這種方式需要自己額外實現(xiàn),之所以說是樂觀,是因為它有可能執(zhí)行失敗。原理是當我取數(shù)據(jù)時,獲得一個數(shù)據(jù)的一個版本號,而當寫入數(shù)據(jù)時,如果版本一致,可寫入,如果版本不一致,就需要重新獲取數(shù)據(jù),執(zhí)行邏輯,直到版本一致后寫入。可以設定重復次數(shù),達到這個次數(shù)后,還沒有成功就判定失敗。根據(jù)我們目前的運行環(huán)境,我們采用了第一種方式。
均衡負載
一臺物理服務器的處理能力是有限的,對于可能支持數(shù)據(jù)眾多的游戲服務器來說,分布式部署和動態(tài)添加服務器是不可缺少的。在邏輯上,可以把需要集中處理,與邏輯運算關系不大的模塊單獨部署。比如登錄服務器、地圖服務器、聊天服務器、數(shù)據(jù)庫服務器等。像我們把登錄服務器和數(shù)據(jù)庫服務器分離開就是為了減少邏輯服務器的壓力。
緩存的設計
起初,為了快速敏捷開發(fā),我們采用了一級緩存方式,即圖1中的Redis緩存,它是一個分布式的緩存,內部通過Socket連接。在玩家第一次進入游戲的時候會把玩家數(shù)據(jù)從數(shù)據(jù)庫加載到Redis緩存之中,再取數(shù)據(jù)只從緩存中取。后來為了更加提高處理速度,增加了二級緩存,即內存緩存,利用Java提供的Map、List等集合保存數(shù)據(jù),開發(fā)了一個基于內存的緩存構架MemoryCacheTool,對外只提供操作接口。由于是直接從內存中讀取或寫入數(shù)據(jù),其速度相對于Redis提高大約20%左右。
總結
Java是一門安全、高效、跨平臺的語言,它在游戲服務器開發(fā)過程中可以提高開發(fā)效率,減少異常,增強程序的健壯性。它很容易實現(xiàn)各個功能的銜接,方便后期的維護。
王廣帥
作者簡介:王廣帥,網(wǎng)名wgslucky,2011年畢業(yè)開始參加工作,一直從事于游戲服務器的開發(fā)工作?,F(xiàn)任北京觸云科技有限公司服務器端技術主程,是一名技術狂,熱愛讀書,喜歡挑戰(zhàn),熱衷與技術同道分享交流游戲開發(fā)方面的技術。
本文選自程序員電子版2015年5月B刊,該期更多文章請查看這里。2000年創(chuàng)刊至今所有文章目錄請查看程序員封面秀。歡迎訂閱程序員電子版(含iPad版、Android版、PDF版)。

熱門資訊
探討游戲引擎的文章,介紹了10款游戲引擎及其代表作品,涵蓋了RAGE Engine、Naughty Dog Game Engine、The Dead Engine、Cry Engine、Avalanche Engine、Anvil Engine、IW Engine、Frostbite Engine、Creation引擎、Unreal Engine等引擎。借此分析引出了游戲設計領域和數(shù)字藝術教育的重要性,歡迎點擊咨詢報名。
2. 手機游戲如何開發(fā)(如何制作傳奇手游,都需要準備些什么?)
?如何制作傳奇手游,都需要準備些什么?提到傳奇手游相信大家都不陌生,他是許多80、90后的回憶;從起初的端游到現(xiàn)在的手游,說明時代在進步游戲在更新,更趨于方便化移動化。而如果我們想要制作一款傳奇手游的
3. B站視頻剪輯軟件「必剪」:免費、炫酷特效,小白必備工具
B站視頻剪輯軟件「必剪」,完全免費、一鍵制作炫酷特效,適合新手小白??靵碓囋?!
?三昧動漫對于著名ARPG游戲《巫師》系列,最近CD Projekt 的高層回應并不會推出《巫師4》。因為《巫師》系列在策劃的時候一直定位在“三部曲”的故事框架,所以在游戲的出品上不可能出現(xiàn)《巫師4》
游戲中玩家將面臨武俠人生的掙扎抉擇,戰(zhàn)或降?殺或放?每個抉定都將觸發(fā)更多愛恨糾葛的精彩奇遇?!短烀嬗肪哂卸嗑€劇情多結局,不限主線發(fā)展,高自由...
6. 3D動畫軟件你知道幾個?3ds Max、Blender、Maya、Houdini大比拼
當提到3D動畫軟件或動畫工具時,指的是數(shù)字內容創(chuàng)建工具。它是用于造型、建模以及繪制3D美術動畫的軟件程序。但是,在3D動畫軟件中還包含了其他類型的...
想讓你的3D打印模型更堅固?不妨嘗試一下Cura參數(shù)設置和設計技巧,讓你輕松掌握!
8. 虛幻引擎5節(jié)省存儲空間用這招!緩存的清理與設置
眾所周知,虛幻引擎5(下面簡稱UE5)特別占用存儲空間,僅一個版本安裝好的文件就有60G,這還不包括我們在使用時保存的工程文件和隨之產(chǎn)生的緩存文件。而...
9. Bigtime加密游戲經(jīng)濟體系揭秘,不同玩家角色的經(jīng)濟活動
Bigtime加密游戲經(jīng)濟模型分析,探討游戲經(jīng)濟特點,幫助玩家更全面了解這款GameFi產(chǎn)品。
10. 3D動漫建模全過程,不是一般人能學的會的,會的多不是人?
步驟01:面部,頸部,身體在一起這次我不準備設計圖片,我從雕刻進入。這一次,它將是一種純粹關注建模而非整體繪畫的形式。像往常一樣,我從Sphere創(chuàng)建它...
最新文章
同學您好!