2021-02-03

一.聊聊服務(wù)器開(kāi)發(fā)有哪些東西要考慮宙枷。

1.開(kāi)發(fā)語(yǔ)言的選擇:

工欲善其事,必先利其器掉房,選擇一門(mén)適合的開(kāi)發(fā)語(yǔ)法對(duì)后期開(kāi)發(fā)有著事半功倍的作用。

業(yè)界主要的是c/c++ + Python/lua模式做游戲服務(wù)器慰丛。c/c++做網(wǎng)絡(luò)通訊數(shù)據(jù)傳輸卓囚,python/lua做業(yè)務(wù)邏輯。這樣既保持了網(wǎng)絡(luò)傳輸?shù)男?c++)诅病,又提升開(kāi)發(fā)效率(Python/lua)哪亿,同時(shí)也支持熱更新。

當(dāng)然贤笆,也有其他服務(wù)器開(kāi)發(fā)語(yǔ)言蝇棉,erlang(沒(méi)用過(guò),頁(yè)游公司用的多),c#(大棒子國(guó)喜歡用芥永,神奇的民族),Java(第一次聽(tīng)說(shuō)時(shí)我驚呆了),Node.js(少量游戲用的,還有一個(gè)node.js寫(xiě)的引擎叫pemolo),PHP(做http協(xié)議通訊的游戲時(shí)php+MySQL也不失為一種好選擇),...

看過(guò)兩個(gè)游戲服務(wù)器引擎

1.firefly(9秒社團(tuán)開(kāi)發(fā)的一款python游戲服務(wù)器框架)?9miao/Firefly

2.kbengine(作者說(shuō)他按bigworld的架構(gòu)來(lái)設(shè)計(jì)的,c++ + python的)?kbengine/kbengine

2.數(shù)據(jù)庫(kù)

現(xiàn)在比較流行的兩種數(shù)據(jù)庫(kù)篡殷,關(guān)系型數(shù)據(jù)庫(kù)mysql和非關(guān)系型數(shù)據(jù)庫(kù)mongodb。這是我用的最多的兩個(gè)數(shù)據(jù)庫(kù)恤左。

關(guān)于兩者之間的各種比較,網(wǎng)上有很多搀绣,當(dāng)然你也可以用其他數(shù)據(jù)庫(kù)飞袋,至于sql server,不怕被坑你就用吧(我向來(lái)對(duì)微軟的東西沒(méi)好感)。

3.服務(wù)端架構(gòu)

講一下我用過(guò)的其中一種架構(gòu)模型链患,也是公司按著bigworld架構(gòu)設(shè)計(jì)的:

1.Gate:首先要有一個(gè)Gate(網(wǎng)關(guān))服務(wù)器巧鸭,負(fù)責(zé)客戶(hù)端連接及消息轉(zhuǎn)發(fā)到Game(游戲服),保持客戶(hù)端到服務(wù)端的連接

沒(méi)有任何邏輯,只做消息加密和解密麻捻,以及客戶(hù)端和服務(wù)器消息的轉(zhuǎn)發(fā)(相當(dāng)于兩者之間的橋梁).

2.GameServer:GameServer是游戲進(jìn)程,提供游戲邏輯功能(采用單進(jìn)程(或者單線(xiàn)程)模型,游戲服務(wù)器的瓶頸從來(lái)不在CPU,所以只做邏輯功能的話(huà)單線(xiàn)程足夠了,在這里沒(méi)必要用多線(xiàn)程或多進(jìn)程)纲仍。

3.DBManager:實(shí)現(xiàn)數(shù)據(jù)庫(kù)的讀寫(xiě),方便Game服務(wù)器異步讀寫(xiě)數(shù)據(jù)庫(kù)的數(shù)據(jù)(有些把數(shù)據(jù)庫(kù)讀寫(xiě)放在游戲服贸毕,沒(méi)有單獨(dú)的服務(wù)器郑叠,那恐怕游戲服單進(jìn)程就不夠用了)。

4.GameManager:負(fù)責(zé)管理所有的GameServer明棍,GameServer之間消息轉(zhuǎn)發(fā)乡革,提供廣播到所有Game的功能。

