1. 程式人生 > ><轉載>遊戲伺服器開發都要學什麼?

<轉載>遊戲伺服器開發都要學什麼?

2018年3月3日

近來遇到有很多人想從其它開發領域轉到遊戲伺服器開發行業上來,他們或許覺得遊戲伺服器開發工資高,或許覺得做遊戲伺服器需要掌握的技術更高階,可以鍛鍊自己,或許覺得想換個環境等等。不管出於什麼原因吧,做為一名幾年的遊戲伺服器開發者,當然是持歡迎態度的,那麼我就先介紹一下游戲伺服器開發的工作吧,遊戲伺服器開發具體要做哪些工作呢?

1,團隊溝通

基本上不管做什麼開發,都是一個團隊來完成的,遊戲也是如此,遊戲團隊一般由老闆,總經理,CTO(技術主管),主策劃(領導一些人,包括數值策劃,系統策劃,特效策劃),主美(領導一些人,包括原畫,UI設計,特效動作設計),客戶端主程(領導一些人,客戶端程式設計師,客戶端程式設計師

...,伺服器主程(領導一些人,包括伺服器程式設計師,伺服器程式設計師),外加運維。而遊戲的大部分邏輯實現與邏輯資料驗證都會放在伺服器端,所以服務端程式需要明確瞭解策劃的需求,要了解就需要溝通,溝通方式的正確與否,直接關係到功能的實現是否正確,由於遊戲邏輯的複雜性,單純的文件描述可能不會非常完整,不像其它行業需求文件就幾百頁,詳細的圖文並茂,制定好之後也很少變化。所以做為一名遊戲程式設計師,一定要有良好的溝通方式和技巧。

2,架構設計

這個架構設計就像蓋房子打基礎,基礎好,房子就穩固,基礎不好,房子高了就容易倒。架構設計需要結合軟體工程學來搞,它需要對伺服器的整個流程有足夠的瞭解,對需求的變化有足夠的認識。架構的設計一般有幾個特性。

首先是易用性,架構一旦完成,在開發的時候就要方便使用,比如網路通訊架構,設計好之後,其他開發者就不需要關心客戶端的資料是怎麼被傳輸到伺服器端的,這個時候對於伺服器開發者來說,只需要實現一些簡單的介面,就可以直接對客戶端傳送來的請求進行處理操作。再比如說伺服器端資料的儲存與更新,開發者只需要寫少量SQL語句或基本不用寫,都由架構的底層程式碼完成,開發者只需要呼叫封裝好的API,就可以把資料存入資料庫而不用關心資料的最終流向,只需要關心實現邏輯就可以了。

第二,可擴充套件性,可擴充套件性包括兩個方面,一是程式碼的可擴充套件性,比如說遊戲中的任務處理吧,一個遊戲中任務可能有幾十種,而且還可能不定時的增加,為了判斷不同的任務型別該執行什麼操作,最簡單也是最差的寫法是

if else,想象一下,一個方法裡面,有幾十個if else,這簡單是bug的理想誕生地呀。一種可行的做法是使用責任鏈模式(具體的請參考設計模式的實現),這樣每種任務都有一個單獨的類去處理它,而不會影響其它的類,符合開閉原則,相互關聯少,越少越不容易出bug。二是部署的可擴充套件性,比如,如果線上人數突然增加或預期可能要增加,一臺物理機器可能處理不過來這麼多的請求,那怎麼辦?那就需要支援在不影響其它伺服器執行的情況下,可以動態的新增機器。而當壓力降低之後,又可以移除某些機器,合理利用資源。

第三,高吞吐量,這個是指能儘量最大化的利用計算機固定的資源,去處理更多的請求,更快速的響應客戶端。這就需要在伺服器架構設計的時候考慮非同步處理,減少IO等待時間(比如請求redis,儲存資料庫,和其它伺服器通訊)以及資料快取。說到非同步,一定會涉及到多執行緒,併發等相關的技術,所以架構設計的時候需要對這部分知識有足夠的瞭解。

第四,要考慮是否所有的功能模組都放在同一個程序中。也就是需不需要分散式開發,哪些功能需要單獨拿出來。對於手機遊戲來說,一般要求同時線上量比較小,功能比較單一,所有功能都在一個程序中,人數大量同時線上時,可以多部署幾組程序。而對於大型網頁遊戲或客戶端遊戲來說,特別是有些大區或不分割槽的情況,單個功能訪問量大,伺服器就要考慮分散式部署開發了。

架構設計一般需要有經驗的開發者(專案主程)去搭建,新手可以做為了解,在接觸到專案之後,可以按這個思路去理解專案的架構是怎麼樣構成的,如果讓自己來做,能否模仿出來,有時間可以自己嘗試去獨立設計架構,鍛鍊自己的能力,有一天你是會實際去做的。

3,邏輯開發

架構搭建完成之後,緊接著就是遊戲伺服器的邏輯開發,這時才開始真正去實現遊戲需要的內容,比如註冊,登陸,任務,活動,揹包,組隊戰鬥等。由於遊戲邏輯可能需要的判斷條件多,組合變化多,所以在遊戲邏輯開發過程中,你會慢慢發現面向物件的重要性。邏輯開發是一個任重而道遠的過程,同一個問題,可能有很多種實現方式,不同的實現方式對效率和吞吐量有很大的影響,所以就需要對需求功能的理解要深入,不同功能之間的關聯要明確。對常用的設計模式要知道如何使用。比如像上面說的替換數量比較多的if else的方式。邏輯開發需要謹慎細心,而且一定要自己測試才可以,不然bug在不知不覺中就產生了。

4,系統周邊開發

一個遊戲成功的運營,需要很多服務去支援它,比如sdk接入,充值接入,日誌統計,遊戲執行管理系統(一般叫後臺管理系統,是內部人員為了管理遊戲的而開發的系統)。比如修改某個使用者的等級,封號等。管理系統一般會用web開發,與遊戲伺服器通訊。

二,遊戲型別與技術選擇

遊戲伺服器開發使用的技術取決於遊戲的型別,不同的遊戲型別,需要的遊戲環境不一樣,所使用的技術也不一樣。但是在本質上都是一樣的,都是面對資料,處理資料,不同的是面對的數量大小而已。http://www.youxijishu.com

1PC類端遊

這類遊戲線上人數龐大,遊戲中要處理的資料也非常龐大。所以對伺服器效能要求非常高,一般都是採用C++做為開發語言,C++可以直接操作記憶體資料,與作業系統直接互動,減少資料之間的複製,它執行效率高,處理速度快,是這類遊戲開發的首選開發語言。伺服器端採用分散式架構,把不同的模組分散在多臺物理機上處理。需要學習的大致有C++程式設計,Linux網路程式設計、TCP/IP通訊協議、多執行緒程式設計再加資料庫。它一般開發週期比較長,一個遊戲的上線基本上需要三到五年。

2,網頁遊戲

這類遊戲相對於端游來說,開發週期短,因為是網頁遊戲,遊戲的介面展示依賴於網路傳輸,所在在畫面和特效上會次於客戶端遊戲很多。遊戲的特點主要集中在遊戲的玩法上。但是對於伺服器端來說,和端遊類是差不多是一樣的,有些公司之前是做端遊的,他們就直接把端遊的伺服器架構拿來就可以使用,以完成快速開發。

3手機遊戲

手機類遊戲目前是最火最熱門的遊戲,因為他的使用者量大,使用者佔有時間長。但是手機遊戲大多數是一般小遊戲,功能簡單,玩法單一,一般都是休閒娛樂的。現在也有一些稍微大型的MORPG遊戲。所以手機遊戲開發週期更短,上線更快。

目前,遊戲市場競爭激烈,當前伺服器主流的開發語言是C++Java,但是C++學習難度大,開發速度慢。為了滿足遊戲伺服器快速開發,快速上線,所以一般來說我們都是使用Java語言來開發伺服器。近年來,隨著遊戲市場的發展,遊戲伺服器開發技術因Java而生成了一套體系。可以供開發者選擇。

三,使用Java開發伺服器需要學習什麼

Java語言,由於學習成本低,開發速度快,穩定性高,開源框架多,目前已成為網頁遊戲和手機遊戲伺服器開發的主要語言。咱們從系統的開發流程簡單梳理一下伺服器開發需要用到的技術。

1,網路通訊

這個是首要實現的,如果沒有網路通訊,就沒有伺服器存在的必要了。網路通訊就需要建立網路連線。目前網路通訊有兩種方式,一種是短連線,比如http,一種是長連線,比如socket,當然http也是基於socket的,socket是通訊的基礎。所以要對tcp/ip通訊的知識有所瞭解,明白通訊的原理。基於這兩種網路通訊,遊戲伺服器也分為兩種,弱聯網和強聯網。弱聯網的遊戲一般是指一些小型的遊戲,比如開心消消樂,連連看,以及一些卡牌養成類遊戲,這類遊戲一般幾秒鐘或幾分鐘再會與伺服器同步一次資料,一般會使用短連線。而像一些arpg遊戲,實時戰鬥類遊戲,以及帶同屏顯示玩家的遊戲,這類遊戲與伺服器互動資訊頻繁,一秒鐘可能幾十次,會採用長連線,避免每次連線重新建立消耗系統資源,提高通訊效率。

為了網路通訊的效率,伺服器要使用NIO(非阻塞網路通訊)通訊。它能支援大併發連線。Java NIO是多路複用IO,在多路複用IO模型中,會有一個執行緒不斷去輪詢多個socket的狀態,只有當socket真正有讀寫事件時,才真正呼叫實際的IO讀寫操作。因為在多路複用IO模型中,只需要使用一個執行緒就可以管理多個socket,系統不需要建立新的程序或者執行緒,也不必維護這些執行緒和程序,並且只有在真正有socket讀寫事件進行時,才會使用IO資源,所以它大大減少了資源佔用。目前基於此技術有很多開源框架,最常用的有兩種,NettyMina

所以在網路通訊這一塊,如果是弱聯網遊戲,可以使用web那一套來開發遊戲伺服器,需要學習的技術一般有http原理,Json格式協議,servletTomcat(也可以是其它web容器),spring等。如果是強聯網遊戲,要學習的技術有NettyMina可以選擇一種,多執行緒以及執行緒池的應用。這是網路通訊所必須掌握的。只要能把客戶端傳送的資訊接收到,並解析成程式碼使用的明文,就是成功了一半了,剩下的事就是把程式碼封裝好,方便邏輯開發呼叫!

通訊這塊還要考慮訊息的併發,長連線情況下,怎麼處理斷包,粘包問題,每個使用者的訊息處理的是不是有序的,如果有序會不會阻塞訊息,如果無序會不會造成處理混亂,比如後到的訊息先處理了,這些問題都要處理好,目前一般是保證同一個使用者的訊息要有序處理!

2,資料儲存

網路通訊除錯好之後,不要急著做邏輯開發,還需要把資料如何儲存理清楚!因為伺服器端操作的全是資料,如果處理的不好,容易出bug,丟資料,這對遊戲玩家來說是致命的,不可接受的!資料儲存要考慮,一,資料如何存到資料庫,是同步儲存,還是非同步儲存!同步儲存即將數操作完之後立刻寫入資料庫,非同步操作即資料操作完之後先儲存到記憶體快取,然後由另外的執行緒或程序再同步到資料庫!遊戲中一般都是採用的非同步儲存方式,因為遊戲併發量大,必須低延時,快速響應客戶端!如果直接操作資料庫太慢,會造成訊息阻塞!記憶體快取可先擇的框架有redismemcache,具體怎麼同步到資料庫,需要自己去設計了!二,資料介面如何設計,能不能用工作生成這些資料操作的程式碼,能不能不用寫SQL語句,需是封裝在底層,或由工具生成。程式設計是門藝術,在這就體現出來了,當然是仁者見仁,智者見智了!三,大併發情況下資料的一致性,像這類可能多執行緒操作的資料,一般是放在記憶體中,由鎖來控制併發!所以對鎖的使用要熟悉,不要出現死鎖,或鎖粒度過大,造成執行緒的長時間等待的情況!四,當資料量太大,一個數據庫儲存不了,資料該怎麼分庫分表!一種是水平劃分,一種是垂直劃分!具體的劃分方式其它資料已有詳細介紹,請自行查詢閱讀!目前有一個開源的分庫框架mycat,是用JAVA寫的,大家可以研究一下!

3,邏輯開發

邏輯開發就是實現遊戲策劃想象的各種遊戲功能,比如,登入,物品使用,戰鬥結算等!邏輯開發程式碼量巨大,相互之間有很緊密的耦合性,所以每個功能模組一定要劃分好!最好是接觸下單元測試,寫之前考慮一下是否方便單元測試,這樣設計的程式碼會更加清晰,每個方法責任明確,不容易出bug!正是因為邏輯程式碼複雜,為了更好的管理程式碼,前輩們給我們總結了一些經驗,就是著名的設計模式,所以學習一下設計模式對程式碼的管理有很大的好處!

邏輯開發一般遇到的問題有:

3.1,資料同步

一說到資料同步或資源共享的時候,一般都會考慮到鎖的使用。因為一份資源同時只能被一個執行緒訪問才是安全的。JavaJDK中提供了一些鎖,比如:synchronized,以及java.util.concurrent.lock包中的Lock物件,java.util.concurrent包中還提供了其它的一些原子操作的類,我們知道i++操作不是執行緒安全的,但是可以使用AtomicInteger中的getAndIncrement();方法代替,還有執行緒安全的ConcurrentHashMap哈稀Map。以及阻塞佇列LinkedBlockingQueue等。都是邏輯開發中常用的處理資料同步的類。

3.2,設計模式的使用

使用設計模式,可以讓程式碼更加清晰,可擴充套件性更強,維護性更佳,比如,任務系統,任務會有很多種型別,要獲得任務資料時,在一開始寫這個系統的時候,我是這樣寫的if(type == 1)做什麼,else if(type == 2)做什麼,else if(type == 3)......else if(type == 35) else等。如果需要新增新的型別,又要新增else,這些if else都在同一個方法中。最後都不敢動一塊,就怕出bug。其實當一個方法中出現三個以上的if else將來還可能增加時,就應當考慮設計是不是有問題了,後來改成責任鏈模式或狀態模式,就解決了這個問題。還有一個例子是,當一個值變化,要影響多個任務完成狀態時,可以使用觀察者模式或監聽模式或訂閱模式去實現,這樣功能之間完全解耦,出問題的機率會很小很小。

3.3,資料快取框架的API使用

目前主流使用的資料快取框架有redismemcache,雖然在邏輯開發前,主程會對這些進行一些封裝,但是作為使用者還是需要對這些框架的客戶端的使用要有所瞭解的。這些可以去閱讀相關的文件。不是太難。

4,程式部署與執行

目前,大多數Java專案都採用maven管理 ,可以使用maven打包開發好的程式,程式一般執行在遠端伺服器上,比如雲伺服器。一般執行Java程式的遠端伺服器都是Linux系統,需要使用Linux命令操作,或寫一些shell指令碼去自動化部署管理一些程式。

5,艱苦奮鬥的精神

首先,一定要讓自己對這一行有興趣,明確自己在這一行的技術選擇,人生選擇。很多人都知道,程式設計師加班是常有的事,堅持的住就做,堅持不了就再換一家公司做。

綜上所述,想做Java遊戲伺服器方面的開發要掌握的技術有以下一些:

1,網路通訊框架,MinaNetty必須熟悉一種。而且自己必須要親自搭建過,並明白其它原理。

2,通訊協議制定和處理斷包粘包,這一般屬於網路通訊框架要解決的問題。

3,資料快取框架,redismemcache選擇一個,能熟練使用其客戶端的命令。

4Java基礎,Java NIO通訊原理,Java集合的使用,Java多執行緒開發,Java鎖的使用

5,瞭解一些設計模式。最好能把23種設計模式都看一遍,並結合自己的開發經驗,看哪些可以用到設計模式,但也不能死套設計模式,要靈活運用。

6,熟悉使用Mysql資料庫

7,瞭解資料庫連線池的一些框架,比如Mybatis,hibernate

8,對Http協議熟悉,熟悉一種web容器,比如tomcat,瞭解其配置。

9,對常用的一些Linux命令要熟悉使用。

10,熱愛學習,不斷的充實自己,上面所說的只是入門技能而已,真正做起來要複雜的多,一定要讓自己喜歡遊戲這個行業,這樣才能有動力做下去,做自己喜歡的工作還是比為了工作要好的!,更多