国产av一二三区|日本不卡动作网站|黄色天天久久影片|99草成人免费在线视频|AV三级片成人电影在线|成年人aV不卡免费播放|日韩无码成人一级片视频|人人看人人玩开心色AV|人妻系列在线观看|亚洲av无码一区二区三区在线播放

網(wǎng)易首頁(yè) > 網(wǎng)易號(hào) > 正文 申請(qǐng)入駐

《合金彈頭:覺(jué)醒》聯(lián)機(jī)方案即將融入團(tuán)結(jié)引擎

0
分享至

在今年的 Unite 大會(huì)上,騰訊天美技術(shù)專家田亞濤和 Unity 中國(guó)的軟件工程師司天語(yǔ)為大家?guī)?lái)了《合金彈頭:覺(jué)醒》項(xiàng)目的客戶端與服務(wù)端一體化方案,其中包括 DS 專用服務(wù)器進(jìn)程彈性啟動(dòng)、多房間管理及高性能連接能力等。


田亞濤:大家好,我是來(lái)自天美 J1 工作室的田亞濤。首先感謝團(tuán)結(jié)引擎團(tuán)隊(duì)對(duì)我們技術(shù)方案的認(rèn)可,也非常高興能在此與大家交流我們的實(shí)踐經(jīng)驗(yàn)。

我自 2014 年加入騰訊以來(lái),先后完整參與了《魂斗羅:歸來(lái)》與《合金彈頭:覺(jué)醒》的研發(fā)工作,長(zhǎng)期專注于 GamePlay 體系、實(shí)時(shí)聯(lián)機(jī)同步以及 DS(Dedicated Server)架構(gòu)相關(guān)的研發(fā)與優(yōu)化?!逗辖饛楊^:覺(jué)醒》作為一款 2023 年上線的橫版射擊手游,目前已在國(guó)內(nèi)與多個(gè)海外地區(qū)穩(wěn)定運(yùn)營(yíng)。

本次分享將重點(diǎn)介紹兩個(gè)方向:網(wǎng)絡(luò)同步框架以及基于 Unity 的 DS 引擎架構(gòu)優(yōu)化。在《魂斗羅:歸來(lái)》時(shí)期,我們探索并沉淀了一套基于 Unity 引擎的前后端一體化技術(shù)體系,而在《合金彈頭:覺(jué)醒》中,我們?cè)诖嘶A(chǔ)上進(jìn)一步迭代,對(duì)多項(xiàng)關(guān)鍵技術(shù)進(jìn)行了系統(tǒng)化打磨與演進(jìn)。

公平精準(zhǔn)的網(wǎng)絡(luò)同步框架

對(duì)于《合金彈頭:覺(jué)醒》,我之所以在前面特別強(qiáng)調(diào)橫版射擊,是因?yàn)榕c第一人稱或第三人稱射擊不同,橫版射擊的子彈飛行路徑和命中過(guò)程對(duì)玩家是完全可見(jiàn)的,命中是否準(zhǔn)確非常直觀。因此,只要畫(huà)面表現(xiàn)與最終傷害結(jié)果出現(xiàn)任何不一致,玩家都會(huì)立即察覺(jué)。在第一人稱或第三人稱射擊中,受擊反饋多以閃紅等效果呈現(xiàn),彈道細(xì)節(jié)并不會(huì)完全暴露,所以玩家對(duì)命中精度的敏感度沒(méi)有這么高;但在橫版射擊中,這種差異被無(wú)限放大。

也正因?yàn)槿绱?,早期常用的“攻擊者?yōu)先、服務(wù)器權(quán)威”機(jī)制在《合金彈頭:覺(jué)醒》中難以直接落地,會(huì)出現(xiàn)“看似沒(méi)有被擊中卻掉血”或“明明命中卻沒(méi)有傷害”的情況,讓玩家誤以為是外掛或者同步異常。在研發(fā)的整個(gè)過(guò)程中,我們?cè)诼?lián)機(jī)相關(guān)(包括 DS)的部分投入了大量時(shí)間,希望在網(wǎng)絡(luò)環(huán)境不可控的前提下,盡可能在“實(shí)時(shí)性”和“一致性”之間找到平衡,讓玩家看到的畫(huà)面與游戲真實(shí)的判定盡可能一致,也就是實(shí)現(xiàn)我們一直追求的“所見(jiàn)即所得”。


要解決“同步”問(wèn)題,首先必須具備一套可靠且高性能的網(wǎng)絡(luò)基礎(chǔ)設(shè)施,這是整個(gè)聯(lián)機(jī)技術(shù)的第一層能力。我們需要一個(gè)高效的網(wǎng)絡(luò)中間件,它的核心職責(zé)是承載數(shù)據(jù)傳輸,既要支持可靠的 UDP 通道,也要支持非可靠的 UDP 通道,以滿足不同類(lèi)型同步數(shù)據(jù)對(duì)實(shí)時(shí)性和可靠性的要求。在此基礎(chǔ)上,我們?cè)诼?lián)機(jī)框架層提供了 RPC 與狀態(tài)同步兩套能力,使上層邏輯能夠在統(tǒng)一的通信抽象下完成指令發(fā)送、狀態(tài)更新和關(guān)鍵事件傳遞,為后續(xù)所有同步機(jī)制提供一致而可靠的通信支持。


對(duì)于《合金彈頭:覺(jué)醒》這類(lèi)高實(shí)時(shí)性的同步游戲而言,每秒 30 次的同步頻率對(duì)帶寬要求非常高。在帶寬優(yōu)化上,除了常規(guī)處理,我們也針對(duì)同步內(nèi)容本身做了細(xì)致打磨,包括數(shù)據(jù)類(lèi)型定制、浮點(diǎn)精度控制以及差異化更新等。同時(shí),在策略層面,我們結(jié)合對(duì)象池與緩沖機(jī)制,并在 MTU 自適應(yīng)、合包和批量發(fā)送等方面進(jìn)行了優(yōu)化,以盡量降低同步成本并提高傳輸效率。


