Yifeng Wang把代碼燒進(jìn)索尼PSP的存儲(chǔ)卡,按下運(yùn)行鍵。在那個(gè)4.3英寸、分辨率只有480×272的屏幕上,一張經(jīng)典的倉(cāng)庫(kù)地圖緩緩展開(kāi),機(jī)器人對(duì)手開(kāi)始移動(dòng),槍口的閃光配合60幀的平滑幀率,完全不像是在一臺(tái)22年前的掌機(jī)上發(fā)生的事。Wang并不是移植界的新面孔,但這次他帶來(lái)的OpenStrike項(xiàng)目,更像是一次刻意的技術(shù)追問(wèn)——既然沒(méi)有人說(shuō)過(guò)不能做,為什么不去試試?
這個(gè)“試試”的背后,是Wang完全從零搭建的一套開(kāi)發(fā)體系。他沒(méi)有拿現(xiàn)成的引擎去削足適履,而是用Rust語(yǔ)言寫(xiě)了一款名為Pocket3D的3D引擎,專(zhuān)為PSP這種性能極其有限的硬件深度優(yōu)化。為了處理游戲規(guī)則和菜單界面,他還配套實(shí)現(xiàn)了PocketJS,一種輕量的JavaScript引擎。Wang在公開(kāi)的技術(shù)說(shuō)明里透露,目前淘汰賽模式已經(jīng)可以帶著機(jī)器人玩起來(lái),八張反恐精英原版地圖全部跑通,只是武器購(gòu)買(mǎi)階段還沒(méi)有實(shí)裝。對(duì)喜歡折騰的模組作者來(lái)說(shuō),這已經(jīng)是足夠的基礎(chǔ),他們可以在此基礎(chǔ)上打造自己的地圖和玩法。
![]()
能在PSP上維持每秒60幀穩(wěn)定輸出,關(guān)鍵一步是徹底改寫(xiě)圖形管線的計(jì)算時(shí)機(jī)。Wang把場(chǎng)景光照的烘焙全部提前到預(yù)處理階段,直接將光照貼圖的數(shù)據(jù)寫(xiě)入每個(gè)頂點(diǎn)的顏色通道里。這樣一來(lái),運(yùn)行時(shí)完全不需要實(shí)時(shí)計(jì)算光線分布,也不用在啟動(dòng)時(shí)重新解算,整個(gè)渲染任務(wù)的負(fù)擔(dān)被大幅壓縮。對(duì)于一片2004年上市、主頻只有333MHz MIPS處理器的環(huán)境,這種取舍幾乎是唯一能保持流暢的做法。
更讓人好奇的是,即使在性能充裕的今天,Wang仍然堅(jiān)持使用二叉空間分割(BSP)這種老派算法來(lái)剔除不可見(jiàn)區(qū)域。相比后來(lái)興起的光線追蹤或屏幕空間剔除,BSP的優(yōu)勢(shì)在于它的計(jì)算量極低,在已經(jīng)預(yù)計(jì)算好的場(chǎng)景中,判斷哪些多邊形不必繪制幾乎不消耗CPU資源。這個(gè)選擇看上去保守,卻恰好構(gòu)成一次原則的現(xiàn)場(chǎng)演示:技術(shù)方案的評(píng)價(jià)標(biāo)準(zhǔn)不應(yīng)該是新舊,而是是否還管用。
同樣的代碼遷移到索尼后續(xù)的PS Vita上,表現(xiàn)更加從容。PS Vita的有效分辨率提升到960×544,是原版PSP的四倍,OpenStrike卻不需要對(duì)3D渲染部件或者2D UI素材做任何拉伸處理,直接以原生分辨率輸出。項(xiàng)目本身也不局限于便攜設(shè)備,把它放在標(biāo)準(zhǔn)PC上跑,或者掛載到PPSSPP模擬器里運(yùn)行,都沒(méi)有問(wèn)題。唯一需要用戶自己解決的,是合法準(zhǔn)備一份反恐精英的資源文件,就像在無(wú)數(shù)Doom移植版中使用原版WAD數(shù)據(jù)一樣。
拆開(kāi)OpenStrike的技術(shù)架構(gòu)后,會(huì)發(fā)現(xiàn)Wang的野心根本不是只做一個(gè)游戲移植。Pocket3D引擎和PocketJS 2D框架都被設(shè)計(jì)成通用工具,OpenStrike僅僅是利用它們產(chǎn)出的第一個(gè)“產(chǎn)品”。底層采用了服務(wù)器/客戶端/事件總線這種頗為現(xiàn)代化的結(jié)構(gòu),最關(guān)鍵的地方在于,射擊、移動(dòng)等事件的處理邏輯,和畫(huà)面渲染模塊之間是完全解耦的。這種隔離避免了因?yàn)槟骋粠妮敵鋈蝿?wù)過(guò)重而拖慢整個(gè)邏輯循環(huán),進(jìn)而引發(fā)掉幀。按照Wang在代碼倉(cāng)庫(kù)里的說(shuō)明,這個(gè)游戲可以離線測(cè)試,幾乎所有元素都暴露在可配置的接口下,降低了后來(lái)者的修改門(mén)檻。
或許最值得玩味的地方,不是那臺(tái)老掌機(jī)真的跑起了一款經(jīng)典射擊游戲,而是Wang在搭建這套工具鏈時(shí)留下的空間。他沒(méi)有把代碼封死在一個(gè)特定的游戲邏輯上,也沒(méi)有為性能而犧牲架構(gòu)的可擴(kuò)展性。這意味著,下一個(gè)想在PSP上試驗(yàn)奇怪點(diǎn)子的人,不必從零開(kāi)始啃硬件手冊(cè),而是可以直接站在通用引擎和事件系統(tǒng)的肩膀上,更早一步進(jìn)入“為什么不呢”的階段。
特別聲明:以上內(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.