1. 程式人生 > >騰訊如何打造一款實時對戰手遊

騰訊如何打造一款實時對戰手遊

2015年以來,手機遊戲的市場偏好,逐漸從早期的休閒類、跑酷類、卡牌類遊戲,轉向重度、操作性更強的ARPG 、FPS、、MOBA類遊戲。因此實時對戰這一遊戲玩法,也逐漸成為了手機遊戲的一個核心玩法。縱觀AppStore暢銷榜前十的遊戲,過半都支援玩家實時的PK或者合作攻關。由於實時對戰有玩家之間自發進行強互動的特點,活躍度和社交強度都是比較高,為遊戲的使用者活躍和流水的提高奠定了堅實的基礎。

1458473875223946.jpeg

騰訊的遊戲開發團隊,很早就觀察到實時對戰這一核心玩法對遊戲生命週期影響的重要性,因此在自研產品方面,加大力度開發圍繞實時對戰這一核心玩法的遊戲,從而誕生了《王者榮耀》、、《穿越火線·槍戰王者》、《全民超神》、《全民突擊》、《天天炫鬥》等一大批優秀的作品,其中不乏日活躍過千萬的大作。而早期的休閒類遊戲如《全民飛機大戰》等,也加入了實時雙打等遊戲特性,所以現在依然可以經常在AppStore暢銷榜前十看到《全民飛機大戰》這款遊戲的身影。

既然實時對戰是一個非常重要的遊戲玩法,為什麼我們現在看到的許多遊戲,都不具備這一的玩法,或者並不是遊戲的主要玩法?其中一個重要的原因,就是開發實時對戰的功能,在技術上需要有一定的門檻。本文希望能向大家分享騰訊是如何跨過這些門檻,解決實時對戰遊戲開發的一系列核心技術難題。

遊戲資料同步方案

首先我們介紹實時對戰手遊中最難解決的技術問題——弱網路下的同步問題。

通過對玩家的遊戲資料進行觀察,發現玩家的遊戲環境存在很大差異,不同玩家會使用不同的2G/3G/4G/Wifi網路,不同網路之間的延遲相差很大。另外行動網路質量不穩定,且都是按流量收費,這些都是需要考慮的問題。手機在網路間的切換,又會造成底層網路斷線、地址變化等問題,都是常見的情況。這些問題的統一解決手段,最重要的是通盤考慮各種需求,選擇一個合理的遊戲狀態同步模型。

1458473876954468.jpeg
(不同網路之間的網路延時)

騰訊在大量遊戲開發的實踐中,總結出三種遊戲的同步模型:

第一種叫MMOG模式。這種同步模型,在端遊時代就使用的非常廣泛,特別是MMORPG裡面。它的主要實現要點是:伺服器負責計算全部的遊戲邏輯,並且廣播這些計算的結果,客戶端僅僅負責傳送玩家的操作,以及表現收到的遊戲結果。一般來說,玩家傳送一個操作到伺服器上,伺服器根據玩家操作去修改記憶體中的遊戲世界模型,同時運算遊戲世界對這個操作的反應,然後把這些反應都廣播給相關的多個客戶端,每個客戶端負責把這些資料表現出來給玩家看。這種法的優點是非常安全,由於整個遊戲邏輯都在伺服器上,伺服器只接受合法的玩家操作,一切都經過既定邏輯的運算。

另外一個優點是遊戲的邏輯更新很方便,因為主要邏輯都在伺服器端。一般的遊戲玩法需要更新,遊戲開發團隊自己更新重啟伺服器就可以了,無需讓千萬個手機去下載更新包。但是這種做法的缺點也很明顯,首先就是使用者的體驗非常依賴網路質量,如果一個使用者的網速慢,其他玩家都會發現他在遊戲中明顯的變卡。

另外一個缺點就是伺服器負責了太多的遊戲邏輯運算。在動作遊戲裡,伺服器往往需要針對二維或者三維空間進行運算。最後,使用這種同步方案,由於每個遊戲表現都要以資料包發往客戶端,所以當一起玩的使用者數量較多,這種廣播的資料包量就會非常大。因此根據以上的特點,騰訊一般會在那些同局遊戲人數不太多,但講求玩法變化快和安全性高的遊戲中採用這種同步方案。騰訊自研手遊中比較著名的《穿越火線·槍戰王者》、《全民超神》、《炫鬥之王》都是使用這種方案。

1458473876914398.jpeg

關注點

表現

網路延遲

< 100ms

流量

佔用較大,同時遊戲角色越多佔用越大

伺服器負載

非常高

安全性

很好,能很方便的做反外掛。

第二種方案叫主機模式。這種同步方案的做法是:以參與對戰的一個客戶端為“主機”,其他的客戶端為“副機”。遊戲邏輯的主要運算由 “主機”完成,所有的“副機”把操作指令,通過伺服器中轉,集中傳送給“主機”;“主機”完成遊戲運算後,把結果指令再通過伺服器中轉,廣播給所有的“副機”。