在帶寬優(yōu)化之后,我們進(jìn)一步處理流量?jī)?yōu)化。在壓縮和增量同步之外,我們希望將整體流量控制在可接受的量級(jí)上。為此,除了歷史記錄緩存,我們也結(jié)合序列號(hào)機(jī)制,并基于客戶端與網(wǎng)絡(luò)實(shí)際情況做了一些定制化策略,使整體流量的增長(zhǎng)趨勢(shì)更可控,也更符合我們的預(yù)期。


游戲中也大量使用了輸入緩存和命令隊(duì)列,這類(lèi)邏輯由于觸發(fā)頻率極高,對(duì) GC 的敏感度非常強(qiáng)。如果在這些高頻路徑上出現(xiàn)額外分配,就會(huì)加速觸發(fā) GC,從而導(dǎo)致主線程暫停,直接影響實(shí)時(shí)聯(lián)機(jī)體驗(yàn)。為此,我們針對(duì)這些模塊進(jìn)行了優(yōu)化,將無(wú)謂分配盡量壓縮甚至消除,以在同步過(guò)程中盡可能減少 GC 對(duì)客戶端流暢度的影響。


有了前面的優(yōu)化,所有數(shù)據(jù)與策略本身也需要被有效監(jiān)控。因此,我們?cè)谘邪l(fā)階段和外網(wǎng)環(huán)境中都建立了一套完整的監(jiān)控體系,用來(lái)確保網(wǎng)絡(luò)質(zhì)量與實(shí)際體驗(yàn)始終符合預(yù)期。同時(shí),這些監(jiān)控結(jié)果也為后續(xù)的動(dòng)態(tài)調(diào)整提供了可靠的數(shù)據(jù)依據(jù),使我們能夠更及時(shí)地評(píng)估網(wǎng)絡(luò)表現(xiàn)并進(jìn)行針對(duì)性優(yōu)化。


在此之外,我們還設(shè)計(jì)了自適應(yīng)網(wǎng)絡(luò)能力,會(huì)根據(jù)前面提到的策略與實(shí)時(shí)監(jiān)控?cái)?shù)據(jù),動(dòng)態(tài)選擇更適合當(dāng)前網(wǎng)絡(luò)狀況的同步方案。無(wú)論是在影子跟隨還是航位推測(cè)等模式下,系統(tǒng)都會(huì)優(yōu)先保證玩家在不同網(wǎng)絡(luò)質(zhì)量下都能獲得盡可能平滑的體驗(yàn)。


講完網(wǎng)絡(luò)層,我們?cè)倏赐娇蚣軐用?。?xiàng)目在立項(xiàng)階段首先完成了邏輯和表現(xiàn)的分離,這不是傳統(tǒng)的 UI MVC,而是將一個(gè) Game Object 拆分為邏輯體和表現(xiàn)體:邏輯體用于處理追幀、各種同步拉扯等核心邏輯,而表現(xiàn)體在動(dòng)畫(huà)、特效等層面保留更高的平滑性和表現(xiàn)靈活度?;谶@樣統(tǒng)一的邏輯層,我們?cè)谕侥J缴喜捎昧藥脚c狀態(tài)同步的融合方案,并結(jié)合早期《魂斗羅:歸來(lái)》的經(jīng)驗(yàn)以及單機(jī)、聯(lián)機(jī)都在 Unity 上統(tǒng)一研發(fā)的優(yōu)勢(shì),使整體同步結(jié)構(gòu)更清晰、更一致。在此基礎(chǔ)上,我們從對(duì)時(shí)模式轉(zhuǎn)向多端對(duì)幀,讓所有端共享一致的幀號(hào),使后續(xù)的同步行為與策略調(diào)整都能以統(tǒng)一幀號(hào)為依據(jù)。


接下來(lái),看一下角色同步。對(duì)于這樣一款高實(shí)時(shí)性的同步游戲而言,手感始終是第一優(yōu)先級(jí),《合金彈頭:覺(jué)醒》也采用了客戶端先行的方式。這里的 1P 指本地玩家自身;2P 指服務(wù)器或 DS;3P 則是我所看到的其他玩家?;玖鞒淌潜镜叵葓?zhí)行移動(dòng),同時(shí)同步地向服務(wù)器發(fā)送移動(dòng)指令;服務(wù)器在收到后會(huì)進(jìn)行校驗(yàn),如果校驗(yàn)不通過(guò),會(huì)下發(fā)糾正并觸發(fā)相應(yīng)的拉扯。對(duì)于 3P 來(lái)說(shuō),表現(xiàn)更多是基于服務(wù)器下發(fā)的緩存數(shù)據(jù),再通過(guò)平滑插值來(lái)重建對(duì)方的移動(dòng)軌跡。但由于是橫版射擊,3P 的畫(huà)面本質(zhì)上看到的仍然是一定程度的歷史位置,因此我們也會(huì)做一定程度的預(yù)測(cè)補(bǔ)償,讓對(duì)方角色的表現(xiàn)盡量接近實(shí)時(shí)。


