相比遊戲客戶端,遊戲服務端開發無關緊要嗎?

語言: CN / TW / HK

theme: devui-blue

開啟掘金成長之旅!這是我參與「掘金日新計劃 · 2 月更文挑戰」的第 3 天,點選檢視活動詳情

為什麼有遊戲服務端

因為有需求,我們需要解決需求。 需求一:在家裡的電腦打完這一關,去朋友家的電腦上玩,又要重新打一遍。有一個地方儲存資料和關卡狀態該多好。 需求二:一直都是一個人玩,好希望和朋友一起玩啊。有中轉的電腦,轉發玩家的操作、狀態就可以了。 需求三:臥槽,這個人開掛,怎麼一刀把我秒了,不公平,垃圾遊戲,我不玩了。有校驗玩家操作、反外掛、有裁判,維持公平和遊戲性。

從上面的三個需求,可以抽象出遊戲伺服器的功能應該有如下幾點。 - 網路服務 網路服務就是建立客戶端與服務端之間的連線。 - 玩家資料存取 最常見的就是登入,登入的時候需要取玩家資料。存,一般有三種儲存方式,使用者下線時寫一次 DB。第二種是定時寫回 DB。第三種是重要資料立即回寫,例如玩家打到一個比較稀有的裝備,就應該立刻儲存,避免突然宕機導致資料丟失。 - 遊戲邏輯計算 邏輯計算,把以前單機時,前端的計算放到後端,這是為了防止作弊。 - 玩家行為或狀態變化的同步檢測 這塊可以理解成玩家可以看到他視野範圍內看到什麼東西。

遊戲伺服器相比傳統的網際網路應用有如下特點。 - 延遲敏感 - 實時的高強度互動 一般單次請求就會產生複雜邏輯,還有一些廣播和同步,比如移動同步,這就是一個很大的壓力,假設你在一個二十人左右的場景裡面,你發出了 5 個移動包,表示它移動的方向產生改變,目標點發生的改變,那麼這個訊息量將放大二十倍。 - 業務邏輯複雜,內部耦合度高 因為延遲和敏感和高強度,那麼在伺服器維護狀態就是一個必然的過程,這樣就會導致它的邏輯比較複雜。比如你擊殺一個怪物,可能它不僅僅是擊殺一個怪物,還會觸發一些任務的邏輯。 - 變更頻率高 遊戲伺服器的幅度一般沒有傳統的網際網路應用幅度大。端遊時代還好,但是現在是手遊時代,基本上是一週一個小更新,一月一個大更新,所以伺服器的灰度和部署需求也在逐漸變高。

遊戲模型發展史

第一代遊戲伺服器

初代目

初代目的遊戲伺服器就是一個程序單執行緒物阻塞,接收到玩家的訊息後,按照一個訊息佇列來進行序列化。這種遊戲的代表就是 78 年的 MUD 遊戲 Multiple User Domain,文字網遊的統稱,沒有圖形,通常是在終端與玩家互動,全部用文字和字元畫來構成。

第二代遊戲伺服器

第二代遊戲服務 初代目由於承載能力的限制,衍生出了第二代遊戲伺服器,目的就是為了增加併發,開始使用了多執行緒多程序的模型,邏輯上也開始增加了分割槽分服的結構。代表作有《UItima》,中文名叫《創世紀》。

UItima

2000年,聯眾的休閒棋牌。

聯眾的休閒棋牌

在 2003 年年底,聯眾遊戲世界的註冊使用者一度超過2億,月活使用者達1500萬,中國網路棋牌遊戲的絕對霸主,但是 2003 年下半年,騰訊公測 QQ 遊戲大廳,功能與遊戲門類與聯眾大同小異,QQ 遊戲大廳不同在於,每次你的 QQ 好友在遊戲大廳玩遊戲時,他的頭像下方就會顯示他正在玩什麼遊戲,這個狀態列一點開,你就能跟他一起玩了,就這麼一點小細節,讓聯眾遊戲世界和 QQ 遊戲大廳的使用者流量在一兩年裡發生了戲劇性的此消彼長。2006年,徹底敗北的聯眾創始人辭職,之後他成為投資人,堅持只做騰訊不做的專案。

第三代遊戲伺服器 - 三層架構

三層架構