4.協(xié)議

客戶(hù)端與服務(wù)器之間協(xié)議通信摊腋,可以用tcp或者h(yuǎn)ttp沸版。主要看游戲模型,如果是那種弱聯(lián)網(wǎng)單機(jī)玩法兴蒸,用http足夠了视粮,像天天酷跑之類(lèi),只在需要的時(shí)候處理一條http請(qǐng)求響應(yīng)橙凳。

不過(guò)tcp用的比較還是比較多的±倥梗現(xiàn)在的網(wǎng)絡(luò)游戲大多數(shù)都是tcp笑撞,像MMORPG類(lèi)游戲。我們現(xiàn)在的游戲就是同時(shí)用了http和tcp区宇,客戶(hù)端和游戲服采用http協(xié)議娃殖。只有多人戰(zhàn)斗轉(zhuǎn)向戰(zhàn)斗服才采用tcp長(zhǎng)鏈接。

udp:其實(shí)游戲是有udp的议谷,在一些高效率的場(chǎng)景下比如pvp即時(shí)戰(zhàn)斗,tcp的擁塞控制和超時(shí)重傳并不適合炉爆,有些就用的udp,然后自己做丟包重發(fā),拿網(wǎng)絡(luò)公平性換游戲局部的效率卧晓。

現(xiàn)在參與開(kāi)發(fā)的游戲就同時(shí)使用了http協(xié)議和tcp協(xié)議芬首,在游戲服是單機(jī)玩法用http協(xié)議,戰(zhàn)斗服需要長(zhǎng)連接保存協(xié)議狀態(tài),用的tcp逼裆。

5.存盤(pán)

有數(shù)據(jù)庫(kù)就肯定有數(shù)據(jù)庫(kù)讀寫(xiě)操作郁稍,最主要的還是存盤(pán)(save),周期存盤(pán)還是即時(shí)存盤(pán)

即時(shí)存盤(pán)就是每一次操作數(shù)據(jù)都進(jìn)行存到數(shù)據(jù)庫(kù),當(dāng)然這樣會(huì)導(dǎo)致對(duì)數(shù)據(jù)庫(kù)的操作過(guò)于頻繁胜宇,畢竟這是效率的瓶頸之一耀怜。

周期存盤(pán)也叫固定存盤(pán),就是每隔固定時(shí)間存盤(pán)一次桐愉,比如10秒或者15秒财破,這樣數(shù)據(jù)庫(kù)的壓力就會(huì)小很多,當(dāng)然自己就要在內(nèi)存中做好數(shù)據(jù)操作从诲,防止數(shù)據(jù)污染或者存盤(pán)不上導(dǎo)致回檔左痢。

二.開(kāi)發(fā)一個(gè)游戲服務(wù)器需要掌握的開(kāi)源技術(shù)

1.libevent,boost.asio等網(wǎng)絡(luò)庫(kù),網(wǎng)上有很多開(kāi)源網(wǎng)絡(luò)庫(kù)系洛,與其自己造輪子俊性,不如就用開(kāi)源網(wǎng)絡(luò)庫(kù)作為自己服務(wù)器的通訊庫(kù)。最出名的就屬libevent和boost.asio了描扯。

Boost的ASIO是一個(gè)異步IO庫(kù)定页,封裝了對(duì)Socket的常用操作,簡(jiǎn)化了基于socket程序的開(kāi)發(fā)绽诚。支持跨平臺(tái)拯勉。

libevent是一個(gè)C語(yǔ)言寫(xiě)的事件驅(qū)動(dòng)的開(kāi)源網(wǎng)絡(luò)庫(kù),具體見(jiàn):libevent學(xué)習(xí)筆記 一、基礎(chǔ)知識(shí)

至于二者之間的效率憔购,仁者見(jiàn)仁宫峦。

當(dāng)然還有很多:比如云風(fēng)寫(xiě)的skynet(c + lua),陳碩寫(xiě)的muduo(c++)。都寫(xiě)得很好,云風(fēng)寫(xiě)的東西簡(jiǎn)單好用玫鸟,陳碩在秀他的c++技術(shù)导绷。