前面提到有預(yù)測(cè)就一定會(huì)有預(yù)測(cè)失敗的情況,那失敗該怎么處理呢?如果只是簡(jiǎn)單地把本地移動(dòng)包發(fā)給 DS,由 DS 檢測(cè)到不一致后直接把角色位置拉回到服務(wù)器認(rèn)為的正確位置,那在玩家這邊就會(huì)出現(xiàn)很強(qiáng)的“瞬間被拽回去”的感覺(jué):前一刻一系列操作都很流暢,下一刻因?yàn)槭盏降氖且粠酝淼姆?wù)器確認(rèn)(相對(duì)本地來(lái)說(shuō)是歷史狀態(tài)),整個(gè)人突然被拉回原位置,體驗(yàn)會(huì)非常割裂。我們的做法是先回滾到出錯(cuò)時(shí)刻對(duì)應(yīng)的狀態(tài),再基于那一刻之后的輸入記錄做一次前滾重放,讓角色按正確的軌跡重新跑一遍,使得在玩家視角下動(dòng)作依然連貫。比如說(shuō),角色原本在地面奔跑,隨后觸發(fā)一次跳躍,如果 DS 發(fā)現(xiàn)其中存在偏差并做了輕微糾正,本地會(huì)先回到糾正后的狀態(tài),再重新模擬奔跑到起跳的過(guò)程,最終在畫(huà)面上仍然看到的是出現(xiàn)在正確位置上的那次跳躍,而不會(huì)出現(xiàn)突兀的拉扯感。


接下來(lái)是命中校驗(yàn)。在開(kāi)始之前,先對(duì)《合金彈頭:覺(jué)醒》中的子彈做一個(gè)簡(jiǎn)單介紹,共分為三類(lèi):第一類(lèi)是 Hit-Scan(快速子彈);第二類(lèi)是 Projectile(帶彈道、帶軌跡);第三類(lèi)則是前兩類(lèi)特性的結(jié)合。針對(duì)不同類(lèi)型,我們會(huì)采用不同的命中與同步策略。以第一類(lèi)快速子彈為例,在實(shí)際玩法中,無(wú)論子彈速度多快,只要玩家在畫(huà)面上成功躲開(kāi),就會(huì)自然認(rèn)為自己不應(yīng)該被擊中,因此命中并不是在“開(kāi)槍瞬間”就能直接判定的,這其中涉及的處理邏輯非常多。為了優(yōu)先保證本地體驗(yàn),快速子彈在本地命中時(shí)會(huì)立即給出反饋,同時(shí)將命中事件上報(bào)服務(wù)器,由服務(wù)器校驗(yàn)后再下發(fā)最終傷害結(jié)果。而對(duì)于另外兩類(lèi)子彈,通常由服務(wù)器直接進(jìn)行命中判斷并下發(fā)傷害。因此,在很長(zhǎng)一段時(shí)間里,我們命中相關(guān)的技術(shù)優(yōu)化主要圍繞快速子彈展開(kāi),目標(biāo)是讓其在高實(shí)時(shí)性的前提下做到準(zhǔn)確、可信,并具備足夠的反外掛能力。


為什么我們會(huì)強(qiáng)調(diào)第一類(lèi)快速子彈是“彈道”,而不是“彈幕”?原因在于它雖然速度很快,但仍然是以逐幀的方式在飛行。同時(shí),在飛行過(guò)程中,它還會(huì)根據(jù)實(shí)時(shí)狀態(tài)進(jìn)行邏輯判斷,例如命中的目標(biāo)是否已死亡,從而決定是否繼續(xù)穿透、穿透次數(shù),以及是否需要分裂、分裂成什么類(lèi)型的子彈。因此,看似簡(jiǎn)單的快速子彈,實(shí)際在邏輯上是非常重的。針對(duì)這種情況,我們采用的是客戶端命中上報(bào),再由 DS 校驗(yàn)的方式。那如何防外掛呢?在這里我們引入了一套“影子快照(Shadow Snapshot)”技術(shù)。它的含義是:DS 不僅在命中瞬間做歷史校驗(yàn),而是會(huì)在整個(gè)子彈飛行過(guò)程中持續(xù)采集行為數(shù)據(jù)。有了這些影子快照,DS 就可以在自己的視角下確保這些行為鏈路是可控且可信的,并在客戶端上報(bào)命中時(shí)進(jìn)行二次校驗(yàn)。


在反外掛層面,基于前面已經(jīng)構(gòu)建的一系列能力,我們會(huì)從三層來(lái)處理反外掛問(wèn)題。首先是在框架層,服務(wù)器本身具備絕對(duì)權(quán)威,可以確保關(guān)鍵邏輯不會(huì)被客戶端篡改;其次是在校驗(yàn)層,我們通過(guò)“影子快照”以及多種狀態(tài)檢查與記錄機(jī)制,對(duì)行為鏈路進(jìn)行持續(xù)驗(yàn)證;最后是在監(jiān)控層,我們會(huì)對(duì)異常行為進(jìn)行監(jiān)測(cè),包括異常加速、異常頻率發(fā)包等模式。通過(guò)這三層的協(xié)同,基本能夠覆蓋大部分外掛風(fēng)險(xiǎn)點(diǎn)并確保整體的安全性。


前面的內(nèi)容講完之后,不可避免地會(huì)提到“同步”層面的效率問(wèn)題。在實(shí)際研發(fā)中,我們經(jīng)常會(huì)處理聯(lián)機(jī)調(diào)試、內(nèi)外網(wǎng)異常定位等情況,因此我們認(rèn)為聯(lián)機(jī)調(diào)試工具本身同樣至關(guān)重要。為此,我們?cè)诙鄠€(gè)維度上構(gòu)建了相應(yīng)的模擬與調(diào)試能力,用來(lái)復(fù)現(xiàn)和分析各種網(wǎng)絡(luò)狀態(tài),從而更有效地優(yōu)化整體的網(wǎng)絡(luò)體驗(yàn)。


