![]()
游戲代碼的道與術(shù)。
今年我玩了近百個(gè)小時(shí)的《哈迪斯2》,其中一部分時(shí)間是在游戲的文件夾中度過的。
樂趣在于,《哈迪斯2》的大量核心邏輯、技能數(shù)值和關(guān)卡流程都是用Lua腳本編寫的,這些文件直接以純文本形式存在于游戲目錄中,可讀性很高,任何玩家都可以輕松閱讀、理解。
換句話說,進(jìn)入磁盤文件尋找contents/scripts,這其中的將近480個(gè)文件、50多萬(wàn)行l(wèi)ua代碼,就像一本細(xì)致的游戲設(shè)定集,讓你能夠深入了解游戲的各個(gè)系統(tǒng)包含有哪些內(nèi)容,又是怎樣運(yùn)作起來的。
比如說,眾所周知“哈迪斯”系列以文本量大著稱,十分注重劇情故事和人物塑造,而在這些文件中,就可以找到所有角色的全部對(duì)話。
![]()
對(duì)劇情有興趣的玩家在翻看時(shí),得做好“劇透”的準(zhǔn)備
清晰易讀的另一個(gè)好處是,不僅便于開發(fā)者后期對(duì)游戲的維護(hù)和拓展,同時(shí)也給與玩家更多操作的可能——因?yàn)橛螒驍?shù)值清晰可見,所以修改起來無非就是改動(dòng)下數(shù)字,幾乎不費(fèi)功夫;Mod作者也不需要進(jìn)行復(fù)雜的逆向工程,還能結(jié)合開發(fā)者留下的注釋作為教程,難怪游戲在玩家社群中被稱為“對(duì)Mod”最友好的游戲。
![]()
12月剛剛在玩家社區(qū)引起熱議的人氣Mod《扎格列歐斯之旅(Zagreus Journey)》就是個(gè)挺典型的例子。
這個(gè)大型Mod允許玩家直接操縱2代主角墨利諾厄重新體驗(yàn)1代的全部冒險(xiǎn),不僅全面復(fù)刻了1代的關(guān)卡、敵人,還調(diào)整適配了戰(zhàn)斗機(jī)制,全面支持阿卡那牌、忠誓任務(wù)、信物等系統(tǒng),新增了數(shù)十種收集資源與大量劇情故事。
![]()
如果不是《哈迪斯2》的“代碼底子”足夠好,很難想象MOD作者能夠單槍匹馬在不到一年的時(shí)間里完成這么大的工作量。
這當(dāng)然是游戲的開發(fā)商Supergiant Games有意為之。早在2020年的初代《哈迪斯》時(shí)期,其就在與玩家交流的問答環(huán)節(jié)提及:“游戲的許多方面都很容易修改,因?yàn)閿?shù)據(jù)都是公開的。”玩家能夠更改所有的文本和數(shù)字,并為游戲自由添加內(nèi)容不受限制。
而哈迪斯的口碑和熱度延續(xù),似乎也一定程度論證了“好代碼”的積極作用:不論從日后持續(xù)迭代游戲或是激活玩家參與內(nèi)容創(chuàng)作的角度,這些“背后功夫”都不是白做,還能夠賦予作品更廣闊的成長(zhǎng)空間。
所以說,游戲開發(fā)者有什么理由不去盡力優(yōu)化代碼呢?
1
還真有。或者說,代碼“能跑就行”,至今仍是游戲行業(yè)中的一種普遍論調(diào)。
2024年的《小丑牌》拿獎(jiǎng)拿到手軟,儼然被行業(yè)視為風(fēng)向標(biāo),但其游戲代碼卻遠(yuǎn)不如游戲設(shè)計(jì)那么優(yōu)美,許多復(fù)雜的游戲邏輯,如不同小丑牌的效果疊加、分?jǐn)?shù)計(jì)算,都是直接用大量的、嵌套的if-else語(yǔ)句堆砌而成,導(dǎo)致代碼看起來原始且重復(fù)。
![]()
![]()
游戲開發(fā)者LocalThunk曾經(jīng)直言不諱《小丑牌》的底層代碼是用“希望和夢(mèng)想粘在一起的”,頗有些“俺尋思這可以,沒想到真的能行”的自嘲意味。
當(dāng)時(shí)也有不少遺憾的聲音,表示這樣的底層代碼使得《小丑牌》難以隨著時(shí)間的推進(jìn)進(jìn)化、拓展機(jī)制。
然而在相關(guān)討論中,經(jīng)常是支持者占了上風(fēng)。一方面,大量的if-else語(yǔ)句在代碼效率上固然不算好,但同時(shí)也具備容易理解的優(yōu)勢(shì),這使得玩家能夠相對(duì)輕松地在核心玩法框架不變的前提下添加新的小丑牌。
另一方面,不少游戲開發(fā)者都站出來解釋,如果代碼能夠正常運(yùn)行,那么就沒必要鉆牛角尖。例如一位曾供職過R星的獨(dú)立開發(fā)者就表示:“要記住目標(biāo)是發(fā)布游戲,而不是編寫最簡(jiǎn)潔、最優(yōu)雅的代碼。”
![]()
這些支持者大多認(rèn)為,只要代碼能跑,便于調(diào)試,并且沒有嚴(yán)重影響性能,那就已經(jīng)合格——大多數(shù)情況下,只要達(dá)成上述條件,玩家也不會(huì)在意游戲背后的代碼如何運(yùn)作。