這個方案看起來有點奇怪,但是卻有很明顯的優點:首先是大量的實時動作遊戲,其遊戲過程的邏輯程式碼,都是在客戶端上開發和執行的。客戶端的遊戲引擎對於二維、三維空間中的位置運算、碰撞檢測等功能,都有很好的支援。因此把整個遊戲邏輯由客戶端負責,就能讓伺服器端無需再開發這部分功能。伺服器只負責做轉發、廣播的操作,所以能承載的人數和第一種方案有數量級上的差別。

由於“主機”客戶端運行遊戲邏輯,所以其體驗是最好的,就算“副機”由於網路不佳造成體驗下降,對於“主機”來說,只是發現“副機”動作有點遲緩而已。在以PVE玩法為主的遊戲中,使用者關注的是自己的體驗,不會太在意同伴的準確動作,這種情況下,主機模式就是一種不錯的同步方案。騰訊的《全民飛機大戰》的雙打模式就是採用這種方式,效果相當不錯。

1458473878382963.jpeg

關注點

表現

網路延遲

< 400ms

流量

一般,大概為MMOG模式一半

伺服器負載

安全性

較差,比較容易通過修改客戶端作假

第三種方案叫幀同步模式,又叫“鎖步模式”。這種模式用形象的比喻來說,就是把所有參與對戰的客戶端,看成是排成一列的囚犯。這些囚犯們的左腳都被鏈子所在一起,因此他們如果要往前走,就只能同時邁步,如果其中某個人走快了,或者走慢了,都會讓整隊人停下來。

在實現上,一般是以伺服器按固定的幀率,來蒐集每個客戶端的輸入,然後把這些輸入廣播給所有的客戶端;由於每個操作指令到達所有客戶端的時間(幀)都是一樣的,所以每個客戶端運算的結果也是一樣的,同樣的輸入就會得到同樣的結果。這就好像:其他玩家通過網路,把操作手柄接到你的手機。這種同步方案,是傳統單機-局域網遊戲中最常用的。這種同步模型的最大優點是:強一致性。每個客戶端的表現是完全一樣的,非常適合高度要求操作技巧的遊戲。由於廣播的僅是玩家的操作,所以資料量很少。不管遊戲中的角色數、狀態量有多大、多複雜,都不會影響廣播的資料量。

但是這個方案也有缺點:對所有玩家的延遲都有要求,一般來說要求在50毫秒以內。如果有一個客戶端網路卡了,所有的客戶端都要停下來等,大家在玩《星際爭霸》就見識過:一個玩家斷線,全部玩家的遊戲都暫停。騰訊遊戲中的《王者榮耀》、《全民突擊》由於競技性非常強,所以採用了這種方案。

另外在幀同步模式中,資料同步的頻率較高,網路延遲越小越好。由於TCP的滑動視窗機制和重傳機制,導致延時無法控制,因此幀同步一般採用udp進行網路傳輸,但udp又會衍生出可靠性問題,對於客戶端,如果某些udp包沒有收到,就會出現丟幀的情況,所以這裡我們自己研發了一套《可靠UDP傳輸》的協議,應用在《王者榮耀》專案。關於《可靠UDP傳輸》的相關技術介紹,後續會作為專題繼續分享給大家。

1458473879322808.jpeg

關注點

表現

網路延遲

< 50ms

流量

很小

伺服器負載

安全性

差,遊戲邏輯主要依賴客戶端

安全問題

遊戲外掛,一直是國內遊戲市場的痼疾。在實時對戰的遊戲中,常見的有修改客戶端程式碼執行時邏輯、協議破解,以及指令碼代替玩家行為等外掛。對此,我們花了很大力氣,從遊戲的內部結構上,對抗這些破壞遊戲性的行為。現在比較常用的手段有四種:

第一種是伺服器驅動。在同步模型中的”MMOG模型”中,遊戲邏輯都由伺服器控制,所以外掛能攻擊的空間比較小,這是最好的對抗外掛的方法。由於邏輯全部在伺服器上運算,所以外掛幾乎無法從遊戲邏輯中得到任何好處,只能在降低玩家操作難度上想辦法。但是這種方案的代價也是高昂的:伺服器需要儲存整個遊戲世界的模型,並演算所有的AI邏輯,這讓伺服器消耗大量記憶體和CPU,增加了伺服器端程式碼的複雜性。

1458473879920492.jpeg

第二種是MonoSvr抽查回放。這種方法是在第一種伺服器驅動方案上的一種簡化:客戶端還是會上傳所有的遊戲操作,但伺服器並不完全的演算整個戰鬥邏輯,僅對容易被外掛攻擊的部分,進行驗證。伺服器上僅保留部分世界模型即可,從而降低了伺服器的運算量。客戶端並不需要等待伺服器的命令回覆,就可以先按自己的邏輯去執行,所以體驗上有更好的表現。如果伺服器發現了作弊,會事後懲罰相關的帳號。這種做法也有漏洞:因為那些沒有被抽查到的客戶端,或沒有被驗證的邏輯,都可能是外掛攻擊的漏洞。

1458473880892350.jpeg