最后做一個(gè)簡(jiǎn)單總結(jié):從底層通信能力,到預(yù)測(cè)、回滾、補(bǔ)償,再到帶寬優(yōu)化和反外掛,構(gòu)建了一套公平且精準(zhǔn)的網(wǎng)絡(luò)同步框架。


基于 Unity 引擎的 DS 架構(gòu)

下圖展示了構(gòu)建 Unity DS 的一個(gè)簡(jiǎn)單參考。為什么選擇 Unity 來(lái)做 DS?優(yōu)勢(shì)非常明顯:一方面前后端邏輯可以直接復(fù)用,減少了重復(fù)開(kāi)發(fā);另一方面,后臺(tái)邏輯中有大量場(chǎng)景需要依賴物理系統(tǒng),Unity 自帶的物理能力讓前后端能夠以更一致的方式處理相關(guān)邏輯,從而形成一套更連貫、成本更低的方案。


在實(shí)際開(kāi)發(fā)過(guò)程中,除了前面提到的“邏輯與表現(xiàn)分離”之外,我們?cè)谫Y源和功能層面也盡可能做到前后端統(tǒng)一,一套開(kāi)發(fā)同時(shí)滿足兩端需求,使整體流程更加簡(jiǎn)潔高效。


在研發(fā)效率層面,下方圖中的左上部分展示了我們?cè)趯?shí)際開(kāi)發(fā)過(guò)程中所使用的 DS 視圖,在其中可以直接看到前端與后臺(tái)的運(yùn)行狀態(tài),這對(duì)于暫停、回溯以及日常調(diào)試都非常有幫助。右下部分則展示了我們?cè)诎姹倔w驗(yàn)階段的另一種用法:在手機(jī)上游玩時(shí)一旦發(fā)現(xiàn)聯(lián)機(jī)問(wèn)題,可以很輕松地將這一局接入本地 DS,并直接在編輯器中以 DS 視角進(jìn)行調(diào)試。這套研發(fā)效率體系在項(xiàng)目過(guò)程中發(fā)揮了重要作用,特別是對(duì)于《合金彈頭:覺(jué)醒》這樣一款內(nèi)容量較大的游戲,使我們能夠更高效地構(gòu)建和驗(yàn)證大量關(guān)卡內(nèi)容。


既然《合金彈頭:覺(jué)醒》是一款內(nèi)容型游戲,那么對(duì)應(yīng)的后臺(tái) DS 負(fù)擔(dān)也會(huì)隨之變重,特別是在內(nèi)存占用和整體資源壓力方面。項(xiàng)目早期我們做過(guò)一輪引擎瘦身和常規(guī)優(yōu)化,但當(dāng)這些手段都用到位之后,可繼續(xù)優(yōu)化的空間已經(jīng)非常有限,而內(nèi)容量卻還在持續(xù)增長(zhǎng)。從后臺(tái)的視角來(lái)看,為避免運(yùn)行時(shí)加載帶來(lái)的卡頓,很多情況下 DS 在啟動(dòng)時(shí)就需要一次性加載全部?jī)?nèi)容,這也進(jìn)一步加大了資源層面的壓力。


于是我們繼續(xù)深入分析。當(dāng)時(shí)原始的 Unity 引擎模型是:一個(gè)進(jìn)程對(duì)應(yīng)一個(gè)實(shí)例、一個(gè)實(shí)例對(duì)應(yīng)一場(chǎng)戰(zhàn)斗,這意味著許多基礎(chǔ)開(kāi)銷(xiāo),包括我們自有的對(duì)象池,都是獨(dú)占的。對(duì)于一些只需要“一名玩家 +AI”的輕量玩法來(lái)說(shuō),這種模式在資源利用上實(shí)際上相當(dāng)奢侈,因?yàn)樗鼤?huì)為這樣的小場(chǎng)景跑起一個(gè)完整的進(jìn)程。那么接下來(lái)該怎么辦?我們當(dāng)時(shí)有兩條思路:第一是做共享內(nèi)存,第二是做多房間。共享內(nèi)存的方案在調(diào)研后發(fā)現(xiàn)實(shí)現(xiàn)成本較高,因此最終我們選擇了多房間的方向。


改造的目標(biāo)是什么呢?在之前的項(xiàng)目中,我們的做法是左圖那種模式:一個(gè)進(jìn)程跑完一場(chǎng)戰(zhàn)斗后做一次 Reset,然后再串行復(fù)用這個(gè)進(jìn)程。在《合金彈頭:覺(jué)醒》中,我們希望能進(jìn)一步提升這一模式,向右圖那樣的架構(gòu)發(fā)展——也就是讓底層的基礎(chǔ)消耗(包括各類(lèi)對(duì)象池和資源)保持共用,然后在其之上創(chuàng)建多個(gè)房間并行運(yùn)行。這里需要解決的關(guān)鍵問(wèn)題在于:多個(gè)房間、多個(gè) Level 如何同時(shí)存在,并且彼此之間保持完全隔離。換句話說(shuō),從 DS 的視角看,即便它們位于同一個(gè)坐標(biāo)系下,各房間之間也必須做到互不干擾。


早期我們?cè)u(píng)估過(guò)三種方案:空間分割、場(chǎng)景疊加以及邏輯 Room??紤]到《合金彈頭:覺(jué)醒》在早期本身就是大世界結(jié)構(gòu),坐標(biāo)體系依賴偏移來(lái)實(shí)現(xiàn),如果繼續(xù)采用前兩種方案,隨著時(shí)間推移不僅會(huì)引發(fā)坐標(biāo)精度的問(wèn)題,整體復(fù)雜度也會(huì)大幅提升。因此最終我們選擇了第三種方案,即基于邏輯 Room 的方式來(lái)實(shí)現(xiàn)多房間并存。


