【專業技術】如何搭建遊戲伺服器?

2021-02-16 程式設計師互動聯盟

存在問題:

手遊越來越火了,聽聽業內人士的分析,他山之石,多多借鑑,那麼手遊的伺服器到底如何搭建的?

解決方案:

從事遊戲伺服器開發差不多兩年時間,兩年間參與了不少項目,學到了很多遊戲伺服器開發技術,參與過幾個不同架構的伺服器開發,就隨便聊聊遊戲伺服器開發需要的技術。(以下所指遊戲伺服器更偏向於手遊,因為我對端遊和頁遊開發接觸並不多)

一.聊聊伺服器開發有哪些東西要考慮。

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進行多臺電腦同時幫你編譯,快很多。

轉自:http://blog.csdn.net/majianfei1023/article/details/46716073

聯盟推出專業技術系列,如果有編程疑惑可按照如下格式:

專業技術+個人暱稱+具體問題

輸入到微信公眾號裡面,具有代表性的問題,聯盟將整理成文章發表

輸入js獲取所有的答疑釋惑文章,或者點擊「閱讀原文

輸入關鍵字 投票 有驚喜等你哦

相關焦點

  • 如何搭建個人的家庭伺服器
    ~之前分享過很多關於「家庭伺服器」的內容,不過有朋友反饋說那些內容太零散,看完後很多疑問。於是我梳理了家庭伺服器搭建的整個流程,把經驗分享給大家:如果你的個人伺服器性能過剩(8核以上、32G內存以上),想要搭建多系統。可以學習一下ESXi和PVE,通過虛擬化技術讓多個系統同時運行。不過我對於性能不那麼執著,Docker已經可以滿足絕大部分使用場景需求,所以我自己也沒有搭建ESXi的需求。
  • 如何搭建「我的世界」伺服器 | Linux 中國
    我們將通過一個一步步的、新手友好的教程來向你展示如何搭建一個「我的世界(Minecraft)」伺服器。這將會是一個長期的多人遊戲伺服器,你可以與來自世界各地的朋友們一起玩,而不用在同一個區域網下。如何搭建一個「我的世界」伺服器 - 快速指南在你開始行動之前,要先了解一些事情:為什麼你不應該使用專門的「我的世界」伺服器提供商既然你正在閱讀這篇文章,你肯定對搭建自己的「我的世界」伺服器感興趣。不應該使用專門的「我的世界」伺服器提供商的原因有很多,以下是其中一些:◈ 它們通常很慢。這是因為你是在和很多用戶一起共享資源。
  • 如何搭建ftp伺服器實現文件共享?
    一這裡以windows系統和linux系統為例,簡單介紹一下如何在這2種系統下搭建ftp伺服器,整個過程非常簡單,感興趣的朋友可以自己嘗試一下:windowswindows系統自帶有ftp伺服器,只需要在控制面板的「程序和功能」模塊中開啟一下就行,下面我簡單介紹一下操作過程:1.首先,打開控制面板,依次點擊「程序」->「啟用或關閉windows
  • 如何搭建一個IP分配伺服器
    很多電商公司因為需要測評,或者營銷測試,需要固定IP,或者固定家庭IP的伺服器,卻不知道如何搭建。本文就主要講解這個過程。
  • 如何搭建自己的dnslog伺服器
    www.anquanke.com/post/id/98096https://17817534153.github.io/2020/05/23/MySQL%E6%95%B0%E6%8D%AE%E5%BA%93%E7%9A%84dnslog%E6%B3%A8%E5%85%A5/http://www.bywalks.com/324.html下面介紹如何搭建
  • 饑荒聯機伺服器搭建教程(一)
    為了解決這一現象,提高聯機版的遊戲性,饑荒官方推出了與客戶端相比,更加輕量級的遊戲體(Don't Starve Together Dedicated Server)即切除圖形顯示,只有遊戲邏輯處理的程序。幾經周折聯機也出了洞穴,伺服器的配置也發生了變化,那在這裡介紹最新的使用這個程序搭建伺服器的方法,即可告別諸多卡頓現象,那如何搭建這個伺服器呢?
  • MMORPG伺服器框架搭建,MongoDB和Redis的使用
    本系列課程旨在幫助大家從零開始搭建商業化MMORPG的分布式伺服器框架,包括不同種類伺服器的線程模型,如中心伺服器、網關伺服器、遊戲伺服器、
  • FTP伺服器的搭建
    FTP伺服器,這是什麼東西?做什麼用的?
  • 搭建伺服器算什麼困難?
    如果你還對如何CSGO搭建伺服器存在著疑惑?那麼點開這篇文章的選擇是對的。
  • Git-如何搭建伺服器
    在開源的世界裡,GitHub 是程式設計師聚集的狂歡之地,但這並不適合企業的私有項目,雖然 GitHub 也支持創建私有項目,但是搭建一個自己的 Git 伺服器在很多時候可能是更好的選擇,這篇博客將介紹並學習幾種搭建 Git 伺服器的方法。
  • 如何利用Serv-UFTP Server搭建自己的FTP伺服器
    目的:通過學習使用Serv-U軟體搭建自己的FTP伺服器,實現文件跨網絡傳輸。前提:電腦的IP位址不能是內網IP位址(即通過NAT轉換的IP位址)條件:XP/win7系統,Serv-UFTP Server v15.1.6破解版 該文主要是簡單的進行搭建,該軟體有很多牛皮的功能,有興趣的可以自己探究。
  • 如何搭建一個網頁版的BLAST伺服器
    如何搭建一個網頁版的BLAST伺服器胖丫今天跟我說:「師兄,再來給我調調網絡唄?
  • 走進微認證 | 搭建我的世界遊戲伺服器 讓遊戲更high
    你知道為何現在遊戲體驗在日益提升嗎?你想提高自己的遊戲部署能力嗎?華為雲微認證「搭建我的世界遊戲伺服器」將解答你的疑問。在遊戲風行的時代,高並發、高性能、安全風險高和精準定位難等成為遊戲行業所面臨的一系列挑戰,不過這些在雲上都可以找到完善的解決方案。
  • 如何搭建一個郵件伺服器
    一、搭建準備:此處以windows server 2012 r2為例子(也可自己用虛擬機使用穿透技術)
  • 教你用阿里雲搭建Minecraft伺服器
    快去本次文章教你如何用阿里雲搭建Minecraft伺服器,雖是搭建遊戲聯機的平臺,但為此可以學到如何簡單使用阿里雲一些基本使用方式與Centos
  • 如何在校內搭建一個屬於自己的FTP伺服器
    我想來想去這怕是只能歸功於SMU強大的【網絡管控】了罷(苦笑不想提這些傻x事,來說正事:如何在校內搭建一個屬於自己的FTP伺服器?學完這個你就可以培養習慣了);iOS設備在使用FTP Manager訪問伺服器3、如果有兩臺電腦(臺式機大老婆宅家裡+輕薄本二奶帶出去玩)的話,用這個來進行工作文件的同步就再也合適不過了。4、等我想好再寫5、同上限於篇幅(以及我的知識水平和怠惰程度),這期只說一下如何在Windows系統進行FTP伺服器的搭建。
  • 從零搭建遊戲伺服器,攏共分幾步?
    這裡的網絡協議是用於遊戲中的客戶端和伺服器交流的。其中用的最多的就是Google的協議緩衝區了,也有直接用 JSON 或者 MessagePack 的。資料庫早期的遊戲伺服器是沒有使用資料庫的,玩家的數據直接存文件的,一個玩家一個數據文件。現代的遊戲伺服器都配備了資料庫,是因為遊戲越來越複雜,數據量也越來越多,而且採用資料庫也方便對數據的管理和備份。
  • 怎樣快速搭建一個免費的靜態網頁伺服器
    有時候自己寫了一個h5遊戲或者網頁,想要放到在伺服器上方便遠程訪問,該怎麼做呢?買伺服器?不存在的!花錢!
  • 哪些業務可以租用香港伺服器來搭建?
    現在除了大陸地區伺服器之外,也有不少企業租用海外伺服器,像現在比較火熱的香港伺服器,也備受企業喜愛,香港機房的地理位置距離大陸地區比較近,在網絡條件方面相比其他的海外伺服器更加有優勢,那麼香港伺服器都適合哪些行業租用呢?哪些業務可以租用香港伺服器來搭建呢?
  • 如何用自己的電腦做伺服器搭建個人網站?
    看到別人形形色色的網站是不是也想自己搭建一個自己的網站呢?無論是不想用雲主機,還是安全隱私的保密要求,需要用自己電腦作為伺服器搭建網站!