游戲服務器開發的基本體系

2016-03-24

  近年來,我身邊的朋友有很多都從web轉向了游戲開發。他們以前都沒有做過游戲服務器開發,更談不上什么經驗,而從網上找的例子或游戲方面的知識,又是那么的少,那么的零散。當他們進入游戲公司時,顯得一臉茫然。如果是大公司還好點,起碼有人帶帶,能學點經驗,但是有些人是直接進入了小公司,甚至這些小公司只有他一個后臺。他們一肩扛起了公司的游戲后端的研發,也扛起了公司的成敗。他們也非常盡力,他們也想把游戲的后端做好。可是就是因為沒什么經驗,剛開始時以為做游戲服務器和做web差不多,但是經過一段時間之后,才發現代碼太多,太亂了,一看代碼都想重構,都是踩著坑往前走。這里我把一些游戲開發方面的東西整理一下,希望能對那些想做游戲服務器開發的朋友有所幫助。

  首先,要明確一點,做游戲服務器開發和做傳統的web開發有著本質的區別。游戲服務器開發,如果沒有經驗,一開始根本沒有一個明確清析的目標,不像web那樣,有些明確的MVC架構,往往就是為了盡快滿足策劃的需求,盡快的實現功能,盡快能讓游戲跑起來。但是隨著功能越來越多,在老代碼上面修改的越來越頻繁,游戲測試時暴露出來的一堆bug,更讓人覺得束手無策,這個時候我們想到了重構,想到了架構的設計。

  游戲的構架設計非常重要,好的構架代碼清析,責任明確,擴展性強,易調試。這些會為我們的開發省去不少時間。那要怎么樣設計游戲的構架呢?可能每個游戲都不一樣,但是本質上還是差不多的。

  對于游戲服務器的構架設計,我們首先要了解游戲的服務器構架都有什么組成的?一款游戲到上線,需要具備哪些功能?有些人可能會說,只要讓游戲跑起來,訪問服務器不出問題不就行了嗎?答案是不行的,游戲構架本身代表的是一個體系.
  一,系統初始化

  系統初始化是在沒有客戶端連接的時候,服務器啟動時所需要做的工作。基本上就是配置文件的讀取,初始化系統參數。但是我們必須要考慮的是,系統初始化需要的參數配置在哪兒,是配置在本地服務器,還是配置在數據庫,服務器啟的時候去數據庫取。配置的修改需不需要重啟服務器等。

  二,游戲邏輯

  游戲邏輯是游戲的核心功能實現,也是整個游戲的服務中心,它被開發的好壞,直接決定了游戲服務器在運行中的性能。那在游戲邏輯的開發中我們要注意些什么呢?

  (1)網絡通信

  游戲是一種網絡交互比較強的業務,好的底層通信,可以最大化游戲的性能,增加單臺服務器處理的同時在線人數,給游戲帶來更好的體驗,至少不容易出現因為網絡層導致的數據交互卡頓的現象。在這里我推薦使用Netty,它是目前最流行的NIO框架,它的用法可以在我之前的文章中查看,這里不再多說了。

  

  有人疑問,代碼也需要分層次?這個是當然了,不同的代碼,代表了不同的功能實現。現在的開發語言都是面向對象的,如果我們不加思考,不加整理的把功能代碼亂堆一起,起始看起來是快速實現了功能,但是到后期,如果要修改需求,或在原來的代碼上增加新的需求,那真是被自己打敗了。所以代碼一定要分層,主要有以下幾層:

  a,協議層,也叫前后臺交互層,它主要負責與前臺交互協議的解析和返回數據。在這一層基本上沒有什么業務邏輯實現。與前臺交互的數據都在這一層開始,也在這一層終止。比如你使用了Netty框架,那么Netty的ChannelHandlerContext即Ctx只能出現在這一層,他不能出現到游戲業務邏輯代碼的實現中,接收到客戶端的請求,在這一層把需要的參數解析出來,再把參數傳到業務邏輯方法中,業務邏輯方法處理完后,把要返回給客戶端的數據再返回到這一層,在這一層組織數據,返回給客戶端,這樣就可以把業務邏輯和網絡層分離,業務邏輯只關心業務實現,而且也方便對業務邏輯進行單元測試。

  b,業務邏輯層,這里處理真正的游戲邏輯,該計算價格計算價格,該通關的通關,該計時的計時。該保存數據的保存數據。但是這一層不直接操作緩存或數據庫,只是處理游戲邏輯計算。因為業務邏輯層是整個游戲事件的處理核心,所以他的處理是否正確直接決定游戲的正確性。所以這一層的代碼要盡量使用面向對角的方法去實現。不要出現重復代碼或相似的功能進行復制粘貼,這樣修改起來非常不方便,可能是修改了某一處,而忘記了修改另外同樣的代碼。還要考慮每個方法都是可測試的,一個方法的行數最好不要超過一百行。另外,可以多看看設計模式的書,它可以幫助我們設計出靈活,整潔的代碼。

  

  三,數據庫系統

  數據庫是存儲數據庫的核心,但是游戲數據在存儲到數據庫的時候會經過網絡和磁盤的IO,它的訪問速度相對于內存來說是很慢的。一般來說,每次訪問數據庫都要和數據庫建立連接,訪問完成之后,為了節省數據庫的連接資源,要再把連接斷開。這樣無形中又為服務器增加了開銷,在大量的數據訪問時,可能會更慢,而游戲又是要求低延時的,這時該怎么辦呢?我們想到了數據庫連接池,即把訪問數據庫的連接放到一個地方管理,用完我不斷開,用的時候去那拿,用完再放回去。這樣不用每次都建立新的連接了。但是如果要我們自己去實現一套連接池管理組件的話,需要時間不說,對技術的把控也是一個考驗,還要再經過測試等等,幸好互聯網開源的今天,有一些現成的可以使用,這里推薦Mybatis,即實現了代碼與SQL的分離,又有足夠的SQL編寫的靈活性,是一個不錯的選擇。

  四,緩存系統

  游戲中,客戶端與服務器的交互是要求低延遲的,延遲越低,用戶體驗越好。像之前說過的一樣,低延遲就是要求服務器處理業務盡量的快,客戶端一個請求過來,要在最短的時間內響應結果,最低不得超過500ms,因為加上來回的網絡傳輸耗時,基本上就是600ms-到700ms了,再長玩家就會覺得游戲卡了。如果直接從數據庫中取數據,處理完之后再存回數據庫的話,這個性能是跟不上的。在服務器,數據在內存中處理是最快的,所以我們要把一部分常用的數據提前加載到內存中,比如說游戲數據配置表,經常登陸的玩家數據等。這樣在處理業務時,就不用走數據庫了,直接從內存中取就可以了,速度更快。游戲中常見的緩存有兩種,1,直接把數據存儲在jvm或服務器內存中,2,使用第三方的緩存工具,這里推薦Redis,詳細的用法可以自己去查詢。

  五,游戲日志

  日志是個好東西呀,一個游戲中更不能少了日志,而且日志一定要記錄的詳細。它是玩家在整個游戲中的行為記錄,有了這個記錄,我們就可以分析玩家的行為,查找游戲的不足,在處理玩家在游戲中的問題時,日志也是一個良好的憑證和快速處理方式。

  在游戲中,日志分為:1,系統日志,主要記錄游戲服務器的系統情況。比如:數據庫能否正常連接,服務器是否正常啟動,數據是否正常加載;2,玩家行為日志,比如玩家發送了什么請求,得到了什么物品,消費了多少貨幣等等;3,統計日志,這種日志是對游戲中所有玩家某種行為的一種統計,根據這個統計來分析大部分玩家的行為,得出一些共性或不同之處,以方法運營做不同的活動吸引用戶消費。

  在構架設計中,日志記錄一定要做為一種強制行為,因為不強制的話,可能由于某種原因某個功能忘記加日志了,那么當這個功能出問題了,或者運營跟我們要這個功能的一些數據庫,就傻眼了。又得加需求,改代碼了。日志一定要設計一種良好的格式,日志記錄的數據要容易讀取,分解。日志行為可以用枚舉描述,在功能最后的處理方法里面加上這個枚舉做為參數,這樣不管誰在調用這個方法時,都要去加參數描述。

  俗話說,工欲善其事,必先利其器。游戲管理工具是對游戲運行中的一系列問題處理的一種工具。它不僅是給開發人員用,大多數是給運營使用。游戲上線后,我們需要針對線上的問題進行不同的處理。不可能把所有問題都讓程序員去處理吧,于是程序員們想到了一個辦法,給你們做一個工具,你們愛誰處理誰處理去吧。

  游戲管理工具是一個不斷增漲的系統,因為它很多時候是伴隨著游戲中遇到的問題而實現的。但是根據經驗,有一些功能是必須有的,比如:服務器管理,主要負責服務器的開啟,關閉,服務器配置信息,玩家信息查詢,玩家管理,比如踢人,封號;統計查詢,玩家行為日志查詢,統計查詢,次留率查詢,郵件服務,修改玩家數據等,根據游戲的不同要求,凡是可以能過工具實現的,都做到游戲管理工具里面。它是針對所有服務器的管理。一個好的,全的游戲管理工具,可以提高游戲運營中遇到問題處理的效率,為玩家提供更好的服務。

  七,公共組件

  公共組件是為游戲運行中提供公共的服務,比如,充值服務器,我們沒必須一個服用一個充值,而且你也不能對外提供多個充值服務器地址,和第三方公司對接,他們絕對不干,這是要瘋呀;還有運營搞活動時的禮包碼,還有注冊用戶的管理,玩家一個注冊賬號可以進不同的區等。這些都是針對所有區服提供的服務,所以要單獨做,與游戲邏輯分開,這樣方便管理,部署和負載均衡。還有SDK的登陸驗證,現在手游比較多,與渠道對接里要進行驗證,這往往是很多http請求,速度慢,所以這個也要拿出來單獨做,不要在游戲邏輯中去驗證,因為網絡IO的訪問時間是不可控制的,http是阻塞的請求。

  所以,綜上來看,一個游戲服務器起碼有幾個大的功能模塊組成:a,游戲邏輯工程;b,日志處理工程;c,充值工程;d,游戲管理工具工程;e,用戶登陸工程;f,公共活動工程等,根據游戲的不同需要,可能還有其它的。所在在構架的設計中,一定要考慮到系統的分布式部署,盡量把公共的功能拆出來做,這樣可以增強系統的可擴展性。


       電聯通信 國內規模最大最穩定的BGP多線機房之一,領先的IDC服務商,IDC數據中心服務商


電話

24小時熱線:

4006-371-379

咨詢電話:

0371-55056677

0371-55056699


舉報

“掃黃打非”舉報專區:


您可以通過郵箱舉報的方式向我們舉報不良信息,將舉報類型、舉報網址、舉報IP、舉報描述、違法截圖以及您的聯系方式等信息發送至我們的郵箱:

support@htuidc.com

曰本做爰免费视频