要實(shí)現(xiàn)多房間完全并存,我們需要做到“三大隔離”。第一是引擎內(nèi)置對(duì)象的隔離;第二是物理層的改造與隔離;第三是邏輯狀態(tài)的隔離。由于開(kāi)始進(jìn)行這些改造時(shí)項(xiàng)目?jī)?nèi)容量已經(jīng)相當(dāng)龐大,這三類(lèi)隔離在落地過(guò)程中大部分都屬于工程層面的實(shí)際挑戰(zhàn),因此整體投入了相當(dāng)多的時(shí)間來(lái)完成。


在完成改造之后,從DS的視角來(lái)看,我們希望整個(gè)系統(tǒng)能夠以統(tǒng)一的方式驅(qū)動(dòng)更新。有了 Room 的概念之后,我們內(nèi)部把整體結(jié)構(gòu)稱為“大樓”,便于理解:一棟大樓里包含多個(gè)房間,由 RoomManager 來(lái)統(tǒng)一Tick各個(gè)房間。那么,一個(gè)進(jìn)程應(yīng)當(dāng)承載多少房間才合適?我們主要從幾個(gè)角度來(lái)評(píng)估:第一,希望在 30 幀的更新頻率下能夠穩(wěn)定地完成所有房間的 Tick;第二,從穩(wěn)定性出發(fā),盡量避免單個(gè)房間出現(xiàn)異常時(shí)影響到整棟大樓;第三,需要結(jié)合 CPU 與內(nèi)存的占用比例,尋找一個(gè)進(jìn)程可承載房間數(shù)量的合理平衡點(diǎn)。


下方的視頻展示了改造后的一個(gè)簡(jiǎn)單效果。從后臺(tái)視角可以看到,房間是可以直接動(dòng)態(tài)新增的,同一個(gè) DS 進(jìn)程中也能夠不斷創(chuàng)建新的房間。左側(cè)則展示了兩個(gè)獨(dú)立運(yùn)行的客戶端,它們之間完全隔離、互不影響,由此也能初步驗(yàn)證我們的多房間方案達(dá)到了預(yù)期目標(biāo)。

以 10 個(gè)房間為規(guī)模進(jìn)行 DS 架構(gòu)改造后,我們總結(jié)的收獲大致如視頻所示。實(shí)際上線外網(wǎng)后,我們又根據(jù)不同玩法在資源占用上的差異進(jìn)行了多輪調(diào)整。最終外網(wǎng)的大多數(shù)玩法穩(wěn)定在約 15 個(gè)房間的配置下運(yùn)行,而部分資源較重或流程特殊的玩法則會(huì)動(dòng)態(tài)調(diào)整為 10 個(gè)房間甚至 5 個(gè)房間,以確保資源使用保持在合理范圍內(nèi)。目前這套多房間方案已經(jīng)穩(wěn)定運(yùn)行于國(guó)內(nèi)與海外的正式環(huán)境中。


完成了 DS 的多房間優(yōu)化后,隨著游戲持續(xù)運(yùn)營(yíng)、內(nèi)容規(guī)模不斷擴(kuò)大,我們又遇到了新的問(wèn)題:即便在“大樓”架構(gòu)下實(shí)現(xiàn)了資源復(fù)用,同一進(jìn)程的整體內(nèi)存占用依然偏高。從后臺(tái)數(shù)據(jù)以及海外機(jī)型分布來(lái)看,部分場(chǎng)景已經(jīng)出現(xiàn)了明顯的內(nèi)存瓶頸,因此我們需要進(jìn)一步進(jìn)行內(nèi)存層面的優(yōu)化。另一個(gè)問(wèn)題是啟動(dòng)時(shí)間過(guò)長(zhǎng)。前面提到,服務(wù)器的進(jìn)程通常會(huì)提前拉起,但由于內(nèi)容量不斷積累,線上環(huán)境中一個(gè)進(jìn)程的拉起時(shí)間已經(jīng)達(dá)到 45 秒到 1 分鐘,這對(duì)于后臺(tái)的資源調(diào)度效率而言是明顯偏慢的。


基于這兩個(gè)問(wèn)題,我們也調(diào)研了 Fork 方案。Fork 本身并不復(fù)雜,但與 Unity 結(jié)合在當(dāng)時(shí)確實(shí)存在一定挑戰(zhàn),原理這里就不展開(kāi)了。預(yù)期收益主要有兩點(diǎn):一是希望在“大樓”之間進(jìn)一步復(fù)用內(nèi)存;二是在進(jìn)程拉起階段能夠更快啟動(dòng),并減少 CPU 的毛刺開(kāi)銷(xiāo)。那么在改造過(guò)程中,我們具體做了哪些事情呢?


下圖左側(cè)列出了我們認(rèn)為較為關(guān)鍵的改造點(diǎn),包括引擎 I/O 的重定向、I/O 管理與業(yè)務(wù)側(cè)的配套調(diào)整,以及線程層面的裁減和網(wǎng)絡(luò)層的多路復(fù)用。右側(cè)則展示了我們?cè)谠u(píng)估方案時(shí)重點(diǎn)考慮的問(wèn)題——也就是選擇在何時(shí)進(jìn)行 Fork 才是最合適、最穩(wěn)定的時(shí)機(jī)。


下圖展示了我們?cè)谝?Fork 后獲得的收益??梢钥吹?,F(xiàn)ork 之后的內(nèi)存占用下降得非常明顯;在進(jìn)程拉起方面,原本需要 45 秒到 1 分鐘的啟動(dòng)時(shí)間,使用 Fork 生成子進(jìn)程后基本能夠縮短到毫秒級(jí)。隨著這一優(yōu)化落地,服務(wù)器的整體資源成本也隨之顯著下降。