第三種是柔性反外掛。這種方法的校驗更加簡單,僅僅在伺服器上保留了一批預設的校驗規則。這些規則可能是核算玩家的收益和付出是否合理、一些重點操作是否符合規則。這種方案伺服器的壓力非常的輕。由於驗算的過程大大的加快了,玩家的體驗也會很好。不過這種方法的漏洞更加多,一旦外掛熟悉了這些預設的校驗規則,就很容易進行鍼對性的攻擊。

1458473880466188.jpeg

第四種是舉報系統。這種方法簡單來說就是人民戰爭,讓玩家發起舉報請求,然後伺服器再蒐集模擬被舉報者的行為證據,進行鍼對性的驗證和懲罰。但這種民不舉官不究的做法,很容易被有意識的互刷所利用。這種方案有一定的漏報機率,因此往往是作為其他幾種驗證機制的後備機制,一起使用。

以上四種,在騰訊的遊戲中,往往都是結合起來使用。在實時對戰遊戲中,我們除了要關注驗證的準確性外,同時還需要平衡遊戲體驗。因此往往需要在很多地方做妥協,但是隻要我們有足夠多的手段複合使用,真正的漏網之魚還是很少的。

版本更新問題

手機遊戲的版本更新問題由來已久,讓使用者升級手機上的程式是非常不容易的。經常會出現以下問題:

  • 手機記憶體小,更新的過程較容易崩潰;

  • 移動裝置的網路環境很不穩定。經常下載到一半,使用者走出了wifi範圍或者進了電梯,網路中斷了。

  • 應用商店的版本稽核。什麼時候能稽核通過往往不能預測,對於緊急的BUG來說更是遠水救不了近火。

然而,實時對戰遊戲由於強調競技性,所以玩法邏輯常常需要進行小的調整優化。並且實時對戰的玩法內容需要持續更新,所以經常都需要更新很多程式,在現有的條件下,如果只是簡單的按部就班發版本,估計玩家早就跑光了。

從一些自研遊戲發版本時的運營資料來看,如果在遊戲內進行資源更新,可以做到99.5%以上的成功率的。但是,如果要釋出一個程式包版本的更新,成功率往往就會跌至90%以下。所以每次釋出版本,一些遊戲的線上人數會下降10%,這對於遊戲運營來說,是一個巨大而持久的損失。因此,熱更新技術是現在的主流版本更新方式。把程式程式碼,以指令碼來編寫,然後使用一個優秀的指令碼解析器來執行,就能讓程式程式碼以文字資源的形式,和圖片、聲音等其他遊戲資源一樣更新下載了。

我們自己開發了一個xLua執行庫,這個庫能在Unity3D引擎中執行lua指令碼,並且其執行的效率非常高,還能無縫的在指令碼中呼叫遊戲引擎的API。這樣,我們就可以儘量少的釋出新的程式版本,大部分的遊戲內容玩法調整,都使用lua指令碼更新來實現。由於使用了資源更新的方式來更新遊戲,現在遊戲的更新成功率普遍可以達到99.8%左右,並且避免了應用商店的稽核,使iOS和Android使用者同時玩上游戲的最新版本。

玩家實時溝通

在傳統的端遊中,玩家在遊戲過程中往往會通過鍵盤打字溝通。後來有一些第三方語音聊天軟體,充當了遊戲過程中實時溝通的工具。在實時對戰的遊戲中,和隊友的配合往往是遊戲的重要樂趣來源,因此實時的溝通非常重要。所謂的“開黑”,就是表示一個溝通良好的遊戲夥伴小組,一起和其他玩家對戰,順暢的溝通能帶給玩家巨大的競技優勢。

然而,在手機遊戲中,螢幕一般都比較小,不可能有空間來讓玩家打字輸入,況且如此激烈的實時戰鬥,也沒有時間去慢慢的打字。因此自然很多人想到像PC上一樣,執行一些實時聊天的語音軟體,來輔助遊戲溝通。但是手機作業系統和Windows不一樣,在手機上執行的後臺軟體,除了會嚴重降低手機執行效能外,還可能被作業系統暫停和關閉。所以遊戲+語音工具的路子是走不通的。這時,就需要遊戲開發團隊,為玩家在遊戲中,直接提供實時語音的服務。

騰訊自研的兩款大作《王者榮耀》、《穿越火線手遊》為了改善玩家在PVP對戰時的溝通體驗,率先使用了騰訊內部的實時遊戲語音服務。從上線後玩家反饋的效果來看,這一功能對維持使用者活躍非常有價值。從運營統計資料來分析,有30%的玩家會主動說話,每人單局的語音會超過30秒,累計用過語音的玩家超過85%——這些資料都說明了語音服務是實時對戰遊戲玩家需要的功能。所以騰訊後續在所有32款對戰遊戲中,都加入了遊戲實時語音服務。後面騰訊也會開放出這一技術為所有遊戲開發者服務。

結束語

實時對戰遊戲的核心技術難點,主要是解決資料同步問題及弱網路下玩家的遊戲體驗優化。沒有一款通用模型可以用於所有遊戲,根據自己遊戲的模型,設計出合理的遊戲架構,才能讓遊戲的PVP體驗趨於完美。