天天看點

遊戲伺服器開發都要學什麼

一,遊戲伺服器開發工作介紹

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

1,團隊溝通

基本上不管做什麼開發,都是一個團隊來完成的,遊戲也是如此,遊戲團隊一般由老闆,總經理,CTO(技術主管),主策劃(上司一些人,包括數值策劃,系統策劃,特效策劃),主美(上司一些人,包括原畫,UI設計,特效動作設計),用戶端主程(上司一些人,用戶端程式員,用戶端程式員...),伺服器主程(上司一些人,包括伺服器程式員,伺服器程式員),外加運維。而遊戲的大部分邏輯實作與邏輯資料驗證都會放在伺服器端,是以服務端程式需要明确了解策劃的需求,要了解就需要溝通,溝通方式的正确與否,直接關系到功能的實作是否正确,由于遊戲邏輯的複雜性,單純的文檔描述可能不會非常完整,不像其它行業需求文檔就幾百頁,詳細的圖文并茂,制定好之後也很少變化。是以做為一名遊戲程式員,一定要有良好的溝通方式和技巧。

2,架構設計

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

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

第二,可擴充性,可擴充性包括兩個方面,一是代碼的可擴充性,比如說遊戲中的任務處理吧,一個遊戲中任務可能有幾十種,而且還可能不定時的增加,為了判斷不同的任務類型該執行什麼操作,最簡單也是最差的寫法是if else,想象一下,一個方法裡面,有幾十個if else,這簡單是bug的理想誕生地呀。一種可行的做法是使用責任鍊模式(具體的請參考設計模式的實作),這樣每種任務都有一個單獨的類去處理它,而不會影響其它的類,符合開閉原則,互相關聯少,越少越不容易出bug。二是部署的可擴充性,比如,如果線上人數突然增加或預期可能要增加,一台實體機器可能處理不過來這麼多的請求,那怎麼辦?那就需要支援在不影響其它伺服器運作的情況下,可以動态的添加機器。而當壓力降低之後,又可以移除某些機器,合理利用資源。

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

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

架構設計一般需要有經驗的開發者(項目主程)去搭建,新手可以做為了解,在接觸到項目之後,可以按這個思路去了解項目的架構是怎麼樣構成的,如果讓自己來做,能否模仿出來,有時間可以自己嘗試去獨立設計架構,鍛煉自己的能力,為将來自己帶項目做主程做好充值準備,機會都是留給有準備之人的。

3,邏輯開發

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

4,系統周邊開發

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

二,遊戲類型與技術選擇

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

1,PC類端遊

這類遊戲線上人數龐大,遊戲中要處理的資料也非常龐大。是以對伺服器性能要求非常高,一般都是采用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資源,是以它大大減少了資源占用。目前基于此技術有很多開源架構,目前最熱門的NIO異步網絡通信架構是Netty,它目前已被應用到種大型的開源軟體之後,比如RPC調用,阿裡雲的消 息隊列元件RocketMQ,Spring cloud的網關元件也是用Netty實作的。為了便于新手學習,可以參考這個單服遊戲伺服器框:https://gitee.com/wgslucky/xinyue-alone-game-server  ,此開源架構實作了遊戲伺服器開發中常見的基本功能,比如網絡通信,消息序列化與反序列化,邏輯處理,多線程封裝,消息廣播,消息加密解密,消息壓縮與解壓,連接配接管理,斷包與粘包處理等。

是以在網絡通信這一塊,如果是弱聯網遊戲,可以使用web那一套來開發遊戲伺服器,需要學習的技術一般有http原理,Json格式協定,servlet,Tomcat(也可以是其它web容器),spring等。如果是強聯網遊戲,要學習的技術有Netty或Mina可以選擇一種,多線程以及線程池的應用。這是網絡通信所必須掌握的。隻要能把用戶端發送的資訊接收到,并解析成代碼使用的明文,就是成功了一半了,剩下的事就是把代碼封裝好,友善邏輯開發調用!

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

2,資料存儲

網絡通信調試好之後,不要急着做邏輯開發,還需要把資料如何存儲理清楚!因為伺服器端操作的全是資料,如果處理的不好,容易出bug,丢資料,這對遊戲玩家來說是緻命的,不可接受的!資料存儲要考慮,

一,資料如何存到資料庫,是同步存儲,還是異步存儲!同步存儲即将數操作完之後立刻寫入資料庫,異步操作即資料操作完之後先存儲到記憶體緩存,然後由另外的線程或程序再同步到資料庫!遊戲中一般都是采用的異步存儲方式,因為遊戲并發量大,必須低延時,快速響應用戶端!如果直接操作資料庫太慢,會造成消息阻塞!記憶體緩存可先擇的架構有redis,memcache,具體怎麼同步到資料庫,需要自己去設計了!

二,資料接口如何設計,能不能用工作生成這些資料操作的代碼,能不能不用寫SQL語句,需是封裝在底層,或由工具生成。程式設計是門藝術,在這就展現出來了,當然是仁者見仁,智者見智了!

三,大并發情況下資料的一緻性,像這類可能多線程操作的資料,一般是放在記憶體中,由鎖來控制并發!是以對鎖的使用要熟悉,不要出現死鎖,或鎖粒度過大,造成線程的長時間等待的情況!四,當資料量太大,一個資料庫存儲不了,資料該怎麼分庫分表!一種是水準劃分,一種是垂直劃分!具體的劃分方式其它資料已有詳細介紹,請自行查找閱讀!目前有一個開源的分庫架構mycat,是用JAVA寫的,大家可以研究一下!

四,目前常用的資料庫有MySQL和MongoDB,MongoDB的優點是在開發過程中添加或删除字段不用操作資料庫表,它是文檔性資料庫。兩者各有利弊,可以都熟悉一下。

3,邏輯開發

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

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

3.1,資料同步

一說到資料同步或資源共享的時候,一般都會考慮到鎖的使用。因為一份資源同時隻能被一個線程通路才是安全的。Java的JDK中提供了一些鎖,比如: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使用

目前主流使用的資料緩存架構有redis和memcache,雖然在邏輯開發前,主程會對這些進行一些封裝,但是作為使用者還是需要對這些架構的用戶端的使用要有所了解的。這些可以去閱讀相關的文檔。不是太難。

4,程式部署與運作

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

5,艱苦奮鬥的精神

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

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

1,網絡通信架構,Mina或Netty必須熟悉一種。而且自己必須要親自搭建過,并明白其它原理。

2,通信協定制定和處理斷包粘包,這一般屬于網絡通信架構要解決的問題。

3,資料緩存架構,redis或memcache選擇一個,能熟練使用其用戶端的指令。

4,Java基礎,Java NIO通信原理,Java集合的使用,Java多線程開發,Java鎖的使用,在Java界,以後Spring MVC,Spring Boot,Spring Cloud是必不可少的。

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

6,熟悉使用Mysql資料庫

7,了解資料庫連接配接池的一些架構,比如Mybatis,hibernate

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

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

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

遊戲伺服器開發都要學什麼