完成上述改造后,我們?cè)诤笈_(tái) DS 的開(kāi)發(fā)過(guò)程中也經(jīng)常需要進(jìn)行大量性能測(cè)試。有些測(cè)試場(chǎng)景動(dòng)輒要幾十個(gè)房間,僅依靠人工很難構(gòu)建和復(fù)現(xiàn)。因此,我們?cè)谶@一層面也做了相應(yīng)的自動(dòng)化能力,包括在 DS 性能出現(xiàn)問(wèn)題時(shí),能夠快速觸發(fā)并復(fù)現(xiàn)相關(guān)場(chǎng)景。通過(guò)這套方案,只需執(zhí)行一條指令,就能在 10 分鐘內(nèi)完成一輪完整的數(shù)據(jù)采集,并在右側(cè)所示的分析工具中基于各模塊輸出清晰的耗時(shí)分布。


下方的視頻展示了我們?cè)跍y(cè)試過(guò)程,能夠在本地編輯中直接看到在整個(gè)測(cè)試階段發(fā)生的具體情況,幫助我們更直觀地了解各項(xiàng)表現(xiàn)并定位可能的問(wèn)題。

以上就是對(duì)這兩個(gè)方案的介紹。我們?cè)陧?xiàng)目中的探索最終沉淀為一套完整且經(jīng)過(guò)線上驗(yàn)證的解決方案,不僅支撐了我們的自身項(xiàng)目,也即將通過(guò)團(tuán)結(jié)引擎服務(wù)于更多開(kāi)發(fā)者。關(guān)于這項(xiàng)技術(shù)如何進(jìn)一步融入團(tuán)結(jié)引擎并開(kāi)啟新的可能,下面有請(qǐng)團(tuán)結(jié)引擎的技術(shù)同學(xué)司天語(yǔ)為大家揭曉。謝謝大家!


團(tuán)結(jié)引擎 DS 聯(lián)機(jī)方案


司天語(yǔ):感謝亞濤精彩的分享!接下來(lái),由我跟大家講一講這套方案如何融入團(tuán)結(jié)引擎,如何讓各位開(kāi)發(fā)者今天不僅僅是來(lái)聽(tīng)一場(chǎng)技術(shù)方案的分享,也是可以真實(shí)的把這一套方案運(yùn)用到自己的游戲上去。我是來(lái)自于 Unity 中國(guó)底層架構(gòu)組的軟件工程師司天語(yǔ)。我們之所以會(huì)選擇使用這套聯(lián)機(jī)方案融入到引擎,最重要的是看中這一套框架成熟。如果一套框架沒(méi)有經(jīng)過(guò)大量線上游戲的驗(yàn)證,也沒(méi)有經(jīng)歷過(guò)大規(guī)模的實(shí)踐檢驗(yàn),我們是沒(méi)有足夠的信心向開(kāi)發(fā)者去推薦這套框架和技術(shù)的。


如今不管是穩(wěn)定性、功能性還是性能,各個(gè)方面都已經(jīng)非常成熟。因此在騰訊天美 J1 工作室的框架方案基礎(chǔ)上,團(tuán)結(jié)引擎進(jìn)行了代碼編寫(xiě),一起將它從“專用”打造成“通用”網(wǎng)絡(luò) DS 連接框架帶給開(kāi)發(fā)者們。既然這套框架已經(jīng)非常成熟了,那么我接下來(lái)講一下團(tuán)結(jié)引擎會(huì)做些什么?我們?cè)谝嬷袝?huì)使用更高性能的 C++ 來(lái)實(shí)現(xiàn)這套框架的內(nèi)核,相比于純 C# 的實(shí)現(xiàn),我們可以預(yù)見(jiàn)會(huì)有進(jìn)一步的性能提升。同時(shí),我們也會(huì)繼續(xù)優(yōu)化這一套框架,對(duì)一些復(fù)雜模塊進(jìn)行解耦和重新封裝,并且會(huì)設(shè)計(jì)一套簡(jiǎn)潔明了、易拓展的接口供開(kāi)發(fā)者調(diào)用。我們會(huì)努力將這套框架變成更強(qiáng)大、更通用、更易用的產(chǎn)品。

說(shuō)完了高性能的設(shè)計(jì)理念,在這個(gè) feature 上面,我們還有另外一個(gè)思路,就是 All In One。一直我們都會(huì)思考:“哪些功能應(yīng)該引擎去做,哪些功能應(yīng)該讓開(kāi)發(fā)者自己去寫(xiě)業(yè)務(wù)代碼?”一直以來(lái)我們?cè)谝娴难邪l(fā)過(guò)程中都會(huì)去思考,哪些功能應(yīng)該去引擎去做,哪些功能又應(yīng)該讓開(kāi)發(fā)者自己去寫(xiě)業(yè)務(wù)代碼。

一直以來(lái)團(tuán)結(jié)引擎都保持著盡量只做引擎該做的事情,這就使得團(tuán)結(jié)引擎是非常精簡(jiǎn)、高性能且高拓展的一個(gè)引擎。在這個(gè) feature 上面,我們希望引擎可以盡可能做更多的事情。不僅是 DS 框架會(huì)下沉到引擎當(dāng)中,同時(shí)我們也會(huì)將更多的業(yè)務(wù)核心的邏輯也封裝成組件,下沉為引擎的能力。我們希望可以給開(kāi)發(fā)者帶來(lái)真正“開(kāi)箱即用”的體驗(yàn)。除此之外,剛才亞濤剛才提到了關(guān)于分析 ping 值、ds 幀率、模擬斷線、弱網(wǎng)模擬、軌跡校對(duì)、預(yù)測(cè)、插值等一系列的 Debugger 和 Profiler 工具。我們都會(huì)集成進(jìn)引擎,而且會(huì)在部分分析工具中提供引擎源碼級(jí)別的更加深入到引擎層面的分析能力。這些工具我們也都會(huì)內(nèi)置的引擎當(dāng)中,同時(shí)在部分工具(如果可以的話),我們還會(huì)提供引擎原碼級(jí)別更加深入到引擎底層的一些分析和調(diào)試的能力。


