手遊伺服器開發技術詳解,伺服器開發技術詳解
歡迎轉載,轉載請註明原文地址:http://blog.csdn.net/majianfei1023/article/details/46716073
從事遊戲伺服器開發差不多兩年時間,兩年間參與了不少項目,學到了很多遊戲伺服器開發技術,參與過幾個不同架構的伺服器開發,就隨便聊聊遊戲伺服器開發需要的技術。(以下所指遊戲伺服器更偏向於手遊,因為我對端遊和頁遊開發接觸並不多)
一.聊聊伺服器開發有哪些東西要考慮。
1.開發語言的選擇:
工欲善其事,必先利其器,選擇一門適合的開發文法對後期開發有著事半功倍的作用。
業界主要的是c/c++ + Python/lua模式做遊戲伺服器。c/c++做網路通訊資料轉送,python/lua做商務邏輯。這樣既保持了網路傳輸的效率(c++),又提升開發效率(Python/lua),同時也支援熱更新。
當然,也有其他伺服器開發語言,erlang(沒用過,頁遊公司用的多),c#(大棒子國喜歡用,神奇的民族),Java(第一次聽說時我驚呆了),node.js(少量遊戲用的,還有一個node.js寫的引擎叫pemolo),php(做http協議通訊的遊戲時php+mysql也不失為一種好選擇),...
看過兩個遊戲伺服器引擎
1.firefly(9秒社團開發的一款python遊戲伺服器架構) https://github.com/9miao/Firefly
2.kbengine(作者說他按bigworld的架構來設計的,c++ + python的) https://github.com/kbengine/kbengine
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進行多台電腦同時幫你編譯,快很多。
著作權聲明:本文為博主原創文章,未經博主允許不得轉載。