就說飛沒飛吧
事實(shí)上, LocalThunk最終也是這么達(dá)成了自我和解:“它并不完美,但我知道每個(gè)東西在哪里,而且我是唯一需要維護(hù)它的人,所以這對(duì)我來說很有意義。如果它很蠢但是有效,那么它就不蠢!”
LocalThunk原本就只是一位業(yè)余游戲開發(fā)者,在游戲開發(fā)過程中神經(jīng)一直繃得很緊。根據(jù)其自己發(fā)表的開發(fā)記錄,《小丑牌》完成之前,他已經(jīng)長(zhǎng)期焦慮、失眠,甚至一度因焦慮癥發(fā)作去了醫(yī)院。
可以想象,在開發(fā)者光是為了構(gòu)思創(chuàng)意、實(shí)現(xiàn)創(chuàng)意就已經(jīng)費(fèi)盡心神的情況下,很多時(shí)候是無暇顧及“精修”代碼的。
不是所有人都擁有高超的編程技術(shù),對(duì)于創(chuàng)意工作者,花費(fèi)時(shí)間在代碼上,往往意味著打磨創(chuàng)意、填充內(nèi)容的時(shí)間被擠占。
真要以代碼水平去要求《小丑牌》的話,此消彼長(zhǎng)下,游戲的創(chuàng)意水平大概率達(dá)不到今天的高度,甚至連游戲能否正常發(fā)布都得打個(gè)問號(hào)——這其實(shí)是大多數(shù)獨(dú)立游戲都會(huì)面臨的問題。
很多玩家今天耳熟能詳?shù)淖髌罚瑢?shí)際上都充當(dāng)過編程的反面教材。《傳說之下》作者在處理對(duì)話系統(tǒng)時(shí)使用了一個(gè)巨大的switch語(yǔ)句,導(dǎo)致游戲中的每一個(gè)對(duì)話分支、每一個(gè)角色的每一句話,幾乎都堆在一個(gè)幾萬(wàn)行的超大函數(shù)里;《蔚藍(lán)》的主角控制邏輯包含了超過5000行代碼,攀爬、跳躍、沖刺、物理判定、動(dòng)畫切換,全部擠在一個(gè)文件里;初代《我的世界》的Java代碼也是出了名的隨性混亂,致使游戲底層架構(gòu)臃腫,后續(xù)花了多年時(shí)間重做。
![]()
知名程序員、id Software創(chuàng)始人之一約翰·卡馬克曾舉證:“我兒子說‘寫代碼不過是if、else和for循環(huán)而已’”
離中國(guó)玩家更近的一個(gè)例子或許是《太吾繪卷》。對(duì)不少國(guó)內(nèi)玩家而言,這是一款具有劃時(shí)代意義的產(chǎn)品,感情很深,既是因?yàn)樗?dāng)初閃電般的迅速崛起,也是因?yàn)樵谀侵髮?duì)游戲正式版的漫長(zhǎng)等待。
不少人可能還記得,回望2018年,《太吾繪卷》的代碼水平最初是被當(dāng)作神話或是傳說來傳播的。游戲制作人茄子只看了一個(gè)月Unity教程就上去寫游戲,結(jié)果“蛐蛐大神保平安,綠皮逆練代碼無BUG一遍過”,游戲順利發(fā)布并引發(fā)轟動(dòng)——事實(shí)是,游戲出色的成績(jī)和一言難盡的代碼水平構(gòu)成了鮮明的反差,繼而成為其最早的一大記憶點(diǎn)。
![]()
如果故事只到這里,那么或許還稱得上因禍得福。但EA上架的《太吾繪卷》和上線時(shí)已經(jīng)趨于完成的《小丑牌》處境并不相同,游戲的玩法框架要更自由,茄子本身也還有更多的想法要去實(shí)現(xiàn)。
這就導(dǎo)致原本的代碼無力承載,茄子則在游戲大獲成功后迅速表態(tài)希望“把游戲里千瘡百孔的代碼一一修補(bǔ)起來,為大家?guī)硪粋€(gè)在程序上,更強(qiáng)健、穩(wěn)定、高效的好玩的游戲”。
后來《太吾繪卷》花了那么大力氣去償還技術(shù)債務(wù),大概也是意識(shí)到,“差代碼”有時(shí)能夠使得一款好游戲更早順利發(fā)布,但同時(shí),“好代碼”能創(chuàng)造更多可能,讓一款好游戲變得更好。
2
好的代碼能發(fā)揮什么作用?
2024年與《小丑牌》有并駕齊驅(qū)之勢(shì)的《動(dòng)物井》,開發(fā)者Billy Basso歷時(shí)七年,基于C++自行開發(fā)游戲引擎。最終,這款畫面精致、動(dòng)態(tài)光影復(fù)雜的2D像素游戲,安裝體積被壓縮到極致的33MB。
由于代碼高度自研且沒有任何冗余的第三方庫(kù),Basso能夠?qū)τ螒虻母鱾€(gè)方面進(jìn)行完全的掌控,同時(shí)也滿足了他構(gòu)建和理解底層系統(tǒng)的樂趣。
比如游戲中讓玩家印象深刻的視覺效果和光照,他表示沒有采用單一的著色器,而是使用了約50個(gè)小的獨(dú)立技術(shù),包括動(dòng)態(tài)陰影、邊緣光照、水體效果、流體系統(tǒng)等等。
![]()
Basso在GDC上的技術(shù)分享
最終,這種優(yōu)美的底層代碼為游戲的解謎提供了物理層面的深度,也從根本上影響了游戲核心的解謎機(jī)制。
玩家或許不會(huì)直接審視代碼的好壞,但更好的代碼確有可能為玩家?guī)砀鼮閮?yōu)質(zhì)的游戲體驗(yàn)和更深刻的印象,就像Basso曾表示《動(dòng)物井》還可以做到更小:“如果我知道人們會(huì)如此印象深刻,我可能會(huì)更加努力地縮小它”。
也可以說,當(dāng)游戲的核心玩法樂趣高度依賴代碼的復(fù)雜功能時(shí),后者的存在感難免愈發(fā)明顯。
高自由度的《Noita》以技術(shù)著稱,游戲只設(shè)定下物質(zhì)的基本規(guī)則,如水遇火變蒸汽,酸腐蝕木頭,剩余的一切交給玩家自行探索,從中誕生出了各種超乎預(yù)想的玩法和戰(zhàn)術(shù)。