我們框架會(huì)做到或者說(shuō)我們希望幫助開(kāi)發(fā)者做到的就是降低成本,這是所有項(xiàng)目在開(kāi)發(fā)過(guò)程中都非常關(guān)心的問(wèn)題。為了盡可能地榨干服務(wù)器的性能、避免造成浪費(fèi),這套方案在服務(wù)器高承載方面也做了很多的創(chuàng)新。一臺(tái) Linux 服務(wù)器先是通過(guò) DSA 拉起“種子進(jìn)程”,然后再 Fork 出多個(gè) DS 進(jìn)程,然后每個(gè) DS 進(jìn)程又可以并行地運(yùn)行多個(gè)房間支撐起很多個(gè)對(duì)局,這就可以讓我們盡可能榨干一臺(tái)服務(wù)器的性能,以達(dá)到降低服務(wù)器的成本。其次,這套框架還會(huì)幫助項(xiàng)目降低開(kāi)發(fā)成本。首先,該框架前后端會(huì)使用同一套邏輯,既保證一致性,也大大減輕邏輯開(kāi)發(fā)的負(fù)擔(dān)。接著就是剛才提到的,我們會(huì)將多數(shù)項(xiàng)目都有可能用到的核心功能、核心業(yè)務(wù)邏輯都組件化封裝,然后常用的功能都會(huì)有官方提供的組件,大家不用再去造輪子、重復(fù)地去進(jìn)行開(kāi)發(fā)。同時(shí),我們也會(huì)給出完整的功能、詳細(xì)的文檔,并且會(huì)積極地建設(shè)社區(qū)的專題,讓大家可以快速地和研發(fā)人員面對(duì)面的交流問(wèn)答,并且我們也會(huì)長(zhǎng)期維護(hù)這套聯(lián)機(jī)方案。


最后,我們希望和天美 J1 工作室,一起共同將這套方案盡可能地打造為迄今為止團(tuán)結(jié)引擎上最全面、最豐富、最完整的通用 DS 聯(lián)機(jī)框架。我們會(huì)在 2026 年的上半年帶著這套框架與各位開(kāi)發(fā)者見(jiàn)面,敬請(qǐng)期待。謝謝大家!


Unity 官方微信

第一時(shí)間了解Unity引擎動(dòng)向,學(xué)習(xí)進(jìn)階開(kāi)發(fā)技能

每一個(gè)“點(diǎn)贊”、“在看”,都是我們前進(jìn)的動(dòng)力


特別聲明:以上內(nèi)容(如有圖片或視頻亦包括在內(nèi))為自媒體平臺(tái)“網(wǎng)易號(hào)”用戶上傳并發(fā)布,本平臺(tái)僅提供信息存儲(chǔ)服務(wù)。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相關(guān)推薦
熱點(diǎn)推薦
1985年,F(xiàn)BI特工因航班延誤發(fā)現(xiàn)破綻,致潛伏37年的紅色諜王被捕

1985年,F(xiàn)BI特工因航班延誤發(fā)現(xiàn)破綻,致潛伏37年的紅色諜王被捕

干史人
2024-10-02 07:40:03
伊朗同意再放行20艘巴基斯坦籍船只通過(guò)霍爾木茲海峽,今后每天將有兩艘船通過(guò)該海峽

伊朗同意再放行20艘巴基斯坦籍船只通過(guò)霍爾木茲海峽,今后每天將有兩艘船通過(guò)該海峽

揚(yáng)子晚報(bào)
2026-03-29 07:17:05
澤連斯基:美方要求烏克蘭撤出頓巴斯 美國(guó)務(wù)卿:澤連斯基撒謊

澤連斯基:美方要求烏克蘭撤出頓巴斯 美國(guó)務(wù)卿:澤連斯基撒謊

新京報(bào)
2026-03-29 07:58:16
何潤(rùn)東15年前談項(xiàng)羽的采訪火了,他的侃侃而談,夠小鮮肉學(xué)一輩子

何潤(rùn)東15年前談項(xiàng)羽的采訪火了,他的侃侃而談,夠小鮮肉學(xué)一輩子

大鐵貓娛樂(lè)
2026-03-27 14:20:03
緊急提醒!如果你手里還有這些資產(chǎn),請(qǐng)務(wù)必讀完這篇:風(fēng)暴將在停戰(zhàn)后降臨

緊急提醒!如果你手里還有這些資產(chǎn),請(qǐng)務(wù)必讀完這篇:風(fēng)暴將在停戰(zhàn)后降臨

澳洲財(cái)經(jīng)見(jiàn)聞
2026-03-28 15:35:11
張雪峰三大遺憾!50萬(wàn)沒(méi)留住父親、對(duì)不起妻子,還有誤女兒前程

張雪峰三大遺憾!50萬(wàn)沒(méi)留住父親、對(duì)不起妻子,還有誤女兒前程

八斗小先生
2026-03-27 16:18:15
超越東契奇!約老師56次轟下30+三雙 升至歷史第二位

超越東契奇!約老師56次轟下30+三雙 升至歷史第二位

北青網(wǎng)-北京青年報(bào)
2026-03-28 20:50:14
這是田曦薇的素顏照,你還能第一眼認(rèn)出來(lái)她嗎