第三代遊戲伺服器就比較百花齊放了,首先就是當時流行的三層架構,抽出 Gate Server 的部分去負責網路 IO 連線的部分,然後 Gate Server 通過一個內部的網路 IDC 的專網跟遊戲邏輯伺服器之間互動,最後把使用者資料的儲存放到 DB Server 這一層。 總的來說,三層架構它的主要特點就是把網路 IO 和儲存跟邏輯分離,這樣可以對每一層進行擴充套件,增加服務的承載能力。QQ 遊戲大廳就是比較典型的代表。

QQ 遊戲大廳

第三代遊戲伺服器 - 伺服器叢集

伺服器叢集

這種架構前面同樣也是有 Gate Server 這種接入型服務來處理外網連線,然後在遊戲 world 裡去處理遊戲邏輯。它與三層架構不同的是,它會把通用邏輯抽取出來,例如登入、聊天、組隊、工會等,放在獨立的位置,通過 cluster 叢集的方式提供這種遊戲服務,呼叫者通過呼叫函式來獲取對應的功能。大部分的 MMO-RPG(MMO:Massive Multiplayer Online,大型多人線上遊戲) 、RPG(Role Playing Game:角色扮演) 遊戲都是這種結構。 這種方式,中間肯定就多了一些非同步的互動,非同步互動就會帶來狀態維護的問題,開發難度也隨之提高。代表遊戲有《地下城與勇士》。

地下城與勇士

第三代遊戲伺服器 - 無縫地圖

無縫地圖

這個型別的遊戲,最大的代表遊戲就是《魔獸世界》,相比以前的《傳奇》型別的遊戲,它切換地圖的時候,客戶端會明顯的卡頓或者進入 loading 介面。無縫地圖的特點就是玩家在遊戲中移動時,會看到地圖一直都在不停的載入,因為它的場景伺服器只負責一部分場景,玩家移動到某個地方時,場景可能存在兩個場景伺服器上。這些場景伺服器會由一個更高層的伺服器來決策由哪臺伺服器載入場景。

魔獸世界

第三代遊戲伺服器 - 房間型

比較常見的遊戲型別都會使用這種模型。它通常有一個大廳叢集,它通常負責前面提到的 Gate Server 使用者的接入,還有一些大廳的邏輯服務,例如 5V5 匹配,有多個玩家申請進遊戲的時候,它會根據匹配規則,等級啊,玩家的技術啊來撮合兩個隊伍。然後,單局的過程會放到戰鬥叢集,也叫做房間服務。代表遊戲有騰訊的《英雄聯盟》,《英雄聯盟》把電競行業也推到了一個前所未有的高度,想到以前高中和兄弟們一起開黑,真是快樂。

英雄聯盟

核心技術和實現難點

遊戲伺服器技術跟客戶端比較,客戶端主要在使用者互動和體驗表現方面。而伺服器則是要面對海量使用者,十萬到千萬的 PCU,PCU 是遊戲裡面,使用者資料的一個指標,Peak Concurrent Users 最高同時線上玩家人數,還有 DAU Daily Active User 每天登入過的使用者,PCU 比較考量伺服器的效能資料,DAU 更傾向運營資料。

穩定,伺服器玩的時候不能宕機,還有就是容忍一些弱網路的問題,網路斷了,允許他在短時間內 WIFI - 4G 的切換。

地圖&視野同步,地圖服務功能,伺服器最常用的是九宮格技術,一塊九宮格的內容,玩家在其中格,這個格往往比螢幕大一點,會收到這個格里面的內容,一般伺服器會認為你在這個九宮格內,所有的玩家、怪物等都是你關注的物件,當你在一個格內移動時,視野是不會發生變化的,但假設移動跨格後,那麼就認為玩家放棄了上一個九格宮中關注的內容,在客戶端將不可見上一個格子中的內容,在伺服器角度仍然可見。目的就是使用者在移動的過程中比較平滑的載入資料,減少互動的數量。地圖管理還包括一些動態阻擋,比如兩個人走到同一個點,能夠擠在一起還是重疊。還有就是靜態阻擋,一個物件放置在那裡,伺服器要判斷玩家能否走過去。移動中,主要問題還在延遲、拉扯、平滑、差值。

最後遊戲中非業務的難點還有儲存、快取、反外掛、網路協議等。我根據目前我的技術棧來列舉。如下。

在這裡插入圖片描述

開啟掘金成長之旅!這是我參與「掘金日新計劃 · 2 月更文挑戰」的第 3 天,點選檢視活動詳情