2.protobuf:全稱(chēng)Google Protocol Buffers,是google開(kāi)發(fā)的的一套用于數(shù)據(jù)存儲(chǔ)屎飘,網(wǎng)絡(luò)通信時(shí)用于協(xié)議編解碼的工具庫(kù)妥曲。它和XML或者JSON差不多贾费,也就是把某種數(shù)據(jù)結(jié)構(gòu)的信息,以某種格式(XML檐盟,JSON)保存起來(lái)褂萧,

protobuf與XML和JSON不同在于,protobuf是基于二進(jìn)制的葵萎。主要用于數(shù)據(jù)存儲(chǔ)导犹、傳輸協(xié)議格式等場(chǎng)合。具體見(jiàn):google protobuf學(xué)習(xí)筆記二:使用和原理

protobuf他的優(yōu)勢(shì)是對(duì)于傳輸比較大的數(shù)據(jù)產(chǎn)生的數(shù)據(jù)很緊湊很小羡忘,可以明顯減小傳輸量谎痢。

而且處理速度也比較快,又有各種編程語(yǔ)言的實(shí)現(xiàn)卷雕,例如C++,Java,PHP等等节猿。

缺點(diǎn)是不能明文編輯(數(shù)據(jù)是二進(jìn)制的)。

用protobuf rpc進(jìn)行數(shù)據(jù)傳輸很方便漫雕,所以是一個(gè)不錯(cuò)的選擇滨嘱。google protobuf只負(fù)責(zé)消息的打包和解包,并不包含RPC的實(shí)現(xiàn),所以需要自己實(shí)現(xiàn)浸间。

3.zeromq:消息隊(duì)列,一個(gè)穩(wěn)健太雨,簡(jiǎn)潔的多進(jìn)程通訊方案的基礎(chǔ)。ZeroMQ 并不是一個(gè)對(duì)socket的封裝发框,不能用它去實(shí)現(xiàn)已有的網(wǎng)絡(luò)協(xié)議躺彬。它有自己的模式煤墙,不同于更底層的點(diǎn)對(duì)點(diǎn)通訊模式梅惯。它有比 tcp 協(xié)議更高一級(jí)的協(xié)議。(當(dāng)然 ZeroMQ 不一定基于 TCP 協(xié)議仿野,它也可以用于進(jìn)程間和進(jìn)程內(nèi)通訊铣减。)它改變了通訊都基于一對(duì)一的連接這個(gè)假設(shè)。

在這里它更適合服務(wù)器與服務(wù)器之間的通信脚作,比如邏輯服和戰(zhàn)斗服之間進(jìn)行通信葫哗。

4.memcached:一個(gè)高性能的分布式內(nèi)存對(duì)象緩存系統(tǒng),用于動(dòng)態(tài)Web應(yīng)用以減輕數(shù)據(jù)庫(kù)負(fù)載球涛。它通過(guò)在內(nèi)存中緩存數(shù)據(jù)和對(duì)象來(lái)減少讀取數(shù)據(jù)庫(kù)的次數(shù)劣针,從而提高動(dòng)態(tài)、數(shù)據(jù)庫(kù)驅(qū)動(dòng)網(wǎng)站的速度亿扁。

可以用來(lái)做緩存捺典,比如客戶(hù)端本來(lái)每次操作都需要操作數(shù)據(jù)庫(kù),會(huì)嚴(yán)重影響效率从祝,這時(shí)在中間加一層緩存系統(tǒng)襟己,就提升了性能引谜。基于http協(xié)議的通信用memcached是一個(gè)不錯(cuò)的選擇擎浴,如果是tcp長(zhǎng)鏈接员咽,直接維護(hù)一個(gè)在線(xiàn)的內(nèi)存對(duì)象就可以了。

類(lèi)似的技術(shù)還有redis等贮预。

5.glog/zlog:你肯定需要記錄日志,看愛(ài)好嘍贝室。

6.tcmalloc:內(nèi)存性能分析

