第39章 引擎的降維優化
十一月底,寒流南下了。深圳的氣溫一夜之間跌到十度以下,創新大廈的中央空調開了暖風,但五樓東側的玻璃房裡還是冷——不是溫度低,是人心冷。
屏幕上是一個剛跑起來的「山海」原型。畫面很簡陋:一片低多邊形的草原,幾棵紙片般的樹,一個粗糙的3D角色站在中央。角色穿著基礎布衣,手裡拿著一把木劍。按下WASD,角色移動,動作僵硬,幀率顯示:15 FPS。
「這就是極限了。」阿坤的聲音很疲憊,帶著一種接近崩潰的平靜,「在集顯上,同屏十個角色,幀率就掉到15以下。如果是戰場,一百人同屏,會卡成PPT。而2003年,中國70%的網吧電腦,用的都是英特爾845G集顯,顯存共享系統內存,性能是現在測試機的十分之一。」
測試機是浩宇剛採購的「高配」:奔騰4 2.4GHz,512MB內存,GeForce FX 5200獨立顯卡,128MB顯存。這在2003年已經是頂尖配置,但跑「山海」原型依然勉強。而真實的用戶環境,是賽揚1.7GHz,256MB內存,英特爾845G集顯——性能差五倍不止。
玻璃房裡坐了十二個人,沒人說話。只有機箱風扇的嗡嗡聲,和窗外寒風的呼嘯聲。空氣里有種絕望的氣味,像手術台上醫生宣布「我們已經盡力了」。
陳默盯著屏幕上那個粗糙的角色,手指在桌下緊緊攥著。他畫了三個月的原畫,設計了幾十種怪物,構想了宏大的世界觀。但現在,這些可能都出不來——因為機器跑不動。
趙永打破沉默:「能不能再降畫質?把多邊形數砍一半,貼圖解析度降到256x256,關掉所有光影特效。」
「砍了,也救不活集顯。」阿坤調出性能分析報告,「瓶頸在填充率。集顯的像素填充率只有200MT/s,我們的場景即使降到最低畫質,填充需求也要500MT/s。這是硬體天花板,不是優化能解決的。」
「那……放棄集顯用戶?」王磊試探著問,「只針對獨顯用戶開發?但那樣我們會丟掉70%的市場。」
「丟掉70%,剩下的30%里,還有一半是GeForce 4 MX這種入門獨顯,性能比集顯好不了多少。」阿坤搖頭,「林浩,『山海』可能……做不了。至少,做不成3D MMO。也許我們可以退回2.5D,像《奇蹟MU》那樣,固定視角,簡化場景。」
所有人看向林浩。他坐在角落的椅子上,一直沒說話,只是盯著屏幕,盯著那個幀率數字:15。眼神很空,像在看很遠的地方。
然後他站起來,走到白板前。拿起筆,寫下一行字:「2003年硬體性能約束下的3D渲染解決方案」。
「我們走錯方向了。」他說,聲音很平靜,但每個字都像釘子敲進木頭,「我們一直在想『怎麼讓3D跑得更快』,但真正的方向應該是『怎麼讓玩家覺得這是3D,而實際上不是』。」
阿坤皺眉:「什麼意思?」
「意思是,我們要做『偽3D』。」林浩轉過身,看著玻璃房裡的人,「不是真3D,是看起來像3D,用2D的技巧模擬3D的效果。2003年的硬體跑不動真3D,但跑2D綽綽有餘。《血戰天下》萬人同屏都不卡,因為2D渲染開銷小。如果我們能用2D的技術,做出3D的體驗呢?」
「不可能。」阿坤脫口而出,「3D的核心是透視、光照、深度。2D怎麼模擬?」
「預渲染。」林浩在白板上畫圖,「把3D場景預先渲染成2D圖片,分層存儲。運行時,根據玩家視角,動態拼接這些2D層,製造出3D的透視感。光照也用預烘焙——把光影信息算好,存在貼圖里。角色還是3D模型,但場景是2D圖片。這樣,90%的渲染開銷省掉了。」
玻璃房裡死寂。然後阿坤猛地站起來,椅子腿刮擦地板發出刺耳的聲音。
「這是欺騙!」他聲音提高了,「預渲染的2D場景不能旋轉視角,不能動態光照,不能破壞地形!這算什麼3D?這是過場動畫!」
「但玩家要的不是真3D,是3D的『感覺』。」林浩看著他,眼神很銳利,「阿坤,你玩過《最終幻想7》嗎?」
阿坤愣住。
「1997年的遊戲,PS1平台,性能還不如現在的集顯。但它用了預渲染背景加3D角色的技術,讓玩家覺得那是3D世界。玩家不能旋轉視角,但他們會忘記這一點,因為他們被故事、戰鬥、探索吸引了。」林浩頓了頓,「我們要做的,是升級版。用動態圖層實現『偽旋轉』,用多層疊加實現『偽深度』,用精靈動畫實現『偽光影』。技術上,這是2D。體驗上,這是3D。」
陳默眼睛亮了:「就像……皮影戲?用多層剪紙,前後移動,製造立體感?」
「對。」林浩點頭,「場景分五層:遠景(山、雲)、中景(建築、樹木)、近景(路面、雜物)、角色層、特效層。每層是2D圖片,但可以獨立移動、縮放、淡入淡出。玩家移動時,各層以不同速度滾動,產生視差,感覺像在3D空間裡移動。角色是3D模型,但在2D層之間行走,就像在舞台上。」
阿坤不說話了。他走回座位,調出代碼編輯器,手指在鍵盤上快速敲擊。他在算。算渲染開銷,算內存占用,算可行性。十分鐘後,他抬頭,眼神複雜。
「理論上……可行。預渲染的場景圖,一張1024x1024的PNG,壓縮後只有200KB。一個地圖用十張,也就2MB。內存占用是現在3D場景的十分之一。渲染只需要畫2D精靈,集顯完全能跑滿60幀。」他頓了頓,「但……動態光影怎麼辦?破壞地形怎麼辦?天氣系統怎麼辦?」
「光影用多層疊加。」林浩在白板上畫,「比如,一個山洞場景,我們預渲染三套:白天版、夜晚版、火把版。運行時根據遊戲內時間,動態切換。或者更精細點,用『光照蒙版』——一張黑白圖,白色區域亮,黑色區域暗,運行時疊加在場景圖上,模擬光影變化。」
「破壞地形……做不了。但我們可以用『事件觸發替換』。比如一堵牆被炸毀,我們準備兩套場景圖:有牆版和無牆版。觸發爆炸事件後,無縫切換到無牆版。玩家會覺得牆被炸了,實際上只是換了張圖。」
「天氣系統同理。雨、雪、霧,都是單獨一層半透明貼圖,疊加在場景上。粒子效果用2D精靈模擬。」
阿坤聽著,手指在桌上輕輕敲著,像在腦子裡運行這些方案。他不得不承認,林浩說的每一點,技術上都能實現。而且實現成本,比真3D低一個數量級。
「但角色是3D模型,在2D場景里走,不會穿幫嗎?」趙永問。
「用『深度緩衝圖』。」林浩說,「預渲染場景時,同時生成一張『深度圖』,記錄每個像素的深度值。角色移動時,根據深度圖決定誰在前誰在後。這樣,角色可以走到樹後,可以被建築遮擋,看起來就像在3D空間裡。」
阿坤長長地、緩緩地吐出一口氣。他看著林浩,眼神里有種近乎敬畏的困惑。
「林浩,」他輕聲說,「你腦子到底怎麼長的?這些取巧的辦法,你是怎麼想出來的?這已經不是優化了,這是……重新定義問題。」
「因為我們必須活下去。」林浩說,「真3D是未來,但不是現在。在現在和未來之間,我們要搭一座橋。這座橋可能簡陋,可能取巧,但能讓玩家走過去。等他們走到對岸,硬體升級了,我們再拆橋,建真3D。但如果我們現在就要建跨海大橋,會死在半路。」
玻璃房裡安靜了很久。然後陳默第一個鼓掌,很輕,但堅定。接著是趙永,是老徐,是其他程式設計師。最後阿坤也抬起手,拍了一下,很慢,很重。
「那就干。」他說,「但這個方案,工作量巨大。要重寫整個渲染管線,要開發預渲染工具鏈,要做深度圖生成器,要設計圖層管理系統。三個月,不一定夠。」
「那就加班。」林浩說,「從現在開始,引擎組分成兩撥。阿坤帶六個人,攻堅偽3D渲染管線。趙永帶六個人,繼續優化真3D內核,為未來做準備。雙線並行。陳默,你的美術組要調整工作流,所有場景出兩套資源:一套高模用於預渲染,一套低模用於真3D未來版。」
「明白。」
「王磊,你協調伺服器組,為偽3D方案調整同步邏輯。2D場景的同步量小,但事件觸發要更精確。」
「收到。」
「一鳴,你的算法要適配新架構。偽3D的場景事件是離散的,推薦邏輯要調整。」
「好。」
分工完畢,人群散去。玻璃房裡又只剩鍵盤聲。但氣氛不一樣了。剛才的絕望,變成了緊繃的、亢奮的專注。有路了,哪怕是取巧的路,也比沒路好。
林浩走到阿坤身後,看著他調出新的工程文件,開始寫偽3D渲染器的第一行代碼。
「林浩,」阿坤沒回頭,突然說,「如果有一天,硬體夠跑真3D了,我們還會用這個偽3D方案嗎?」
「不會。」林浩說,「但這段代碼,會變成浩宇的遺產。它會告訴我們,在技術不夠的時候,要怎麼用聰明才智活下去。它會提醒我們,做遊戲,技術是手段,不是目的。玩家的體驗,才是目的。」
阿坤的手指停在鍵盤上。他轉過頭,看著林浩,看了很久。
「你知道嗎,」他說,「有時候我覺得,你像個從未來回來的幽靈。你知道所有問題的答案,但你不說,你引導我們自己想出來。為什麼?」
林浩笑了笑,很淡的笑:「因為答案不重要,重要的是找到答案的過程。浩宇不能只靠我一個人,要靠所有人。我要做的,是點燃火把,照亮路。但路,得你們自己走。」
他拍拍阿坤的肩膀,轉身離開。
走出玻璃房,外面辦公區燈火通明。陳默在和白板美術組開會,手舞足蹈地講圖層設計。王磊在打電話,和伺服器託管商談擴容。張一鳴在寫算法文檔,眉頭緊鎖。
所有人都相信,這條路能走通。
因為他們有林浩。
林浩走到窗邊,看著外面。夜色濃重,寒風呼嘯。但遠處工地上的塔吊還在工作,巨大的探照燈劃破黑暗,像不眠的眼睛。
他知道,偽3D方案是權宜之計。但權宜之計,往往能活下來。而活下來,才有機會看到明天。
他想起上輩子,2010年之前,多少中國網遊用2.5D、偽3D的技術,做出了讓玩家沉迷的世界。等硬體上來了,他們再慢慢轉真3D。這是中國遊戲產業的生存智慧——在限制中創新,在夾縫中生長。
現在,浩宇要撿起這份智慧。
窗玻璃上,映出他的臉。年輕,但眼神滄桑。
他轉身,走回自己的工位。打開電腦,開始寫偽3D渲染管線的詳細設計文檔。
鍵盤聲響起。嗒。嗒嗒。嗒。
在寒冷的深夜裡,像心跳,像誓言。
浩宇的偽3D之夢,開始了。
這個夢可能不夠酷,不夠炫,不夠「正統」。
但它能活下來。
而活下來,就有希望。
屏幕上是一個剛跑起來的「山海」原型。畫面很簡陋:一片低多邊形的草原,幾棵紙片般的樹,一個粗糙的3D角色站在中央。角色穿著基礎布衣,手裡拿著一把木劍。按下WASD,角色移動,動作僵硬,幀率顯示:15 FPS。
「這就是極限了。」阿坤的聲音很疲憊,帶著一種接近崩潰的平靜,「在集顯上,同屏十個角色,幀率就掉到15以下。如果是戰場,一百人同屏,會卡成PPT。而2003年,中國70%的網吧電腦,用的都是英特爾845G集顯,顯存共享系統內存,性能是現在測試機的十分之一。」
測試機是浩宇剛採購的「高配」:奔騰4 2.4GHz,512MB內存,GeForce FX 5200獨立顯卡,128MB顯存。這在2003年已經是頂尖配置,但跑「山海」原型依然勉強。而真實的用戶環境,是賽揚1.7GHz,256MB內存,英特爾845G集顯——性能差五倍不止。
玻璃房裡坐了十二個人,沒人說話。只有機箱風扇的嗡嗡聲,和窗外寒風的呼嘯聲。空氣里有種絕望的氣味,像手術台上醫生宣布「我們已經盡力了」。
陳默盯著屏幕上那個粗糙的角色,手指在桌下緊緊攥著。他畫了三個月的原畫,設計了幾十種怪物,構想了宏大的世界觀。但現在,這些可能都出不來——因為機器跑不動。
趙永打破沉默:「能不能再降畫質?把多邊形數砍一半,貼圖解析度降到256x256,關掉所有光影特效。」
「砍了,也救不活集顯。」阿坤調出性能分析報告,「瓶頸在填充率。集顯的像素填充率只有200MT/s,我們的場景即使降到最低畫質,填充需求也要500MT/s。這是硬體天花板,不是優化能解決的。」
「那……放棄集顯用戶?」王磊試探著問,「只針對獨顯用戶開發?但那樣我們會丟掉70%的市場。」
「丟掉70%,剩下的30%里,還有一半是GeForce 4 MX這種入門獨顯,性能比集顯好不了多少。」阿坤搖頭,「林浩,『山海』可能……做不了。至少,做不成3D MMO。也許我們可以退回2.5D,像《奇蹟MU》那樣,固定視角,簡化場景。」
所有人看向林浩。他坐在角落的椅子上,一直沒說話,只是盯著屏幕,盯著那個幀率數字:15。眼神很空,像在看很遠的地方。
然後他站起來,走到白板前。拿起筆,寫下一行字:「2003年硬體性能約束下的3D渲染解決方案」。
「我們走錯方向了。」他說,聲音很平靜,但每個字都像釘子敲進木頭,「我們一直在想『怎麼讓3D跑得更快』,但真正的方向應該是『怎麼讓玩家覺得這是3D,而實際上不是』。」
阿坤皺眉:「什麼意思?」
「意思是,我們要做『偽3D』。」林浩轉過身,看著玻璃房裡的人,「不是真3D,是看起來像3D,用2D的技巧模擬3D的效果。2003年的硬體跑不動真3D,但跑2D綽綽有餘。《血戰天下》萬人同屏都不卡,因為2D渲染開銷小。如果我們能用2D的技術,做出3D的體驗呢?」
「不可能。」阿坤脫口而出,「3D的核心是透視、光照、深度。2D怎麼模擬?」
「預渲染。」林浩在白板上畫圖,「把3D場景預先渲染成2D圖片,分層存儲。運行時,根據玩家視角,動態拼接這些2D層,製造出3D的透視感。光照也用預烘焙——把光影信息算好,存在貼圖里。角色還是3D模型,但場景是2D圖片。這樣,90%的渲染開銷省掉了。」
玻璃房裡死寂。然後阿坤猛地站起來,椅子腿刮擦地板發出刺耳的聲音。
「這是欺騙!」他聲音提高了,「預渲染的2D場景不能旋轉視角,不能動態光照,不能破壞地形!這算什麼3D?這是過場動畫!」
「但玩家要的不是真3D,是3D的『感覺』。」林浩看著他,眼神很銳利,「阿坤,你玩過《最終幻想7》嗎?」
阿坤愣住。
「1997年的遊戲,PS1平台,性能還不如現在的集顯。但它用了預渲染背景加3D角色的技術,讓玩家覺得那是3D世界。玩家不能旋轉視角,但他們會忘記這一點,因為他們被故事、戰鬥、探索吸引了。」林浩頓了頓,「我們要做的,是升級版。用動態圖層實現『偽旋轉』,用多層疊加實現『偽深度』,用精靈動畫實現『偽光影』。技術上,這是2D。體驗上,這是3D。」
陳默眼睛亮了:「就像……皮影戲?用多層剪紙,前後移動,製造立體感?」
「對。」林浩點頭,「場景分五層:遠景(山、雲)、中景(建築、樹木)、近景(路面、雜物)、角色層、特效層。每層是2D圖片,但可以獨立移動、縮放、淡入淡出。玩家移動時,各層以不同速度滾動,產生視差,感覺像在3D空間裡移動。角色是3D模型,但在2D層之間行走,就像在舞台上。」
阿坤不說話了。他走回座位,調出代碼編輯器,手指在鍵盤上快速敲擊。他在算。算渲染開銷,算內存占用,算可行性。十分鐘後,他抬頭,眼神複雜。
「理論上……可行。預渲染的場景圖,一張1024x1024的PNG,壓縮後只有200KB。一個地圖用十張,也就2MB。內存占用是現在3D場景的十分之一。渲染只需要畫2D精靈,集顯完全能跑滿60幀。」他頓了頓,「但……動態光影怎麼辦?破壞地形怎麼辦?天氣系統怎麼辦?」
「光影用多層疊加。」林浩在白板上畫,「比如,一個山洞場景,我們預渲染三套:白天版、夜晚版、火把版。運行時根據遊戲內時間,動態切換。或者更精細點,用『光照蒙版』——一張黑白圖,白色區域亮,黑色區域暗,運行時疊加在場景圖上,模擬光影變化。」
「破壞地形……做不了。但我們可以用『事件觸發替換』。比如一堵牆被炸毀,我們準備兩套場景圖:有牆版和無牆版。觸發爆炸事件後,無縫切換到無牆版。玩家會覺得牆被炸了,實際上只是換了張圖。」
「天氣系統同理。雨、雪、霧,都是單獨一層半透明貼圖,疊加在場景上。粒子效果用2D精靈模擬。」
阿坤聽著,手指在桌上輕輕敲著,像在腦子裡運行這些方案。他不得不承認,林浩說的每一點,技術上都能實現。而且實現成本,比真3D低一個數量級。
「但角色是3D模型,在2D場景里走,不會穿幫嗎?」趙永問。
「用『深度緩衝圖』。」林浩說,「預渲染場景時,同時生成一張『深度圖』,記錄每個像素的深度值。角色移動時,根據深度圖決定誰在前誰在後。這樣,角色可以走到樹後,可以被建築遮擋,看起來就像在3D空間裡。」
阿坤長長地、緩緩地吐出一口氣。他看著林浩,眼神里有種近乎敬畏的困惑。
「林浩,」他輕聲說,「你腦子到底怎麼長的?這些取巧的辦法,你是怎麼想出來的?這已經不是優化了,這是……重新定義問題。」
「因為我們必須活下去。」林浩說,「真3D是未來,但不是現在。在現在和未來之間,我們要搭一座橋。這座橋可能簡陋,可能取巧,但能讓玩家走過去。等他們走到對岸,硬體升級了,我們再拆橋,建真3D。但如果我們現在就要建跨海大橋,會死在半路。」
玻璃房裡安靜了很久。然後陳默第一個鼓掌,很輕,但堅定。接著是趙永,是老徐,是其他程式設計師。最後阿坤也抬起手,拍了一下,很慢,很重。
「那就干。」他說,「但這個方案,工作量巨大。要重寫整個渲染管線,要開發預渲染工具鏈,要做深度圖生成器,要設計圖層管理系統。三個月,不一定夠。」
「那就加班。」林浩說,「從現在開始,引擎組分成兩撥。阿坤帶六個人,攻堅偽3D渲染管線。趙永帶六個人,繼續優化真3D內核,為未來做準備。雙線並行。陳默,你的美術組要調整工作流,所有場景出兩套資源:一套高模用於預渲染,一套低模用於真3D未來版。」
「明白。」
「王磊,你協調伺服器組,為偽3D方案調整同步邏輯。2D場景的同步量小,但事件觸發要更精確。」
「收到。」
「一鳴,你的算法要適配新架構。偽3D的場景事件是離散的,推薦邏輯要調整。」
「好。」
分工完畢,人群散去。玻璃房裡又只剩鍵盤聲。但氣氛不一樣了。剛才的絕望,變成了緊繃的、亢奮的專注。有路了,哪怕是取巧的路,也比沒路好。
林浩走到阿坤身後,看著他調出新的工程文件,開始寫偽3D渲染器的第一行代碼。
「林浩,」阿坤沒回頭,突然說,「如果有一天,硬體夠跑真3D了,我們還會用這個偽3D方案嗎?」
「不會。」林浩說,「但這段代碼,會變成浩宇的遺產。它會告訴我們,在技術不夠的時候,要怎麼用聰明才智活下去。它會提醒我們,做遊戲,技術是手段,不是目的。玩家的體驗,才是目的。」
阿坤的手指停在鍵盤上。他轉過頭,看著林浩,看了很久。
「你知道嗎,」他說,「有時候我覺得,你像個從未來回來的幽靈。你知道所有問題的答案,但你不說,你引導我們自己想出來。為什麼?」
林浩笑了笑,很淡的笑:「因為答案不重要,重要的是找到答案的過程。浩宇不能只靠我一個人,要靠所有人。我要做的,是點燃火把,照亮路。但路,得你們自己走。」
他拍拍阿坤的肩膀,轉身離開。
走出玻璃房,外面辦公區燈火通明。陳默在和白板美術組開會,手舞足蹈地講圖層設計。王磊在打電話,和伺服器託管商談擴容。張一鳴在寫算法文檔,眉頭緊鎖。
所有人都相信,這條路能走通。
因為他們有林浩。
林浩走到窗邊,看著外面。夜色濃重,寒風呼嘯。但遠處工地上的塔吊還在工作,巨大的探照燈劃破黑暗,像不眠的眼睛。
他知道,偽3D方案是權宜之計。但權宜之計,往往能活下來。而活下來,才有機會看到明天。
他想起上輩子,2010年之前,多少中國網遊用2.5D、偽3D的技術,做出了讓玩家沉迷的世界。等硬體上來了,他們再慢慢轉真3D。這是中國遊戲產業的生存智慧——在限制中創新,在夾縫中生長。
現在,浩宇要撿起這份智慧。
窗玻璃上,映出他的臉。年輕,但眼神滄桑。
他轉身,走回自己的工位。打開電腦,開始寫偽3D渲染管線的詳細設計文檔。
鍵盤聲響起。嗒。嗒嗒。嗒。
在寒冷的深夜裡,像心跳,像誓言。
浩宇的偽3D之夢,開始了。
這個夢可能不夠酷,不夠炫,不夠「正統」。
但它能活下來。
而活下來,就有希望。