其玩法核心的背后是自研的“Falling Sand”引擎:屏幕上的每一顆像素——無論是流動(dòng)的液體、燃燒的火焰還是被炸碎的巖石——都具備獨(dú)立的物理屬性和化學(xué)反應(yīng)邏輯。
實(shí)現(xiàn)這種“像素級(jí)物理”需要極高水平的多線程架構(gòu)和數(shù)學(xué)建模,相應(yīng)的,開發(fā)團(tuán)隊(duì)設(shè)計(jì)了一套極其穩(wěn)健的實(shí)體組件系統(tǒng)(ECS),使得成千上萬(wàn)個(gè)具備物理屬性的像素點(diǎn)可以相互碰撞、傳導(dǎo)溫度、發(fā)生相變。
從這個(gè)角度看,代碼已經(jīng)不止是實(shí)現(xiàn)創(chuàng)意的工具,而是作為創(chuàng)意本身與玩家發(fā)生交互。
放在過去,好的代碼往往是隱形的。就像一個(gè)人身體健康,那么一切都自然而然,只有哪個(gè)部位出了毛病,才會(huì)清晰感知到其存在。
但隨著游戲品類的豐富,開發(fā)者與玩家之間的關(guān)系拉近,代碼時(shí)不時(shí)也會(huì)浮出水面,作為開發(fā)者“研發(fā)態(tài)度”的象征,進(jìn)而影響到產(chǎn)品的對(duì)外形象。
像《戴森球計(jì)劃》早期做技術(shù)分享,就有玩家“恍然大悟”,都是模擬類游戲,為何戴森球十分流暢,隔壁天際線卻卡到不行。
![]()
包括前面提到的哈迪斯,也是因此收獲玩家盛贊,即便玩家可能看不懂代碼,但至少讀得出誠(chéng)意。
![]()
隨之而來的是,伴隨著游戲的長(zhǎng)線運(yùn)營(yíng),“優(yōu)美的代碼”也成為需要持續(xù)維護(hù)的對(duì)象。
舉個(gè)例子,好評(píng)如潮的模擬工廠流水線游戲《異星工廠》,至今保留著他們的Factorio Friday Facts每周博客文章,目前已更新到400多篇,事無巨細(xì)地與玩家分享詳細(xì)的更新內(nèi)容、開發(fā)見解、新功能和游戲機(jī)制,技術(shù)細(xì)節(jié)涵蓋從引擎改進(jìn)到代碼效率提升的方方面面。
![]()
這下,連代碼也成為維系玩家的紐帶了。
![]()
結(jié)語(yǔ)
回到最開始的問題,游戲代碼應(yīng)該追求優(yōu)美,還是能跑就行?
我在reddit上翻到一篇關(guān)于“好代碼”重要性的帖子,一位小有名氣的游戲制作人Tomas Sala和網(wǎng)友論辯了十來個(gè)回合,幾乎快演變?yōu)槿松砉簦琅f難分勝負(fù)。
Sala堅(jiān)持“創(chuàng)意落地”優(yōu)先于“代碼優(yōu)化”,功能性雖然重要,但更關(guān)鍵的是向玩家提供一種獨(dú)特的體驗(yàn)。
以他自己的作品《堡壘:獵鷹戰(zhàn)紀(jì)》為例,就是以一種“又快又野”的實(shí)用方式寫出來的,結(jié)果營(yíng)收超過100萬(wàn)——所以不要浪費(fèi)時(shí)間在“好看”的代碼上,為了在現(xiàn)代游戲市場(chǎng)中生存,需要盡快且低成本地驗(yàn)證思路。“Steam上95%的游戲不需要維護(hù),因?yàn)椴⒉怀晒Γm結(jié)于代碼完全是白費(fèi)力氣”。
![]()
網(wǎng)友則反擊,代碼做得越好,迭代與打磨玩法樂趣就更容易。優(yōu)化代碼、提升代碼能力,本質(zhì)上是一種對(duì)未來的投資,既能為今后作品做更好的鋪墊,也能有效避免后續(xù)的技術(shù)債務(wù)。
這背后倒是讓人體會(huì)到兩種并行的市場(chǎng)背景。一邊是3A沒落,獨(dú)立游戲來到行業(yè)地位高點(diǎn),從業(yè)人員更加崇尚“創(chuàng)意為先”。對(duì)于以機(jī)制創(chuàng)意或敘事驅(qū)動(dòng)的作品,“能跑就行”的代碼性價(jià)比高,因?yàn)槠浜诵镊攘υ谟凇包c(diǎn)子”,代碼只是完成創(chuàng)意的工具。
另一邊,長(zhǎng)線運(yùn)營(yíng)成為行業(yè)常態(tài),保持游戲活力、維護(hù)玩家關(guān)系成為了大趨勢(shì)。再加上AI技術(shù)的發(fā)展,技術(shù)普惠進(jìn)一步降低了玩家參與游戲內(nèi)容創(chuàng)作的門檻,這又對(duì)游戲代碼提出了更高的要求。
而所謂的“好、壞代碼”,或許也只是南橘北枳罷了。
特別聲明:以上內(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.