這是田曦薇的素顏照,你還能第一眼認(rèn)出來(lái)她嗎

TVB的四小花
2026-03-29 00:11:41
人老了,想多活幾年,先管住自己這10點(diǎn):1、不摔倒,2、不勞累…

人老了,想多活幾年,先管住自己這10點(diǎn):1、不摔倒,2、不勞累…

荷蘭豆愛(ài)健康
2026-03-28 09:28:48
快扔掉!戴一天,輻射量相當(dāng)于拍117次胸片

快扔掉!戴一天,輻射量相當(dāng)于拍117次胸片

FM93浙江交通之聲
2025-10-28 00:01:43
這是國(guó)足的水平?U19數(shù)據(jù)全面碾壓澳大利亞!主教練上場(chǎng)教訓(xùn)隊(duì)員

這是國(guó)足的水平?U19數(shù)據(jù)全面碾壓澳大利亞!主教練上場(chǎng)教訓(xùn)隊(duì)員

越嶺尋蹤
2026-03-28 16:23:12
張雪峰員工:他走了,留下一堆很難接手的攤子...

張雪峰員工:他走了,留下一堆很難接手的攤子...

芳華青年
2026-03-28 22:19:24
1996年, 施瓦辛格在家中無(wú)事,和35歲200斤女傭發(fā)生不當(dāng)關(guān)系

1996年, 施瓦辛格在家中無(wú)事,和35歲200斤女傭發(fā)生不當(dāng)關(guān)系

南權(quán)先生
2026-01-20 15:49:53
黃循財(cái):新加坡不再對(duì)標(biāo)香港

黃循財(cái):新加坡不再對(duì)標(biāo)香港

跟著老李看世界
2026-03-29 10:26:02
87分鐘點(diǎn)球絕平!中國(guó)男足拿1分后,最新排名有變,主裁判罰爭(zhēng)議

87分鐘點(diǎn)球絕平!中國(guó)男足拿1分后,最新排名有變,主裁判罰爭(zhēng)議

侃球熊弟
2026-03-28 20:07:16
誰(shuí)是下一個(gè)?紋身師曬顧客感染者咬痕紋身引熱議

誰(shuí)是下一個(gè)?紋身師曬顧客感染者咬痕紋身引熱議

游民星空
2026-03-29 10:06:07
A股:明天周一!如果沒(méi)有意外,行情走勢(shì)已敲定!A股大概率這樣走

A股:明天周一!如果沒(méi)有意外,行情走勢(shì)已敲定!A股大概率這樣走

股市皆大事
2026-03-29 10:29:28
跑完馬拉松!杭州45歲老板心梗離世:妻子說(shuō)“再來(lái)一萬(wàn)次也嫁他”

跑完馬拉松!杭州45歲老板心梗離世:妻子說(shuō)“再來(lái)一萬(wàn)次也嫁他”

社會(huì)日日鮮
2026-03-29 10:43:38
連戰(zhàn)護(hù)盤(pán)成功,馬英九急轉(zhuǎn)彎,蕭旭岑暫脫危險(xiǎn),親美派攻勢(shì)受重挫

連戰(zhàn)護(hù)盤(pán)成功,馬英九急轉(zhuǎn)彎,蕭旭岑暫脫危險(xiǎn),親美派攻勢(shì)受重挫

策略述
2026-03-28 16:34:31
今年首場(chǎng)強(qiáng)對(duì)流天氣來(lái)襲!廣西這些地方將迎暴雨、8至10級(jí)雷暴大風(fēng)和冰雹……

今年首場(chǎng)強(qiáng)對(duì)流天氣來(lái)襲!廣西這些地方將迎暴雨、8至10級(jí)雷暴大風(fēng)和冰雹……

魯中晨報(bào)
2026-03-29 10:21:16
2026-03-29 14:31:00
Unity incentive-icons
Unity
Unity中國(guó)官方帳戶
2450文章數(shù) 6730關(guān)注度
往期回顧 全部

游戲要聞

瘋傳!Faker疑似與女團(tuán)成員約會(huì) 網(wǎng)友:不如翡翠回響

頭條要聞

網(wǎng)約車(chē)司機(jī)被騙網(wǎng)貸后車(chē)內(nèi)輕生:我不想死 但扛不住了

頭條要聞

網(wǎng)約車(chē)司機(jī)被騙網(wǎng)貸后車(chē)內(nèi)輕生:我不想死 但扛不住了

體育要聞

絕殺衛(wèi)冕冠軍后,他單手指天把勝利獻(xiàn)給父親

娛樂(lè)要聞

張凌赫事件持續(xù)升級(jí)!官方點(diǎn)名怒批

財(cái)經(jīng)要聞

Kimi、Minimax 們的算力荒

科技要聞

馬斯克承認(rèn)xAI"建錯(cuò)了",11位創(chuàng)始人均離職

汽車(chē)要聞

嵐圖泰山X8配置曝光 四激光雷達(dá)/華為新一代座艙

態(tài)度原創(chuàng)

教育
家居
親子
手機(jī)
軍事航空

教育要聞

江蘇鹽城建湖:沉浸式學(xué)安全 護(hù)航成長(zhǎng)路

家居要聞

曲線華爾茲 現(xiàn)代簡(jiǎn)約

親子要聞

睡著的兩個(gè)姐妹,不安分的小樣,媽媽在旁邊心被萌化!

手機(jī)要聞

華為何剛預(yù)告小藝Claw新特性,可推每日健康報(bào)告、制定運(yùn)動(dòng)計(jì)劃

軍事要聞

美軍中東基地?fù)p失最新披露

無(wú)障礙瀏覽 進(jìn)入關(guān)懷版