第2265章 伺服器負載與長安城的喧囂
內測開放第三天,後台監控面板上的長安城地圖區域亮成了一片白色。
那片白色不是正常的淺灰底色,是角色密度超過閾值之後系統自動標註的紅色警告疊了一層又一層,把整片主城區的網格染成了刺眼的亮斑。
梁永琪站在監控大屏前面,屏幕上長安大街的俯視圖里擠著上千個藍色的光點,每個光點代表一個在線角色,光點之間已經沒有了空隙,全部擠成了幾團密度過高的光團。
那些光團還在不斷膨脹,邊緣不斷有新的藍色光點匯入,像一滴墨掉進清水裡,越暈越大,越暈越濃。
技術組的測試員在旁邊的工位上跑了一輪實機測試。
他的角色從長安大街的東側入口進去,剛走了三步,畫面就開始頓。
幀數從三十幀掉到十五幀,再掉到個位數,屏幕上角色的移動變成了跳幀式的推進,走一步停兩秒,再走一步又停兩秒。
他按了一下方向鍵讓角色往路邊靠,角色瞬移了兩米,像被什麼東西從後面推了一把。
測試員又按了一下反方向鍵,角色沒有反應,過了三秒之後突然往反方向彈了五六米,直接卡進了路邊一個擺攤NPC的模型裡面,半個身子嵌在攤位桌板中間,只露出上半身在外面,兩隻手還在空中做著奔跑的擺動動作。
他又補了一句,「比昨天嚴重多了,昨天只是偶爾跳一下,今天基本走不動。」
李軒從機房那邊走過來,站在測試員身後看著屏幕上的角色在原地跳幀。
他的眉頭皺著,兩隻手插在口袋裡,手指在褲袋裡微微動著,像在腦子裡跑代碼。
他站了大約兩分鐘,眼睛一直盯著屏幕上那個卡在攤位里的角色,看著它每隔幾秒就往不同方向彈一下,每次彈的位置都不一樣,有時候往左,有時候往右,有時候直接彈到半空中又落下來。
然後他轉身走回機房,打開了自己的主控機。
梁永琪跟在後面走進了機房。
李軒坐在主控機前面,屏幕上已經打開了渲染引擎的參數配置表。
他的手指在鍵盤上快速翻頁,翻到同屏渲染上限那一欄的時候停了下來。
那一欄的數值設的是八百。
他把光標停在那個數字上面,沒有改。
屏幕上的參數表密密麻麻排了幾十行,每一行都是一個可能影響性能的變量,但李軒的眼睛只盯著那個八百。
「引擎的同屏渲染上限是八百個角色。」他說,聲音不高,語速比平時慢一些,像在一邊想一邊說,「長安大街同時擠進來一千兩百多個人,超過上限的那部分角色全部被引擎丟掉了。
被丟掉的角色的位置數據還在伺服器端存著,但客戶端不渲染。
伺服器那邊把這些角色的位置廣播回來的時候客戶端不知道該怎麼處理,就出現了瞬移——角色在屏幕上的位置和伺服器端的位置對不上,系統嘗試修正的時候就直接跳過去了。」
【記住本站域名 看書首選 TW 看書網,𝚜𝚑𝚞.𝚝𝚠超給力 】
他頓了一下,手指在桌面上輕輕敲了兩下,又補了一句:「客戶端本地算出來的位置和伺服器發過來的位置中間差了一大截,系統每幀都在嘗試把這兩個位置拉到一起,拉不過來的時候就強制同步,那個強制同步的瞬間就是玩家看到的瞬移。」
梁永琪站在他身後。
「那把同屏渲染上限往上調呢?調到一千五或者兩千。」她往前走了半步,視線落在屏幕上那個八百的數字上面,「伺服器端能撐住一千兩百個人,說明數據處理這塊沒問題,卡的是客戶端渲染。
那把上限放開,讓引擎多畫幾個人,問題不就解決了?」
李軒搖了搖頭。
他的手從鍵盤上抬起來,搭在椅子扶手上。
「上限不是我們設的限制,是引擎的渲染管線本身扛不住。
每一幀要計算所有角色的模型變換、光照、陰影、動畫骨骼,八百個角色同時渲染的時候引擎的幀預算已經用掉了七成,再往上加它會直接崩掉。」他停了一下,手指在扶手上收緊又鬆開,「幀預算這個東西是固定的,一幀十六毫秒,超了就是超了,沒有商量的餘地。
我如果把上限調到一千二,引擎會在第一幀就爆掉,不是卡頓的問題,是直接閃退。」
「但如果我把上限往下壓,壓到五百,長安城裡就只能看到五百個人。
剩下的七百個人全部被引擎丟掉,玩家看到的是一座空了一半的長安城。
《夢幻》強調的就是熱鬧,長安大街上人擠人的那種感覺,如果砍掉一半的人數,那個熱鬧就沒了。」他的聲音低下去,像是在跟自己說話,「而且玩家不傻,他們會發現有些人明明在隊伍列表里,在地圖上就是看不到。
到時候論壇上全是帖子問為什麼我隊友站在我面前我看不見他。」
梁永琪靠在機房的門框上,兩隻手環在胸前。
她看著屏幕上那個八百的數字,沒有立刻說話。
這個數字的上下兩端各有一條路,往上走是技術崩盤,往下走是體驗崩盤。
兩條路都走不通。
她腦子裡轉了幾個方案,每一個都在某個環節上被卡住——要麼是客戶端算不過來,要麼是伺服器廣播量太大,要麼是玩家體驗打折打到沒法接受。
她咬了咬下嘴唇,手指在手臂上輕輕敲了幾下。
她拿出手機走出機房,在走廊里撥了陳浩的號碼。
電話接通之後她把情況完整地說了一遍——同屏渲染上限、瞬移的成因、削減人數帶來的體驗損失。
她說的時候語速比平時快一些,像在把一堆積木一塊一塊地壘起來,壘完了等著對方推倒或者加固。
說到最後她停了一下,加了一句:「我這邊暫時想不到兩全的辦法,李軒那邊也卡住了。」
電話那頭沉默了片刻。
梁永琪聽到陳浩的呼吸聲在話筒里均勻地傳過來,中間夾著一聲極輕的、像用手指敲了一下桌面邊緣的聲音。
那一聲響之後又是幾秒的安靜,她能想像陳浩坐在辦公桌後面,手指搭在桌面上,眼睛看著某個固定的點,腦子裡在翻各種可能性。
「讓玩家可以選擇屏蔽其他人的特效。」陳浩說,「只保留自己和隊友的技能特效,其他所有人的特效全部不渲染。
但是人物模型必須全部顯示。
每一個角色都要看得見,只不過他身上那些花里胡哨的光影不用畫出來。」
梁永琪把手機換了一邊耳朵。
「特效的計算量比模型大?」她問了一句,手指無意識地在走廊的牆壁上劃了一下。
「特效是疊加渲染,一層火牆上面再疊一層雷電再疊一層毒霧,每一層都要單獨計算光線和透明度。
模型是靜態渲染,一個人站在那裡不動的話,他的模型每幀的變換量很小。
把特效砍掉之後引擎的幀預算能騰出很大一塊,用來撐住全部的人物模型。」陳浩的聲音從話筒里傳過來,不急不緩,「你讓李軒去翻一下渲染管線的代碼,特效和模型是不是走同一個隊列。
如果走同一個隊列,把特效拆出來單獨排隊,優先算模型,特效往後排。」
梁永琪掛了電話之後走回機房。
走廊到機房的這段路不長,她走了幾步就到了門口。
李軒還坐在主控機前面,屏幕上那個八百的數字還在閃爍。
她把陳浩的方案轉述了一遍。
李軒聽完之後沒有立刻回應,他把手從椅子扶手上收回來,重新搭上鍵盤,手指在參數表上翻了幾頁,找到了特效渲染模塊的配置項。
「特效計算和模型計算分離。」他說,手指在鍵盤上敲了起來,速度比剛才快了一截,「特效走單獨的渲染隊列,每一幀先算模型,模型算完了有餘力再算特效。
玩家關掉其他人的特效之後,特效隊列里只剩下自己和隊友的數據,計算量降到原來的十分之一都不到。
模型隊列不變,所有人的人物模型全部保留。」
他一邊敲一邊說,聲音比剛才亮了一些:「特效隊列如果來不及算就直接丟掉,丟掉的只是光影效果,人物模型不受影響。
玩家看到的是一個人站在那裡但沒有技能光效,這比看不到人要好得多。
而且特效丟掉的時候不會影響位置同步,因為位置數據掛在模型上面,模型沒丟,位置就不會錯。」
他沒有再抬頭。
梁永琪站在他身後看了一會兒,屏幕上代碼行一行一行地往下滾,李軒的手指在鍵盤上跳得很快,偶爾停下來刪掉幾行又重新敲進去。
她看了一會兒,然後退出了機房。
那天晚上李軒沒有離開公司。
技術組的三個人陪著他一起熬,機房的燈一直亮著,屏幕上的代碼行一行一行地滾動。
凌晨兩點多的時候有人出去買了一趟泡麵,回來的時候拎了五碗,每碗的蓋子都掀開了,熱氣從碗口升起來,在機房的冷氣里凝成一片白霧。
李軒一隻手端著面碗一隻手敲鍵盤,面吃了一半就擱在桌角,湯涼了也沒再碰。
旁邊技術組的一個小伙子吃著面湊過來看了一眼他的屏幕,問了一句這個調度邏輯是不是要重寫,李軒嘴裡含著半口面含含糊糊地應了一聲,手指沒停。
凌晨三點十七分,他把最後一行渲染優先級的調度代碼敲完,按了回車。
屏幕上開始跑測試。
測試場景是長安大街,預先加載了一千八百個角色模型,所有角色的特效全部按照「僅顯示隊友」的規則進行了裁剪。
渲染幀率從測試開始的第一秒就穩定在一個數值上,上下浮動不超過三幀。
他盯著那個數字看了十幾秒,然後伸手把旁邊那台測試機上的畫面拖到了大屏幕上。
長安大街上擠著上千個角色,人物模型全部完整顯示,每一個角色都在動,走路的、擺攤的、跑動的、站著聊天的,密密麻麻的人頭從屏幕的近景一直排到遠景。
畫面沒有卡頓,角色的移動流暢,幀數穩定在三十幀以上。
【跪求禮物,免費的為愛發電也行!】
那片白色不是正常的淺灰底色,是角色密度超過閾值之後系統自動標註的紅色警告疊了一層又一層,把整片主城區的網格染成了刺眼的亮斑。
梁永琪站在監控大屏前面,屏幕上長安大街的俯視圖里擠著上千個藍色的光點,每個光點代表一個在線角色,光點之間已經沒有了空隙,全部擠成了幾團密度過高的光團。
那些光團還在不斷膨脹,邊緣不斷有新的藍色光點匯入,像一滴墨掉進清水裡,越暈越大,越暈越濃。
技術組的測試員在旁邊的工位上跑了一輪實機測試。
他的角色從長安大街的東側入口進去,剛走了三步,畫面就開始頓。
幀數從三十幀掉到十五幀,再掉到個位數,屏幕上角色的移動變成了跳幀式的推進,走一步停兩秒,再走一步又停兩秒。
他按了一下方向鍵讓角色往路邊靠,角色瞬移了兩米,像被什麼東西從後面推了一把。
測試員又按了一下反方向鍵,角色沒有反應,過了三秒之後突然往反方向彈了五六米,直接卡進了路邊一個擺攤NPC的模型裡面,半個身子嵌在攤位桌板中間,只露出上半身在外面,兩隻手還在空中做著奔跑的擺動動作。
他又補了一句,「比昨天嚴重多了,昨天只是偶爾跳一下,今天基本走不動。」
李軒從機房那邊走過來,站在測試員身後看著屏幕上的角色在原地跳幀。
他的眉頭皺著,兩隻手插在口袋裡,手指在褲袋裡微微動著,像在腦子裡跑代碼。
他站了大約兩分鐘,眼睛一直盯著屏幕上那個卡在攤位里的角色,看著它每隔幾秒就往不同方向彈一下,每次彈的位置都不一樣,有時候往左,有時候往右,有時候直接彈到半空中又落下來。
然後他轉身走回機房,打開了自己的主控機。
梁永琪跟在後面走進了機房。
李軒坐在主控機前面,屏幕上已經打開了渲染引擎的參數配置表。
他的手指在鍵盤上快速翻頁,翻到同屏渲染上限那一欄的時候停了下來。
那一欄的數值設的是八百。
他把光標停在那個數字上面,沒有改。
屏幕上的參數表密密麻麻排了幾十行,每一行都是一個可能影響性能的變量,但李軒的眼睛只盯著那個八百。
「引擎的同屏渲染上限是八百個角色。」他說,聲音不高,語速比平時慢一些,像在一邊想一邊說,「長安大街同時擠進來一千兩百多個人,超過上限的那部分角色全部被引擎丟掉了。
被丟掉的角色的位置數據還在伺服器端存著,但客戶端不渲染。
伺服器那邊把這些角色的位置廣播回來的時候客戶端不知道該怎麼處理,就出現了瞬移——角色在屏幕上的位置和伺服器端的位置對不上,系統嘗試修正的時候就直接跳過去了。」
【記住本站域名 看書首選 TW 看書網,𝚜𝚑𝚞.𝚝𝚠超給力 】
他頓了一下,手指在桌面上輕輕敲了兩下,又補了一句:「客戶端本地算出來的位置和伺服器發過來的位置中間差了一大截,系統每幀都在嘗試把這兩個位置拉到一起,拉不過來的時候就強制同步,那個強制同步的瞬間就是玩家看到的瞬移。」
梁永琪站在他身後。
「那把同屏渲染上限往上調呢?調到一千五或者兩千。」她往前走了半步,視線落在屏幕上那個八百的數字上面,「伺服器端能撐住一千兩百個人,說明數據處理這塊沒問題,卡的是客戶端渲染。
那把上限放開,讓引擎多畫幾個人,問題不就解決了?」
李軒搖了搖頭。
他的手從鍵盤上抬起來,搭在椅子扶手上。
「上限不是我們設的限制,是引擎的渲染管線本身扛不住。
每一幀要計算所有角色的模型變換、光照、陰影、動畫骨骼,八百個角色同時渲染的時候引擎的幀預算已經用掉了七成,再往上加它會直接崩掉。」他停了一下,手指在扶手上收緊又鬆開,「幀預算這個東西是固定的,一幀十六毫秒,超了就是超了,沒有商量的餘地。
我如果把上限調到一千二,引擎會在第一幀就爆掉,不是卡頓的問題,是直接閃退。」
「但如果我把上限往下壓,壓到五百,長安城裡就只能看到五百個人。
剩下的七百個人全部被引擎丟掉,玩家看到的是一座空了一半的長安城。
《夢幻》強調的就是熱鬧,長安大街上人擠人的那種感覺,如果砍掉一半的人數,那個熱鬧就沒了。」他的聲音低下去,像是在跟自己說話,「而且玩家不傻,他們會發現有些人明明在隊伍列表里,在地圖上就是看不到。
到時候論壇上全是帖子問為什麼我隊友站在我面前我看不見他。」
梁永琪靠在機房的門框上,兩隻手環在胸前。
她看著屏幕上那個八百的數字,沒有立刻說話。
這個數字的上下兩端各有一條路,往上走是技術崩盤,往下走是體驗崩盤。
兩條路都走不通。
她腦子裡轉了幾個方案,每一個都在某個環節上被卡住——要麼是客戶端算不過來,要麼是伺服器廣播量太大,要麼是玩家體驗打折打到沒法接受。
她咬了咬下嘴唇,手指在手臂上輕輕敲了幾下。
她拿出手機走出機房,在走廊里撥了陳浩的號碼。
電話接通之後她把情況完整地說了一遍——同屏渲染上限、瞬移的成因、削減人數帶來的體驗損失。
她說的時候語速比平時快一些,像在把一堆積木一塊一塊地壘起來,壘完了等著對方推倒或者加固。
說到最後她停了一下,加了一句:「我這邊暫時想不到兩全的辦法,李軒那邊也卡住了。」
電話那頭沉默了片刻。
梁永琪聽到陳浩的呼吸聲在話筒里均勻地傳過來,中間夾著一聲極輕的、像用手指敲了一下桌面邊緣的聲音。
那一聲響之後又是幾秒的安靜,她能想像陳浩坐在辦公桌後面,手指搭在桌面上,眼睛看著某個固定的點,腦子裡在翻各種可能性。
「讓玩家可以選擇屏蔽其他人的特效。」陳浩說,「只保留自己和隊友的技能特效,其他所有人的特效全部不渲染。
但是人物模型必須全部顯示。
每一個角色都要看得見,只不過他身上那些花里胡哨的光影不用畫出來。」
梁永琪把手機換了一邊耳朵。
「特效的計算量比模型大?」她問了一句,手指無意識地在走廊的牆壁上劃了一下。
「特效是疊加渲染,一層火牆上面再疊一層雷電再疊一層毒霧,每一層都要單獨計算光線和透明度。
模型是靜態渲染,一個人站在那裡不動的話,他的模型每幀的變換量很小。
把特效砍掉之後引擎的幀預算能騰出很大一塊,用來撐住全部的人物模型。」陳浩的聲音從話筒里傳過來,不急不緩,「你讓李軒去翻一下渲染管線的代碼,特效和模型是不是走同一個隊列。
如果走同一個隊列,把特效拆出來單獨排隊,優先算模型,特效往後排。」
梁永琪掛了電話之後走回機房。
走廊到機房的這段路不長,她走了幾步就到了門口。
李軒還坐在主控機前面,屏幕上那個八百的數字還在閃爍。
她把陳浩的方案轉述了一遍。
李軒聽完之後沒有立刻回應,他把手從椅子扶手上收回來,重新搭上鍵盤,手指在參數表上翻了幾頁,找到了特效渲染模塊的配置項。
「特效計算和模型計算分離。」他說,手指在鍵盤上敲了起來,速度比剛才快了一截,「特效走單獨的渲染隊列,每一幀先算模型,模型算完了有餘力再算特效。
玩家關掉其他人的特效之後,特效隊列里只剩下自己和隊友的數據,計算量降到原來的十分之一都不到。
模型隊列不變,所有人的人物模型全部保留。」
他一邊敲一邊說,聲音比剛才亮了一些:「特效隊列如果來不及算就直接丟掉,丟掉的只是光影效果,人物模型不受影響。
玩家看到的是一個人站在那裡但沒有技能光效,這比看不到人要好得多。
而且特效丟掉的時候不會影響位置同步,因為位置數據掛在模型上面,模型沒丟,位置就不會錯。」
他沒有再抬頭。
梁永琪站在他身後看了一會兒,屏幕上代碼行一行一行地往下滾,李軒的手指在鍵盤上跳得很快,偶爾停下來刪掉幾行又重新敲進去。
她看了一會兒,然後退出了機房。
那天晚上李軒沒有離開公司。
技術組的三個人陪著他一起熬,機房的燈一直亮著,屏幕上的代碼行一行一行地滾動。
凌晨兩點多的時候有人出去買了一趟泡麵,回來的時候拎了五碗,每碗的蓋子都掀開了,熱氣從碗口升起來,在機房的冷氣里凝成一片白霧。
李軒一隻手端著面碗一隻手敲鍵盤,面吃了一半就擱在桌角,湯涼了也沒再碰。
旁邊技術組的一個小伙子吃著面湊過來看了一眼他的屏幕,問了一句這個調度邏輯是不是要重寫,李軒嘴裡含著半口面含含糊糊地應了一聲,手指沒停。
凌晨三點十七分,他把最後一行渲染優先級的調度代碼敲完,按了回車。
屏幕上開始跑測試。
測試場景是長安大街,預先加載了一千八百個角色模型,所有角色的特效全部按照「僅顯示隊友」的規則進行了裁剪。
渲染幀率從測試開始的第一秒就穩定在一個數值上,上下浮動不超過三幀。
他盯著那個數字看了十幾秒,然後伸手把旁邊那台測試機上的畫面拖到了大屏幕上。
長安大街上擠著上千個角色,人物模型全部完整顯示,每一個角色都在動,走路的、擺攤的、跑動的、站著聊天的,密密麻麻的人頭從屏幕的近景一直排到遠景。
畫面沒有卡頓,角色的移動流暢,幀數穩定在三十幀以上。
【跪求禮物,免費的為愛發電也行!】