歡迎轉載,轉載請註明原文地址:http://blog.csdn.net/majianfei1023/article/details/46716073php
從事遊戲服務器開發差很少兩年時間,兩年間參與了很多項目,學到了不少遊戲服務器開發技術,參與過幾個不一樣架構的服務器開發,就隨便聊聊遊戲服務器開發須要的技術。(如下所指遊戲服務器更偏向於手遊,由於我對端遊和頁遊開發接觸並很少)
一.聊聊服務器開發有哪些東西要考慮。java
1.開發語言的選擇:node
工欲善其事,必先利其器,選擇一門適合的開發語法對後期開發有着事半功倍的做用。python
業界主要的是c/c++ + Python/lua模式作遊戲服務器。c/c++作網絡通信數據傳輸,python/lua作業務邏輯。這樣既保持了網絡傳輸的效率(c++),又提高開發效率(Python/lua),同時也支持熱更新。mysql
固然,也有其餘服務器開發語言,erlang(沒用過,頁遊公司用的多),c#(大棒子國喜歡用,神奇的民族),Java(第一次據說時我驚呆了),Node.js(少許遊戲用的,還有一個node.js寫的引擎叫pemolo),PHP(作http協議通信的遊戲時php+MySQL也不失爲一種好選擇),...c++
看過兩個遊戲服務器引擎 git
1.firefly(9秒社團開發的一款python遊戲服務器框架) https://github.com/9miao/Fireflygithub
2.kbengine(做者說他按bigworld的架構來設計的,c++ + python的) https://github.com/kbengine/kbengineredis
2.數據庫
如今比較流行的兩種數據庫,關係型數據庫mysql和非關係型數據庫mongodb。這是我用的最多的兩個數據庫。
關於二者之間的各類比較,網上有不少,固然你也能夠用其餘數據庫,至於sql server,不怕被坑你就用吧(我向來對微軟的東西沒好感)。
3.服務端架構
講一下我用過的其中一種架構模型,也是公司按着bigworld架構設計的:
1.Gate:首先要有一個Gate(網關)服務器,負責客戶端鏈接及消息轉發到Game(遊戲服),保持客戶端到服務端的鏈接
沒有任何邏輯,只作消息加密和解密,以及客戶端和服務器消息的轉發(至關於二者之間的橋樑).
2.GameServer:GameServer是遊戲進程,提供遊戲邏輯功能(採用單進程(或者單線程)模型,遊戲服務器的瓶頸歷來不在CPU,因此只作邏輯功能的話單線程足夠了,在這裏不必用多線程或多進程)。
3.DBManager:實現數據庫的讀寫,方便Game服務器異步讀寫數據庫的數據(有些把數據庫讀寫放在遊戲服,沒有單獨的服務器,那恐怕遊戲服單進程就不夠用了)。
4.GameManager:負責管理全部的GameServer,GameServer之間消息轉發,提供廣播到全部Game的功能。
4.協議
客戶端與服務器之間協議通訊,能夠用tcp或者http。主要看遊戲模型,若是是那種弱聯網單機玩法,用http足夠了,像每天酷跑之類,只在須要的時候處理一條http請求響應。
不過tcp用的比較仍是比較多的。如今的網絡遊戲大多數都是tcp,像MMORPG類遊戲。咱們如今的遊戲就是同時用了http和tcp,客戶端和遊戲服採用http協議。只有多人戰鬥轉向戰鬥服才採用tcp長連接。
udp:其實遊戲是有udp的,在一些高效率的場景下好比pvp即時戰鬥,tcp的擁塞控制和超時重傳並不適合,有些就用的udp,而後本身作丟包重發,拿網絡公平性換遊戲局部的效率。
如今參與開發的遊戲就同時使用了http協議和tcp協議,在遊戲服是單機玩法用http協議,戰鬥服須要長鏈接保存協議狀態,用的tcp。
5.存盤
有數據庫就確定有數據庫讀寫操做,最主要的仍是存盤(save),週期存盤仍是即時存盤
即時存盤就是每一次操做數據都進行存到數據庫,固然這樣會致使對數據庫的操做過於頻繁,畢竟這是效率的瓶頸之一。
週期存盤也叫固定存盤,就是每隔固定時間存盤一次,好比10秒或者15秒,這樣數據庫的壓力就會小不少,固然本身就要在內存中作好數據操做,防止數據污染或者存盤不上致使回檔。
二.開發一個遊戲服務器須要掌握的開源技術
1.libevent,boost.asio等網絡庫,網上有不少開源網絡庫,與其本身造輪子,不如就用開源網絡庫做爲本身服務器的通信庫。最出名的就屬libevent和boost.asio了。
Boost的ASIO是一個異步IO庫,封裝了對Socket的經常使用操做,簡化了基於socket程序的開發。支持跨平臺。
libevent是一個C語言寫的事件驅動的開源網絡庫,具體見:http://blog.csdn.net/majianfei1023/article/details/46485705
至於兩者之間的效率,仁者見仁。
固然還有不少:好比雲風寫的skynet(c + lua),陳碩寫的muduo(c++)。都寫得很好,雲風寫的東西簡單好用,陳碩在秀他的c++技術。
2.protobuf:全稱Google Protocol Buffers,是google開發的的一套用於數據存儲,網絡通訊時用於協議編解碼的工具庫。它和XML或者JSON差很少,也就是把某種數據結構的信息,以某種格式(XML,JSON)保存起來,
protobuf與XML和JSON不一樣在於,protobuf是基於二進制的。主要用於數據存儲、傳輸協議格式等場合。具體見:http://blog.csdn.net/majianfei1023/article/details/45112415
protobuf他的優點是對於傳輸比較大的數據產生的數據很緊湊很小,能夠明顯減少傳輸量。
並且處理速度也比較快,又有各類編程語言的實現,例如C++,Java,PHP等等。
缺點是不能明文編輯(數據是二進制的)。
用protobuf rpc進行數據傳輸很方便,因此是一個不錯的選擇。google protobuf只負責消息的打包和解包,並不包含RPC的實現,因此須要本身實現。
3.zeromq:消息隊列,一個穩健,簡潔的多進程通信方案的基礎。ZeroMQ 並非一個對socket的封裝,不能用它去實現已有的網絡協議。它有本身的模式,不一樣於更底層的點對點通信模式。它有比 tcp 協議更高一級的協議。(固然 ZeroMQ 不必定基於 TCP 協議,它也能夠用於進程間和進程內通信。)它改變了通信都基於一對一的鏈接這個假設。
在這裏它更適合服務器與服務器之間的通訊,好比邏輯服和戰鬥服之間進行通訊。
4.memcached:一個高性能的分佈式內存對象緩存系統,用於動態Web應用以減輕數據庫負載。它經過在內存中緩存數據和對象來減小讀取數據庫的次數,從而提升動態、數據庫驅動網站的速度。
能夠用來作緩存,好比客戶端原本每次操做都須要操做數據庫,會嚴重影響效率,這時在中間加一層緩存系統,就提高了性能。基於http協議的通訊用memcached是一個不錯的選擇,若是是tcp長連接,直接維護一個在線的內存對象就能夠了。
相似的技術還有redis等。
5.glog/zlog:你確定須要記錄日誌,看愛好嘍。
6.tcmalloc:內存性能分析
7.distcc:分佈式編譯工具,以前每次修改代碼都要make半個小時,用distcc進行多臺電腦同時幫你編譯,快不少。