7.distcc:分布式編譯工具,之前每次修改代碼都要make半個(gè)小時(shí),用distcc進(jìn)行多臺(tái)電腦同時(shí)幫你編譯萌狂,快很多

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末档玻,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子茫藏,更是在濱河造成了極大的恐慌误趴,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,695評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件务傲,死亡現(xiàn)場(chǎng)離奇詭異凉当,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)售葡,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,569評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén)看杭,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人挟伙,你說(shuō)我怎么就攤上這事楼雹。” “怎么了尖阔?”我有些...
    開(kāi)封第一講書(shū)人閱讀 168,130評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵贮缅,是天一觀(guān)的道長(zhǎng)。 經(jīng)常有香客問(wèn)我介却,道長(zhǎng)谴供,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,648評(píng)論 1 297
  • 正文 為了忘掉前任齿坷,我火速辦了婚禮桂肌,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘永淌。我一直安慰自己崎场,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,655評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布遂蛀。 她就那樣靜靜地躺著谭跨,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上饺蚊,一...
    開(kāi)封第一講書(shū)人閱讀 52,268評(píng)論 1 309
  • 那天萍诱,我揣著相機(jī)與錄音,去河邊找鬼污呼。 笑死裕坊,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的燕酷。 我是一名探鬼主播籍凝,決...
    沈念sama閱讀 40,835評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼苗缩!你這毒婦竟也來(lái)了饵蒂?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,740評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤酱讶,失蹤者是張志新(化名)和其女友劉穎退盯,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體泻肯,經(jīng)...
    沈念sama閱讀 46,286評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡渊迁,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,375評(píng)論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了灶挟。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片琉朽。...
    茶點(diǎn)故事閱讀 40,505評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖稚铣,靈堂內(nèi)的尸體忽然破棺而出箱叁,到底是詐尸還是另有隱情,我是刑警寧澤惕医,帶...
    沈念sama閱讀 36,185評(píng)論 5 350
  • 正文 年R本政府宣布耕漱,位于F島的核電站,受9級(jí)特大地震影響曹锨,放射性物質(zhì)發(fā)生泄漏孤个。R本人自食惡果不足惜剃允,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,873評(píng)論 3 333
  • 文/蒙蒙 一沛简、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧斥废,春花似錦椒楣、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,357評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至,卻和暖如春毛俏,著一層夾襖步出監(jiān)牢的瞬間炭庙,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,466評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工煌寇, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留焕蹄,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,921評(píng)論 3 376
  • 正文 我出身青樓阀溶,卻偏偏與公主長(zhǎng)得像腻脏,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子银锻,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,515評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容

  • JVM 1:JVM基礎(chǔ)知識(shí) 什么是JVM 常見(jiàn)的JVM 2:ClassFileFormat 3:類(lèi)編譯-加載-初始...
    皮皮魏閱讀 231評(píng)論 0 0
  • [TOC] 1. 索引概述 MySQL官方對(duì)索引的定義為:索引(index)是幫助MySQL高效獲取數(shù)據(jù)的數(shù)據(jù)結(jié)構(gòu)...
    21號(hào)新秀_鄧肯閱讀 165評(píng)論 0 0
  • 最近調(diào)研了一下游戲服務(wù)器設(shè)計(jì)的問(wèn)題永品,周末花了些時(shí)間查閱相關(guān)的書(shū)籍和文章,也了解了一下Photon击纬、KBEngine...
    曉夢(mèng)蟬君閱讀 3,596評(píng)論 1 22
  • URI通過(guò)外部應(yīng)用打開(kāi)APPData的提供方和使用方都通過(guò)URI(Uniform Resource Identif...
    奔跑吧jjj閱讀 471評(píng)論 0 0
  • 手游Java游戲服務(wù)器線(xiàn)上真實(shí)案例分析 靈域 內(nèi)存泄露 現(xiàn)象:項(xiàng)目上線(xiàn)一周左右鼎姐,客服反饋玩家操作反映很卡,而在線(xiàn)玩...
    landon30閱讀 698評(píng)論 0 0