王者榮耀成功的背后,看騰訊是如何針對(duì)自家產(chǎn)品做底層支持的
騰訊作為游戲界的巨頭,旗下游戲項(xiàng)目眾多,涉及品類也十分廣泛,在騰訊游戲取得的矚目成績之下,離不雄厚的開底層技術(shù)積累所提供的支持。在騰訊體系下,已經(jīng)可以實(shí)現(xiàn)依靠一套通用的底層技術(shù)實(shí)現(xiàn)多品類游戲開發(fā),并解決多品類游戲研發(fā)和運(yùn)營中出現(xiàn)的各種問題。
技術(shù)人員作為騰訊這個(gè)巨擘的幕后英雄鮮少走到臺(tái)前被人們所熟知,但在今年ChinaJoy期間的中國游戲開發(fā)者大會(huì)上,來自騰訊的資深技術(shù)人員吳嘉偉為大家分享了騰訊底層技術(shù)這么多年來積累下來的經(jīng)驗(yàn)。
龍虎豹將他的演講內(nèi)容進(jìn)行了整理,由于并非專業(yè)技術(shù)人員,在聽寫過程中可能會(huì)出現(xiàn)錯(cuò)誤,歡迎讀者朋友指正。
以下為吳嘉偉的分享。
我今天分享的題目是“談騰訊精品游戲的基礎(chǔ)技術(shù)體系”,有一個(gè)問題是,到底什么是基礎(chǔ)技術(shù)?基礎(chǔ)技術(shù)這里我做一個(gè)簡(jiǎn)單的定義,我認(rèn)為它說的是圍繞游戲新玩法這樣一些底層技術(shù)的集合。那么,底層技術(shù)它也分了很多,怎么去做一個(gè)分類呢?我這里大概就簡(jiǎn)單分了有六個(gè),第一類大概就是引擎技術(shù),引擎技術(shù)其實(shí)也有很多這種細(xì)分的品類,比如像2D的引擎,它可能更強(qiáng)調(diào)打擊感,像3D引擎可能它更強(qiáng)調(diào)是用戶上手的程度,像Hero引擎就更加強(qiáng)調(diào)游戲畫面的寫實(shí)性。下一個(gè)比較重要的技術(shù),就是整個(gè)游戲的基礎(chǔ)框架,基礎(chǔ)框架實(shí)際上它是決定著游戲在上線之后的過程中,整體運(yùn)行的一個(gè)效果,那么同時(shí)它也是決定游戲在研發(fā)初期,去快速完成代換的這樣一個(gè)可行性。 第三個(gè),就是網(wǎng)絡(luò)通訊部門,其實(shí)一直都是網(wǎng)絡(luò)游戲開發(fā)以來比較基礎(chǔ)的模塊,但是現(xiàn)在談的更多是在弱網(wǎng)的條件下,技術(shù)模塊的效果,以及在全球發(fā)行化的過程中,整個(gè)的網(wǎng)絡(luò)通訊的方案。
音視頻技術(shù),其實(shí)很早以來都是整個(gè)游戲里面比較基礎(chǔ)的模塊。好像它和一個(gè)游戲整體的玩法沒有太大的聯(lián)系,隨著現(xiàn)在游戲整體品類不斷的發(fā)展,其實(shí)我們看到現(xiàn)在有越來越多的項(xiàng)目,像狼人殺、MOBA、FPS游戲里面的這種組隊(duì)開黑的玩法,其實(shí)也逐漸碰到這樣一些核心的玩法。關(guān)于測(cè)試這方面,其實(shí)它主要是保證整體測(cè)試,保證游戲在整體發(fā)布之后的整體質(zhì)量。游戲安全這一部分其實(shí)很簡(jiǎn)單,主要是保證整個(gè)游戲的一個(gè)公平性,以及個(gè)人財(cái)產(chǎn)的安全性。我今天主要是圍繞技術(shù)框架,網(wǎng)絡(luò)通訊以及音視頻相關(guān)的給大家做一個(gè)簡(jiǎn)單的分享。
我們來看一下騰訊基礎(chǔ)的底層框架,實(shí)際上它經(jīng)過了十多年的發(fā)展,從最開始端游的時(shí)候發(fā)展而來,不管是從網(wǎng)絡(luò)介入,還是從數(shù)據(jù)存儲(chǔ),從數(shù)據(jù)的描述和表達(dá)到底層的小型中間件;從與游戲邏輯相關(guān)的一些特性,包括到整體的逐漸的管理,運(yùn)營用戶的與數(shù)據(jù)相關(guān)的附件,都有相應(yīng)的一些設(shè)計(jì)。在整體的組件里面有幾個(gè)比較關(guān)鍵的技術(shù),第一個(gè)是Debussy技術(shù),它其實(shí)主要是負(fù)責(zé)基層間通訊或者是跨界通訊的這樣一個(gè)技術(shù)。另外一個(gè),是一個(gè)叫做T/R的組件,這個(gè)組件主要是負(fù)責(zé)數(shù)據(jù)的序列化以及轉(zhuǎn)序列化相關(guān)的這樣一些工作。同時(shí)它還有各種數(shù)據(jù)表達(dá)的這樣一些能力,比如說像內(nèi)存、文件或者是excel等等,只要有基于TGR數(shù)據(jù)的描述,都可以相互地轉(zhuǎn)告或者是打通。另外一個(gè),實(shí)際上重要的是Torm組件,其實(shí)是一個(gè)數(shù)據(jù)關(guān)系對(duì)象的組件,它能夠?qū)qsql表的管理縮減為整個(gè)對(duì)象管理。
在端游時(shí)代,實(shí)際上分區(qū)分服這種架構(gòu)設(shè)計(jì),整體對(duì)數(shù)據(jù)庫的壓力其實(shí)不是太大,隨著手游玩法的變更,全區(qū)全服這種結(jié)構(gòu)似乎越來越盛行,那么我們也發(fā)現(xiàn)到,qver存儲(chǔ)效似乎護(hù)會(huì)更高一點(diǎn)。在此基礎(chǔ)上,我們開發(fā)一個(gè)叫做techbus的組件,這個(gè)組件主要是能夠在海量的用戶中,從一個(gè)比較好的性能,成本之間達(dá)到一個(gè)比較好的效果。其實(shí)隨著整個(gè)底層框架時(shí)間的發(fā)展,我們其實(shí)發(fā)現(xiàn)整個(gè)組件規(guī)模越來越大,參數(shù)也越來越多,編程也越來越復(fù)雜,整體升級(jí)以后的難度也越來越高。在此基礎(chǔ)上,我們將這些離散的組件把它集合起來,然后統(tǒng)一優(yōu)化,形成優(yōu)化的這樣一個(gè)服務(wù),這個(gè)也大大加速了整體游戲接入的一個(gè)效果。剛剛講的大概是基礎(chǔ)組件以及整個(gè)在服務(wù)化引進(jìn)的相關(guān)的一些事情,實(shí)際上后臺(tái)的這樣一些框架組件,其實(shí)他們扮演的是幕后英雄這樣一個(gè)角色,很難被前端用戶或者大部分玩家感知到。而我們能感受到的,包括比如說像游戲下載速度是不是夠快,或者是不是很好地能夠去體驗(yàn)到副本的一些玩法。那么我在整個(gè)接入的過程中,是會(huì)出現(xiàn)這種卡頓的這樣一些情況,包括說我在與人副本會(huì)在溝通的過程中,或者說在開黑的過程中,整體語音的這種交互是否是足夠地清晰,實(shí)際上這些是能夠被用戶所感知到的。
接下來,我將從技術(shù)基礎(chǔ)它如何去改善用戶體驗(yàn)的這樣一些角度去做一些簡(jiǎn)單的分享。我們首先看一下整體的一個(gè)游戲中心;第二我會(huì)介紹網(wǎng)絡(luò)相關(guān)這樣一些模型,包括像對(duì)戰(zhàn),像MMO這些接入的問題;第三個(gè)主要是會(huì)介紹一下整體的語音在游戲中應(yīng)用的這樣一些情況,第四個(gè)就是講一下我們整個(gè)游戲一個(gè)對(duì)外服務(wù)或者對(duì)外推廣的情況。
我們首先看一下游戲更新這一塊主要挑戰(zhàn)大概是什么。其實(shí)這里它們會(huì)存在兩個(gè)矛盾。第一個(gè)矛盾,就是說游戲安裝越大,然后推廣成本越高,簡(jiǎn)單來講,一個(gè)100兆的包想把它推廣下去,或者一個(gè)150兆的包想推廣下去,其實(shí)這整個(gè)成本是不太一樣的。第二個(gè)就是說對(duì)于整體的分發(fā)類的用戶問題,其實(shí)在整個(gè)一個(gè)分布的環(huán)節(jié)下都會(huì)存在這樣一個(gè)問題,那就是劫持問題。這些問題到了最關(guān)鍵的因素,就是整個(gè)游戲業(yè)務(wù)在推廣或者說在活躍回復(fù)的情況下,可能是說沒有達(dá)到你的預(yù)期,因此整個(gè)的一個(gè)下載更新或者整個(gè)推廣的一個(gè)方案,需要在整體的唯獨(dú)去考慮一些事情,怎么去解決這樣一些問題。
騰訊的游戲更新的方案,實(shí)際上它是一個(gè)以底層為基礎(chǔ),然后在上面逐漸去擴(kuò)展的方案。首先,本身必須有這樣一個(gè)海量的支撐,有tv級(jí)別帶寬輸出的這樣一個(gè)穩(wěn)定,在全國的范圍內(nèi),都有相應(yīng)的機(jī)房的分布,實(shí)際上也就是能夠讓用戶就近訪問,能夠起到這樣一個(gè)效應(yīng),同時(shí)也能應(yīng)對(duì)突發(fā)的帶寬的一些情況。這個(gè)是在最底層的這樣一個(gè)硬件支撐層面,在整個(gè)引擎層面,它本身具備TYP的下載能力,同時(shí)它也具備一些抗劫持的能力。它本身交驗(yàn)這樣一些方式,所以能夠經(jīng)常地去發(fā)現(xiàn)環(huán)境或者發(fā)現(xiàn)被劫持的這樣一個(gè)情況,整個(gè)分析策略上,實(shí)際上可以分為差異分析、簡(jiǎn)單分析,同時(shí)也可以在多個(gè)電子市場(chǎng),也會(huì)存在多渠道發(fā)布的這樣一些問題。那在整個(gè)更新的方案上,可以簡(jiǎn)單地把它劃分為程序的資源更新以及熱更新和動(dòng)態(tài)下載這樣的情況。
我們首先來看一下程序資源的申請(qǐng)戰(zhàn)略情況,其實(shí)相對(duì)于整體的安卓或者是iOS這塊的升級(jí)來說,其實(shí)相對(duì)于端游——端游本身它是一個(gè)比較開放式的環(huán)境,其實(shí)不太需要去區(qū)分程序升級(jí)或者是資源升級(jí)。但是由于iOS或者是安卓的特性,它們本身是有一些沙箱的切換。所以,每次更新的時(shí)候,相當(dāng)于可能你只需要更新很少的一些資源,但實(shí)際上缺乏完整的包,實(shí)際上這兩種更新的方式效益不是太高。那么,為了解決這樣一些問題,我們實(shí)際上采取的是仿效在PC上的這種模式,把2進(jìn)制的程序的升級(jí)或者是說把資源的升級(jí)拆分得更細(xì),這樣通過這種更細(xì)的拆分來達(dá)到整體一個(gè)提高效率的目標(biāo)。那么舉個(gè)簡(jiǎn)單的例子,比如說是兩個(gè)ATK之間的兩個(gè)之間的差異更新,可能整體算下來,它們的差異大小可能只能減少10%左右的樣子,如果我們現(xiàn)在采用了純粹的程序,以及資源分離的這種方式,那么整體減少大小可以到15%或者到20%的樣子。這個(gè)是程序和資源更新的矛盾的問題。
另外一個(gè)是,對(duì)于通用的多版本發(fā)布的問題,實(shí)際上在端游的時(shí)候,我一直是采用逐版本發(fā)布的這種方式,那么這種方式的特點(diǎn)就是一個(gè)用戶如果他一周不去訪問這個(gè)游戲,那么他可以下載大量的這樣一些資源,在手游的時(shí)代,實(shí)際上大家更看重流量,是怎么樣能夠更好地幫助用戶去節(jié)省資源?那么我們采用的方法是將唯一的資源,將更新的資源,將它放置在服務(wù)器上,通過客戶端動(dòng)態(tài)服務(wù)器去計(jì)算商業(yè)對(duì)比的這種方式,來投到每個(gè)用戶不同需要下載的這樣一個(gè)最小的集合。那么,通過這種方式,實(shí)際上你會(huì)發(fā)現(xiàn)不管你是在玩《王者榮耀》也好,還是在玩其他游戲也好,不管你多長時(shí)間都沒有去更新,都只需要更新一次。另外一個(gè)問題是如何去防止劫持。實(shí)際上這種方式其實(shí)也是一些比較常規(guī)的,或者說大家在業(yè)界比較通用的一些做法。簡(jiǎn)單來說,就是一個(gè) URL。然后, https,也會(huì)有一些資源或者在類似的時(shí)間上的這種方式去繞過時(shí)間劫持的情況。但同時(shí),也需要去做好相應(yīng)監(jiān)控的工作,因?yàn)樵谝恍┐笠?guī)模發(fā)布或者在更新的過程中,經(jīng)常會(huì)發(fā)現(xiàn)某一個(gè)省或者市出現(xiàn)大面積劫持的情況。那么我們整體系統(tǒng)要好好地去反饋出這一點(diǎn),公司也有相應(yīng)的這樣一個(gè)機(jī)制幫我們?nèi)プ鲆幌?,這個(gè)事情現(xiàn)在大概就介紹到這里。
我們看下一部分,從整各游戲資源質(zhì)量保證的方式來看,實(shí)際上會(huì)經(jīng)過很多輪外網(wǎng)恢復(fù)測(cè)試。可能第一輪10萬用戶通過這樣一些規(guī)模,第二個(gè)就是其他的一些用戶。但是最終發(fā)現(xiàn)了一個(gè)問題是什么?就是不管你去經(jīng)過多少外網(wǎng)用戶測(cè)試的情況,最終你都會(huì)發(fā)現(xiàn)整個(gè)程序一定會(huì)存在大量問題。為了去解決這樣一些問題,實(shí)際上整個(gè)熱更新的環(huán)節(jié),在整各游戲里面是比較剛需的問題。熱更新從方案上來看,其實(shí)可以分為安卓的方案,因?yàn)楸旧戆沧克强梢匀ゼ虞dSO的,簡(jiǎn)單來說由于一個(gè)函數(shù)問題,函數(shù)地址的這種替換跳轉(zhuǎn)的這種方式,再去加載一個(gè)新的SO,這個(gè)新的SO肯定是對(duì)以前的SO有個(gè)小的規(guī)模,這種方式實(shí)際上就是一個(gè)比較傳統(tǒng)的APP的更新的方式。另外一種方式,就是說是在iOS里面,iOS它本身因?yàn)閏ocos在游戲里面應(yīng)用不并不多,在整個(gè)游戲?qū)嶋H上還是unity引擎會(huì)更多一點(diǎn)。在這種情況下,實(shí)際上是需要一個(gè)游戲的APP去起承一些類似于解釋器的環(huán)境,再通過腳本運(yùn)行的方式來打造替換。
業(yè)界一般的做法,是插入了Lua,我們是采用XLua的方式, XLua它本身具有三個(gè)特點(diǎn):第一個(gè)特點(diǎn),是說XLua它的系統(tǒng)會(huì)非常高,主要是通過數(shù)據(jù)在序列化和反序列化 的過程當(dāng)中,將C# 把它下載到native。那么這樣的話,就可以做到這個(gè)項(xiàng)目完全沒有這些,因?yàn)檫@個(gè)也是與其他的XLua。第二個(gè),整體來說, XLua現(xiàn)在來說還是非常方便的。它主要是通過空間層代碼的這種方式,它可以將一個(gè)C#類對(duì)象這樣一些簡(jiǎn)單數(shù)據(jù)類型標(biāo)記出來,在Lua之間形成這種無縫穿插,這樣的話其實(shí)也就方便了一些開發(fā)者和用戶針對(duì)這種數(shù)據(jù)類型一個(gè)一個(gè)去展開。第三個(gè)是關(guān)于hotfix熱更新的操作,其實(shí)它是可以自動(dòng)地去申請(qǐng)埋點(diǎn)的代碼,可以做到在危急時(shí)刻,能夠?qū)φw的這種方法,操作類服務(wù),屬性事件或者是函數(shù)能夠無縫做到從私下切換成Xlua的實(shí)現(xiàn)。
另外一個(gè),是關(guān)于動(dòng)態(tài)下載。其實(shí)現(xiàn)在大家在用因特網(wǎng)之后,其實(shí)也可能會(huì)感覺到,如果你是一個(gè)500兆的安卓包或者是100兆的安卓包你的承接重要成本是不太一樣的,我們一直在這塊做了相應(yīng)的裝接工具。簡(jiǎn)單來說是一個(gè)動(dòng)態(tài)下載的方式,對(duì)于業(yè)務(wù)這一層來說,需要做的事情就是說需要提供一個(gè)資源分析的這種過程,能夠把必要資源和非必要資源給分離出來,再通過我們的工具可以做成一個(gè)相對(duì)比較經(jīng)典的包。對(duì)于玩家這一部分來說,主要一個(gè)問題是,玩家在使用游戲體驗(yàn)的安裝包的情況下,通過怎么樣的策略和方式,能夠去達(dá)到比較無損的體驗(yàn)。
在這里其實(shí)我們的動(dòng)態(tài)下載系統(tǒng)大概做了兩件事情,第一件事情就是通過按需下載這種方式,對(duì)有些資源去做一些區(qū)別管理,那么這個(gè)管理實(shí)際上是對(duì)必要資源和非必要能夠做一個(gè)統(tǒng)一的管理,不僅是從升級(jí)的這個(gè)流程上,還是說從讀取的這種方式上,都能夠做到在邏輯審批上一致。這樣的話,使用起來才會(huì)非常得方便。第二部分是安全下載的一個(gè)過程,我們實(shí)現(xiàn)了一個(gè)比較好的優(yōu)先級(jí)的通道機(jī)制。簡(jiǎn)單來說,比如在一張地圖里面,在我視野范圍內(nèi)的這樣一些NPC也好,或者是說玩家也好,它是一個(gè)二位進(jìn)制 的是也去做一個(gè),而在我們視野之外的這樣一些物部件,是以自衛(wèi)的這種方式。那么可能在一些特殊的場(chǎng)景地圖里面,也會(huì)采用一些預(yù)判或者AI的方式,能夠提前知道用戶它可能會(huì)要發(fā)生什么劇情,那么通過這種方式的話,我們可以盡量讓有損的體驗(yàn)變得無損。
我們先看一下網(wǎng)絡(luò)接入的情況,首先看一下整體的一個(gè)大盤還是這樣一個(gè)數(shù)據(jù)。實(shí)際上,我們可以從上面這張圖可以看到,目前的話大概是占65%的情況,實(shí)際的這樣一種用戶,看完以后馬上也要進(jìn)入到5G時(shí)代,但是從我們整個(gè)海量的數(shù)據(jù)分析來對(duì)比,我們對(duì)比2013年的時(shí)候手游最開始的一個(gè)情況,以及2017年這樣一個(gè)情況,我們可以發(fā)現(xiàn)隨著基礎(chǔ)設(shè)施的建設(shè),整體的物理面度的質(zhì)量相對(duì)于手游初期的時(shí)候越來越好,但是因?yàn)閣ifi這樣一種上網(wǎng)其實(shí)本身它會(huì)導(dǎo)致網(wǎng)絡(luò)閃斷,切換以及流動(dòng)這樣一些問題,可能會(huì)影響用戶體驗(yàn)。有了這樣一些基礎(chǔ)的數(shù)據(jù),其實(shí)我們可以對(duì)于游戲業(yè)務(wù)來說,他們需要關(guān)注的是在現(xiàn)有的網(wǎng)絡(luò)質(zhì)量一個(gè)情況下,游戲的玩法怎么樣能夠做到比較好的匹配。首先,看一下對(duì)于基本通用的這種方式,那么這種方式其實(shí)也是目前大部分手游應(yīng)用到,或者端游頁游應(yīng)用,這種方式主要是想去解決兩個(gè)問題。
第一個(gè)問題,是本身騰訊的賬戶體系它非常多,既有手游基于ONI的方式,那么同時(shí)也有基于端游的方式。在頁游的時(shí)候,可能還會(huì)存在一些三方打通的方式,比如說我想是基于微信的方式,實(shí)際上都是以云端為核心的賬號(hào)體系。如果這么多的接入方式把它放在整個(gè)的電路設(shè)備來看,實(shí)際上這個(gè)跟game sever就會(huì)非常得多,那它整個(gè)邏輯就顯得不夠純粹。因此在整體的game sever之前,我們加入了一個(gè)叫做中間件這樣一個(gè)組件。這個(gè)組件程主要一個(gè)功能就是說我可以再建立一個(gè)TCP或者UVP基礎(chǔ)之上,能夠建立一個(gè)抽象安全的通道,同時(shí)能夠把平臺(tái)的健全或者是說賬號(hào)體系能夠把它給分離出來,那么對(duì)最終的gamesolo來說,它需要做的一件事情就是知道我進(jìn)去過,還是沒有通過。那么我們到底是在哪個(gè)平臺(tái)去做的健全,最終的一個(gè)賬號(hào)體系是什么樣子的。那么,為了屏蔽這種賬號(hào)體系的差異性,我們甚至做了一些賬號(hào)縮小的事情,這樣對(duì)業(yè)務(wù)現(xiàn)在看起來,整個(gè)的賬號(hào)能夠形成一個(gè)統(tǒng)一的完整的系統(tǒng)。
這個(gè)是在前端我們?nèi)プ龅倪@樣一些工作,那么在后端,我們是將與游戲玩法之外這種可以相互提煉的這樣一些邏輯,我們是把它給集中起來,就是像這些排行或者支付這樣一些游戲的邏輯關(guān)系的這樣一些服務(wù)集中起來。其中的這種模塊化的方式提供給game server,其實(shí)也是它整個(gè)的一個(gè)開發(fā)的效果。這種方式是比較常規(guī)的一種,因?yàn)閷?duì)于剛剛看到那種統(tǒng)一進(jìn)入的方式,實(shí)際上它是一個(gè)單點(diǎn)切入的模型。單點(diǎn)切入的模型其實(shí)比較適合于早期的手游或者端游。簡(jiǎn)單來講,就是客戶端去計(jì)算一個(gè)分?jǐn)?shù),計(jì)算完分?jǐn)?shù)之后,再把它上報(bào)到服務(wù)器,服務(wù)器最終再對(duì)接到數(shù)據(jù)庫里面。實(shí)際上這種方式的話,存在一些管理上面一些弊端,如果是去承載MMO或者RPG這樣一些玩法,我們會(huì)經(jīng)常發(fā)現(xiàn)一些跳線的問題。所謂跳線就是說,我從一個(gè)地圖跳到另外一個(gè)地圖,或者從技術(shù)上來講,就是說我從一個(gè)服務(wù)器斷開然后我要去連接到另外一個(gè)服務(wù)器。那么,在端游的時(shí)候,這種體驗(yàn)在物網(wǎng)這種環(huán)境下,其實(shí)相對(duì)來說會(huì)顯得比較平滑,到手游的時(shí)候,實(shí)際上這種方式我們?cè)絹碓接X得它會(huì)覺得這種給用戶帶來體驗(yàn)會(huì)非常得差,特別是說在一個(gè)地圖結(jié)合的部分,如果反復(fù)地這種切,實(shí)際上效果會(huì)非常不好。那么,另外一個(gè)問題就是對(duì)于整體后臺(tái)系統(tǒng),其實(shí)有比較大的挑戰(zhàn),因?yàn)槟銜?huì)不斷地去跟登錄然后再去數(shù)據(jù)庫拉取相應(yīng)的信息,然后會(huì)導(dǎo)致邏輯問題。我們提出了一種新的通訊的方式,它是一個(gè)叫做網(wǎng)上的通訊,這種通訊方式它有一個(gè)特點(diǎn),就是你從任何一個(gè)切入點(diǎn)去切入,實(shí)際上你都可以將消息投接其他的邏輯結(jié)點(diǎn)上去。那么這種方式在整個(gè)MMO或者RPG模型里面,能夠比較好地去解決就是用戶跳線的問題。
然后第三個(gè),是最近比較火的關(guān)于PVP對(duì)戰(zhàn)這樣一個(gè)模型。實(shí)際上,對(duì)于PVP對(duì)戰(zhàn)來說會(huì)有兩種方式,第一種就是C/S模型,C/S模型它簡(jiǎn)單來說就是客戶端里服務(wù)器去做免測(cè),最終是以服務(wù)器計(jì)算的這樣一個(gè)效果為主。但是C/S這種方式,它有一個(gè)比較好的特點(diǎn),就是客戶端可以去表現(xiàn)。因?yàn)槟阕罱K以服務(wù)器的機(jī)構(gòu)為準(zhǔn)的話,我們服務(wù)器告訴我需要怎么去做就好。實(shí)際上,我們可以看到,這種方式它對(duì)于網(wǎng)絡(luò)要求的其實(shí)沒有那么得敏感,因?yàn)閷?duì)于C/S模型來說,他們有很多的這種差幀或者表現(xiàn)的這樣一些操作方。其實(shí)我們可以看到LOL就是一個(gè)簡(jiǎn)單的C/S模型,那么在150-200毫秒這種情況之下,我們可以看到它這里的表現(xiàn)還是相當(dāng)?shù)钠椒€(wěn)。
另外一種PVP的模型,是幀同步模型,這種模型它起源于早期的類似于《星際爭(zhēng)霸》這種游戲,因?yàn)橐恍l件上的限制,導(dǎo)致了它必須采用很少的數(shù)據(jù)捕獲方式來達(dá)到自己這種比較大規(guī)模的數(shù)據(jù)同步。幀同步的模型來說,實(shí)際上我覺得它比較適合早期的這種原型的開發(fā)。簡(jiǎn)單來說,就是客戶端將一些簡(jiǎn)單的工作序列把它發(fā)給服務(wù)器,讓服務(wù)器去做組成或打包相應(yīng)的工作,然后再去做一個(gè)廣播。因此對(duì)服務(wù)器來講,它的整體的承載相對(duì)來說會(huì)比較高,它的并發(fā)性也會(huì)比較高,但是不好的地方是,它將的邏輯都集中在客戶端,那么在這里對(duì)于客戶端來講,會(huì)有兩點(diǎn)非常關(guān)鍵,第一點(diǎn)就是本身客戶端的性能,如果很難去達(dá)到性能要求的話,其實(shí)這種方式就很難適用在這個(gè)游戲里面,舉個(gè)簡(jiǎn)單例子,比如說我們?cè)凇缎请H》里面可以看到16位數(shù)的快放的這樣一些情況。假如說在整體的某一個(gè)游戲里面,如果是不能夠再渲染或者在其他的邏輯跟上這樣的目的,其實(shí)就很難適應(yīng)這個(gè)模型。另外一點(diǎn),幀同步這種模式實(shí)際上它對(duì)整體網(wǎng)絡(luò)的抖動(dòng)影響是非常得敏感,因?yàn)樗械谋憩F(xiàn),包括計(jì)算都集中在客戶端。這樣來說,實(shí)際上我們可以看到整體上幀同步實(shí)際上它是一個(gè)能夠簡(jiǎn)單去開發(fā),但是你想把它做好卻很難。
我們接下來講針對(duì)這兩個(gè)模型的網(wǎng)絡(luò)優(yōu)化的問題,實(shí)際上不管是這個(gè)模型還是狀態(tài)同步 模型也好,實(shí)際上他們都很難再用以前TCP的方式來做基礎(chǔ)的傳輸模式,tcp本身其實(shí)因?yàn)樗蔷邆溥@種超時(shí)規(guī)避這樣一些機(jī)制,它不再適合作為弱網(wǎng)這種網(wǎng)絡(luò)環(huán)境下的通訊方式,本身APP它又是一種不可靠的這種實(shí)驗(yàn)方式,游戲的業(yè)務(wù)特性又要求某些消息確實(shí)是更優(yōu)的,因此在這個(gè)基礎(chǔ)上面,需要在UDP的這種方式上,去實(shí)現(xiàn)這種可靠的通訊方式。簡(jiǎn)單來說,這種可靠的通訊方式,無非是兩個(gè),一般都會(huì)采用消息重傳來實(shí)現(xiàn)其可靠性,采用消息重傳的時(shí)候有兩種方式,一種是發(fā)送者發(fā)起,另一種是接收者發(fā)起。對(duì)于發(fā)送者發(fā)起的方式的這種傳輸,實(shí)際上有一個(gè)比較關(guān)鍵的點(diǎn),就是基于一個(gè)RTT的平臺(tái)測(cè)量,在這個(gè)測(cè)量基礎(chǔ)之上,你能夠去做到快速的傳導(dǎo),RTT的這個(gè)實(shí)際上它只是一個(gè)測(cè)量,它其實(shí)是很難預(yù)測(cè)到下一秒到底會(huì)發(fā)生什么樣的問題。我們之前做過很多的這樣一些測(cè)試,比如說在PC的端游上,我們發(fā)現(xiàn)做出來的這種效果,會(huì)比TCP那種效果會(huì)好非常多,但是實(shí)際在wifi模擬的這種情況下,在外網(wǎng)運(yùn)行的情況下,確實(shí)發(fā)現(xiàn)有時(shí)候效果是不是比TCP還要差,那怎么樣去解決這樣一些問題?最簡(jiǎn)單的辦法就是看整體游戲的特性,實(shí)際上可以說是通過多位冗余,或者是通過動(dòng)態(tài)冗余的方式。這樣的話,通過流量去換延遲的這種做法,能夠在一定程度上去改善這種網(wǎng)絡(luò)擁塞的一些問題。
再看一下我們整個(gè)的一個(gè)解決方案,說一下為什么我們要去做這樣一件事情。本身騰訊整個(gè)的游戲的成分它會(huì)非常非常多,如果都采用不同的解決辦法,實(shí)際上在這里的效益,在整體的應(yīng)用上都很難地去形成一個(gè)比較快速的demo模型這樣一個(gè)過程。那么我們?cè)谡麄€(gè)構(gòu)建統(tǒng)一方案的問題上,其實(shí)也是希望說我們能夠?qū)⒌讓幼龅梅浅:?jiǎn)單,非常可靠,那么在應(yīng)用這一層其實(shí)是可以留給用戶調(diào)優(yōu)的空間。
那么,整各的這樣一個(gè)統(tǒng)一方案,簡(jiǎn)單來看,大概它分成三層,最下面的是一個(gè)傳輸層,在傳輸層首先我們可以分為用戶是一個(gè)UTP,在用戶基礎(chǔ)之上,它需要去實(shí)現(xiàn)一些可靠消息的類型,那么也需要去實(shí)現(xiàn)一些非可靠消息的類型。這里其實(shí)還有很多這樣一些細(xì)分,比如說快速可靠的消息,或者非快速可靠的這種消息,實(shí)際說我們?cè)谡麄€(gè)UDP的業(yè)務(wù)管理基礎(chǔ)之上,是做了非常多的這種測(cè)試和模擬這樣一些工作,也參考了其他的這樣一些像國外的一些游戲已經(jīng)適用網(wǎng)絡(luò)層的解決方案。實(shí)際上他們通常的一種做法,就是我需要對(duì)整個(gè)通道做一種分級(jí)的處理,這個(gè)就好比是說一條高速公路通道。你可以把它分為一個(gè)可以開到120的這種快車道,也可以分為可以開到100的慢車道,當(dāng)然也有80的這種比較慢的車道,但同時(shí)又限制你必須開到60以上,那么你才能夠在這條高速公路上比較正常地進(jìn)行。就是說對(duì)整體的流量的或者說對(duì)通訊通道的管理方式是需要有比較好的策略,才能夠保證你整體不會(huì)發(fā)生堵車,比如說你的整個(gè)的吞吐,還有包括你的延時(shí)都能夠在一定的合理范圍之內(nèi)去得到控制。
這個(gè)傳輸層,它實(shí)際上是一個(gè)最底層的這種通訊方式模型的選擇,那么在它的基礎(chǔ)之上,是相應(yīng)的邏輯層的功能,剛才我講的健全的功能,要排隊(duì)的功能,還有數(shù)據(jù)包合并、緩存這個(gè)問題,或者是加密、壓縮,防止沖擊這樣一些功能,或者作為相應(yīng)邏輯上的一些功能,他們?cè)趯徍说姆桨咐锩?,那么在整個(gè)的一個(gè)監(jiān)控模型上又會(huì)分為單點(diǎn)的模型,以及網(wǎng)上的模型。它也是一個(gè)不同游戲模型的選擇。那么對(duì)于業(yè)務(wù)來說,他們可以分為一個(gè)公共層的這種邏輯,比如健全排隊(duì),還有強(qiáng)壓縮等等,那么也有分為它私有的一些邏輯,比如說它的移動(dòng)包,它的攻擊包,這些是可以看成一個(gè)可丟失的輸入。對(duì)于說像買一個(gè)裝備或者是說去換槍,最終的數(shù)據(jù)結(jié)算上報(bào)到系統(tǒng),這個(gè)也是后來作為一個(gè)比較單面的數(shù)據(jù),這個(gè)是整體的一個(gè)解決方案。
前兩天大家還看到一個(gè)新聞,就是說我們現(xiàn)在到底是音頻時(shí)代還是視頻時(shí)代。實(shí)際上關(guān)于語音這一部分,我們正好是在2015這個(gè)點(diǎn),正好是在行業(yè)里面視頻還是在發(fā)展,然后大家相互去競(jìng)爭(zhēng)的這種情況下,其實(shí)沒有對(duì)語音的這個(gè)細(xì)分的市場(chǎng)去做一個(gè)比較全面的這樣一個(gè)分析。然后,可能我們看到的這樣一些機(jī)會(huì),推出的一個(gè)叫GVoice的產(chǎn)品,它目前也是放在騰訊這樣一個(gè)有游戲服務(wù)的團(tuán)隊(duì)。它的一個(gè)主要方式是想說全面提升整體游戲的交互的體驗(yàn),從目前運(yùn)行的這個(gè)情況來看,實(shí)際上從某些維度上,它的整體的一個(gè)話務(wù)量也是超過了某些運(yùn)營商。它主要提供3個(gè)功能,第一個(gè)功能是一個(gè)實(shí)時(shí)語音功能,第二個(gè)是類似于組隊(duì)語音,或者是類似于一個(gè)電話本溝通的這種方式,是一個(gè)語音電臺(tái)的這種模式,實(shí)際上它就有點(diǎn)像說是一個(gè)喜馬拉雅或者說像有主播在講,然后大量聽眾在收聽的方式,還有就是說是類似于基于微信消息的方式。
(圖5)
那么作為一個(gè)內(nèi)在SDK,它必須有幾個(gè)比較重要的特性,首先這點(diǎn)它會(huì)非常的低功耗,因?yàn)槟悴豢赡苋ジ行┻壿嬋寖?nèi)存,那么同時(shí)它作為是一個(gè)輔助的功能,不能占用太多資源,同時(shí)它需要很多平臺(tái)的這種監(jiān)管,包括多種引擎的適配,在接入上能夠做到非常簡(jiǎn)單。接下來看一下語音這一塊目前兩個(gè)典型的使用場(chǎng)景,第一種場(chǎng)景就是類似于在《王者榮耀》里面,這種小的語音的模式。那么這種模式它的一個(gè)特點(diǎn)是從技術(shù)上來講,它需要用戶能夠在較短的時(shí)間內(nèi),能夠聽得清其他用戶的發(fā)言,但是它對(duì)整體一致的要求,其實(shí)不是要求那么嚴(yán)格。第二個(gè)模式,是類似于這種國戰(zhàn)語音的方式,它的要求是,因?yàn)樵谶@種模式下面,一般是一個(gè)主播開著比較勁爆的背景音樂,然后對(duì)大家的指揮或者種行為會(huì)有一定的煽動(dòng)效果。所以,在這種情況下,需要對(duì)整體一致要控制得非常得好,然后用戶要定得非常得清晰,但是在這種情況下,確實(shí)不再去考慮流量這樣一個(gè)問題。
我們看一下語音的這樣一個(gè)整體的流程,包括它整個(gè)處理結(jié)構(gòu)的情況,我們簡(jiǎn)單地分為前處理和后處理,中間是通過網(wǎng)絡(luò)來進(jìn)行的。在前處理的過程中,首先第一個(gè)要做的就是降噪。第二個(gè)是做VAD,這里是一個(gè)比較關(guān)鍵的點(diǎn),它會(huì)語音之外信息能夠把它給過濾掉。為了達(dá)到節(jié)省帶寬的目的,因?yàn)槲覀儸F(xiàn)在在這邊開的策略相對(duì)都會(huì)比較得嚴(yán)格。那么VAD把整個(gè)聲音給過濾之后的話,需要去做一個(gè)ATC爭(zhēng)議這樣一件事情,它實(shí)際上是說把整個(gè)的人聲,能夠相對(duì)來說提高到一個(gè)比較高的水平。第四塊是LTC,它其實(shí)是一個(gè)嘯叫音質(zhì)的功能,因?yàn)樵谝郧?,其?shí)我們更多的是考慮用戶在使用過程中,他們不會(huì)坐在一起,我們最近發(fā)現(xiàn)其實(shí)很多的人,比如說在網(wǎng)吧,大家坐在一起。那么在這里的話,兩個(gè)音源相近,就容易出現(xiàn)嘯叫情況。所以,在這個(gè)地方也需要去做相應(yīng)處理去優(yōu)化近距離嘯叫問題。最難的一個(gè)問題就是回聲消除問題,實(shí)際上從整個(gè)業(yè)界來看,大家都在去想辦法去解決這個(gè)問題。那么對(duì)于這里其實(shí)在總體的這樣一個(gè)環(huán)境下面會(huì)存在一些挑戰(zhàn),比如說像在有背景的這種情況下,如果我們每個(gè)人都去說話,甚至某些背景里面,還有一些人的聲音,那么在這種情況下,想把這樣的聲音消掉或者說聽得非常舒服還是非常有挑戰(zhàn)。
在整體的這樣一個(gè)前處理過程中,我們會(huì)將整個(gè)語序進(jìn)行編碼,然后再把發(fā)送給服務(wù)器,在服務(wù)器這邊目前這邊是采用一個(gè)整理集群這種模式,那么它在接入上會(huì)有三個(gè)特點(diǎn),第一個(gè)特點(diǎn)就是它是一個(gè)就近接入的方式,我們也收集了海量的 Jrpl,并且在QS上做相應(yīng)的測(cè)試,它能夠保證這個(gè)用戶的接入點(diǎn)是一個(gè)最好的接入點(diǎn)。那么,另外一點(diǎn),整個(gè)的這種網(wǎng)絡(luò)它實(shí)際上是4G網(wǎng)絡(luò)體系,通過內(nèi)網(wǎng)去進(jìn)行傳輸。因?yàn)樵谏钲?,還有在其他地方都有相應(yīng)的布點(diǎn),可以打造整個(gè)語音傳輸?shù)淖顑?yōu)化的效果。我們?cè)倏吹谌齻€(gè)梳理邏輯,相對(duì)來說會(huì)比較簡(jiǎn)單,它主要是去處理整個(gè)數(shù)據(jù)包在網(wǎng)絡(luò)都懂得情況下,可能會(huì)產(chǎn)生這種跳音或者變音的情況,那么現(xiàn)在的話,我們?cè)谡麄€(gè)服務(wù)器端其實(shí)也做的一些類似于混音的處理,其實(shí)也是想去減少整體用戶的這么一個(gè)帶寬或者占用的問題。我們看一下實(shí)時(shí)語音,剛才我們有簡(jiǎn)單地介紹,比如說在《王者》的時(shí)候,我們場(chǎng)景下面,其實(shí)我們更多的是去考慮一個(gè)平衡型的效果,比如說我們希望用戶能夠聽得見用的好,然后像在國戰(zhàn)的場(chǎng)景下,其實(shí)我們希望整體這樣一個(gè)音質(zhì)的效果會(huì)非常得優(yōu),我們看到帶寬的這個(gè)一個(gè)情況。所以,整體來說它是一個(gè)多維度的這樣一個(gè)需要去考慮的問題。簡(jiǎn)單來講,第一個(gè)就是帶寬,或者怎么樣能盡量地去減少帶寬延遲。第二塊就是對(duì)于有些音效的影響,到底是是以語音的這塊為主,還是背景音樂這塊為主,還是以游戲音效為主,其實(shí)也是需要在不同語音場(chǎng)景里面去做權(quán)衡與選擇。
第三個(gè)是關(guān)于監(jiān)督系統(tǒng)。目前其實(shí)監(jiān)督系統(tǒng),我們是整個(gè)實(shí)際用戶處理里面非常困難的一部分,相對(duì)來說iOS的體系這種系統(tǒng)還更加容易去調(diào)優(yōu),但是對(duì)于安卓的整個(gè)系統(tǒng)來說,其實(shí)是做了300機(jī)型的這樣一個(gè)團(tuán)隊(duì),它甚至有更多的這樣一些機(jī)型,包括更多的這樣一些安卓團(tuán)隊(duì)等等。
第四個(gè),就是關(guān)于網(wǎng)絡(luò)丟包的這種情況。對(duì)于網(wǎng)絡(luò)丟包這種情況,目前其實(shí)也有類似于像FEC或者說強(qiáng)行編碼這種情況,可能在這個(gè)場(chǎng)景里面,需要有其他的這種某一次會(huì)造成雙方卡頓,尤其核心網(wǎng)的發(fā)生,有些數(shù)據(jù)這樣一些情況。那對(duì)于整體的一個(gè)新聞化的這樣設(shè)計(jì),你需要對(duì)所有的算法去做相應(yīng)的一些采集,來包括對(duì)整體的這種音頻需要去做相應(yīng)的這種優(yōu)化,來保證整體的SDK系統(tǒng)的比較輕量化。最終一個(gè)請(qǐng)大家看到的是一個(gè)音質(zhì)上的問題。目前來說其實(shí)好的辦法就是說我提高編碼,然后我提高我們的冗余,但是這是一個(gè)比較常規(guī)的做法。
我們看到一下在《王者榮耀》的語音里,我們主要是優(yōu)化了一些思路和方式,第一個(gè)是怎么去做一個(gè)的過程,那傳統(tǒng)的這種語音儲(chǔ)備或者語音的方式它是每秒鐘不間斷地向服務(wù)器發(fā)送,但是在一些電話的場(chǎng)景下面,還會(huì)出現(xiàn)需要去制造一些環(huán)境音,或者是說一些制造一些數(shù)據(jù)音的方式,讓用戶覺得我沒有掉線。在游戲的這種場(chǎng)景下面講,其實(shí)不太適合。那我們的做法就是只要你說的話,我們才去發(fā)報(bào),你不說話,我們是不去發(fā)報(bào)的。因此,延伸監(jiān)測(cè)這個(gè)模塊就顯得非常非常得重要。那么,目前常規(guī)的做法就是說在延伸整個(gè)聲音頻段的范圍,但是其實(shí)也還是有其他方式,比如說你可以采用一些類似于音階的手段盡可能地來識(shí)別,到底哪些是人聲,哪些是背景音。
第二個(gè)要解決的是嘯叫問題,我們剛才也講過,就是在某些場(chǎng)景下,大家可能坐在一起,說白了,就是去做一些移向移位的操作。或者是把整個(gè)的一個(gè)征信能夠盡量地放低,相應(yīng)的這種模型錯(cuò)開。
第三個(gè),主要是合并消除,合并消除現(xiàn)在可以去優(yōu)化的大概有兩點(diǎn),第一點(diǎn)是怎么樣能夠更好地去擦除回聲,然后還有一個(gè)點(diǎn)就是對(duì)于播麥交替的距離探測(cè),也會(huì)有一些好的效果,但目前還是在一個(gè)嘗試的狀態(tài)。對(duì)于我們丟包的這種情況,目前其實(shí)能做的事情也還是挺多的,就你剛才說的這種可靠的冗余這種方式。但是到底選擇哪一種方式,是需要取決于在當(dāng)前的這種網(wǎng)絡(luò)環(huán)境下,能夠支持你去辨別,不會(huì)對(duì)游戲整體造成過多的影響。
再看一下,我在這種優(yōu)化的情況下,實(shí)際上剛才也提過,它其實(shí)更多的是說,它既有背景音又有MP3的這種音樂,然后又能聽清楚人的聲音。那在這種情況下,怎么做?簡(jiǎn)單來說,就是去提高均衡,通過提升人聲的這種聲音能量的方式,同時(shí)對(duì)整個(gè)的一個(gè)伴奏,去做高頻處理,對(duì)音樂部分進(jìn)行相應(yīng)壓制,通過這種方式去達(dá)到均衡,讓整體的效果聽起來,既能夠聽得清楚人講話,同時(shí)也能夠聽得清楚MP3或者是說背景音樂給人的這種比較亢奮的效果。那在音質(zhì)的這個(gè)提升上,其實(shí)主要是針對(duì)人聲的飽和度,簡(jiǎn)單來說就是對(duì)你的音色或者對(duì)于一個(gè)平面變換的方位,讓這個(gè)聲音顯得更加得好聽。
那么現(xiàn)在前面也講了挺多,我們?cè)诓煌膱?chǎng)景下面,不僅是在網(wǎng)絡(luò)應(yīng)用的場(chǎng)景,還是說是在語音的這種場(chǎng)景,都會(huì)針對(duì)不同游戲去做相應(yīng)的適配。其實(shí)做了這么多,也是想能夠把它給開放出發(fā),我們更好地能夠服務(wù)到其他一些游戲上,所以我們又要有一個(gè)叫做,騰訊游戲服務(wù)的平臺(tái),它是基于在整個(gè)騰訊語音的基礎(chǔ)之上,它游戲服務(wù)子板塊的平臺(tái)。
目前開放的服務(wù),有語音存儲(chǔ)下載,然后還有一些游戲相關(guān)導(dǎo)航問路的玩法,還有包括我們針對(duì)數(shù)據(jù)分析的這樣一些特性的功能。有些語音計(jì)劃,剛才簡(jiǎn)單介紹過,這里就不再重復(fù)了。然后,數(shù)據(jù)存儲(chǔ)之前在提過一個(gè)叫做techbas的系統(tǒng),這個(gè)系統(tǒng)實(shí)際上目前是大規(guī)模地運(yùn)用于整體的數(shù)據(jù)存儲(chǔ)。那么這個(gè)系統(tǒng)剛才講了,它其實(shí)有一個(gè)最大的特點(diǎn),就是它能夠在海量的用戶之間,能夠在性能與成本之間找到一個(gè)比較好的平衡,那么同時(shí)它也可以比較好地去適應(yīng)業(yè)務(wù)的這樣一些特性,比如說第一個(gè)就是活動(dòng)的特性,能在短時(shí)間內(nèi),不會(huì)有海量的并發(fā),但是也能夠保證在高并發(fā)條件下,整個(gè)的一QBS效率也好,還有包括QS的質(zhì)量,還有包括我的查詢的量,都能夠達(dá)到比較好的標(biāo)準(zhǔn)。
第二點(diǎn),是整體本身游戲的數(shù)據(jù)存儲(chǔ),它有個(gè)特點(diǎn),就是它經(jīng)常會(huì)存在一些荷負(fù),或者是說一些擴(kuò)容的問題。那么(英文)這個(gè)系統(tǒng),它可以保證做到不管你是對(duì)數(shù)據(jù)的分類也好,還是對(duì)數(shù)據(jù)的合并也好,實(shí)際上可以做到在線無損的擴(kuò)容。
游戲下載更新服務(wù),這個(gè)之前也簡(jiǎn)單地講過,我們把整體的服務(wù),把它分裝在一起,其實(shí)也是想去解決游戲在發(fā)行過程中,可能會(huì)遇到的這種局域化發(fā)行的問題,那么目前與騰訊在合作,在全球大概10到20多個(gè)國家都有相應(yīng)的這種布點(diǎn)),那么依賴于當(dāng)?shù)乇旧淼腃DN建設(shè),我們可以將整體的內(nèi)容分發(fā),可以擴(kuò)充到全世界大概20多個(gè)地區(qū)。目前這個(gè)地區(qū)的數(shù)量其實(shí)還是在不斷地增長當(dāng)中,我們可以看到最近比較火的印度市場(chǎng),還有包括像南美華西市場(chǎng),實(shí)際上都有相應(yīng)的布點(diǎn)。
我今天分享大概就到這里,謝謝大家收聽!
掃描二維碼推送至手機(jī)訪問。
版權(quán)聲明:本文由財(cái)神資訊-領(lǐng)先的體育資訊互動(dòng)媒體轉(zhuǎn)載發(fā)布,如需刪除請(qǐng)聯(lián)系。