真的在優(yōu)化了,沒有摸魚……
各位工坊主大家好,自2022年5月《沙石鎮(zhèn)時(shí)光》以搶先體驗(yàn)形式發(fā)售一年以來,我們收到了很多有關(guān)優(yōu)化問題的反饋,包括加載時(shí)間長、城鎮(zhèn)內(nèi)掉幀等情況。今天我們的主題,就是給大家說明一下,為什么《沙石鎮(zhèn)時(shí)光》會出現(xiàn)這些問題,以及針對這些問題,我們做了一些什么工作——在看完后,您或許會明白,這里并不存在所謂的”屎山代碼“,更多的是設(shè)計(jì)方面的權(quán)衡。如果大家在看后還有其他疑問,也歡迎大家在評論區(qū)和我們討論。
1.《沙石鎮(zhèn)時(shí)光》優(yōu)化問題的成因及難點(diǎn)
在2022年5月26日《沙石鎮(zhèn)時(shí)光》以搶先體驗(yàn)版發(fā)售之初,我們收到了較多有關(guān)優(yōu)化問題的反饋:其一是關(guān)于游戲的加載時(shí)間,其二是有關(guān)城鎮(zhèn)場景中的幀率不穩(wěn)定情況。
讓我們先從第一點(diǎn)說起。
由于每一次從主菜單進(jìn)入游戲時(shí)(或從存檔載入游戲),游戲的場景美術(shù)資源、代碼等都需要進(jìn)行加載,才能保證大家能正常玩游戲。而需要加載的資源越多,游戲的加載時(shí)間也就越長。舉個(gè)例子說明,與《波西亞時(shí)光》相比,僅建筑方面所使用的資源,《沙石鎮(zhèn)時(shí)光》就達(dá)到了波西亞五倍之多。所以,一開始大家就會明顯地感覺到進(jìn)入游戲的加載時(shí)間變長了。
同樣的,大家的每一次進(jìn)出門,每一次進(jìn)出副本,程序后臺都需要進(jìn)行一次室外場景的卸載和室內(nèi)場景(副本場景)的加載。由此一來,大家在游戲發(fā)售之初體驗(yàn)到的進(jìn)出門、進(jìn)出副本時(shí)長長的加載時(shí)間就由此產(chǎn)生了。

時(shí)光系列一直以來的游戲設(shè)計(jì)理念是,雖然是單機(jī)游戲,但是我們希望玩家在游戲中不要感受到孤獨(dú)感,希望大家覺得游戲世界是一個(gè)鮮活的世界,希望游戲中的NPC能帶給大家更多“活”的感受,這樣,在結(jié)束游戲之后,大家才能回憶起游戲中所渡過的這一段美好的“時(shí)光”。因此,游戲內(nèi)的NPC,都會有他們的日?;顒?dòng),你會看到他們會和現(xiàn)實(shí)中的人物一樣上班下班,在驛站吃飯吹牛、日?;?dòng)。這意味著,即便當(dāng)前狀態(tài)玩家沒看到這些NPC,系統(tǒng)也需要進(jìn)行實(shí)時(shí)的計(jì)算,計(jì)算他們當(dāng)前的位置,計(jì)算他們當(dāng)前的行進(jìn)路線,計(jì)算他們當(dāng)前正在干的事情。因此,NPC AI的加載也需要花費(fèi)很多時(shí)間。
舉個(gè)例子來說,沙石鎮(zhèn)中,單個(gè)NPC AI的行為樹節(jié)點(diǎn),中位數(shù)就達(dá)到了約800個(gè)。大幾十個(gè)NPC AI的加載,必然導(dǎo)致了時(shí)間的花銷。當(dāng)然,為了減少一開始的的加載時(shí)長,我們采用了一開始只加載行為軌跡,而不加載模型的方式。也就是說,進(jìn)入游戲后,NPC在后臺一直在活動(dòng),只有當(dāng)NPC進(jìn)入工坊主視野范圍時(shí),才在當(dāng)前幀對NPC的模型進(jìn)行加載。這可以有效降低一開始的加載時(shí)間,但帶來的問題是,這一幀突然的加載,會帶來幀數(shù)的突然降低,卡頓的情況。
當(dāng)然,幀數(shù)的不穩(wěn)定,還和很多東西有關(guān)系。比如夜間的場景表現(xiàn),由于新增了數(shù)十個(gè)光源,每一個(gè)光源會帶來無數(shù)的新的陰影,所以夜間也會尤其卡。而且整體場景中,由于我們一開始沒有規(guī)劃好LOD,所以也帶來了幀數(shù)的降低和不穩(wěn)定。(所謂LOD,就是針對遠(yuǎn)近不同的物件模型進(jìn)行分別處理,讓遠(yuǎn)處的物體顯示模型面數(shù)低的模型,從而節(jié)省性能的開支。)

2、我們的解決方案
既然已經(jīng)確定了優(yōu)化問題的成因,那么接下來就是想辦法解決它們。
加載優(yōu)化
針對加載時(shí)間的問題,我們采用的是,讓游戲內(nèi)的主場景資源一直緩存在電腦內(nèi)存中,而不是像之前一樣每進(jìn)出一次門就進(jìn)行卸載&加載。這樣處理之后,雖然啟動(dòng)游戲(載入存檔)還是需要較長時(shí)間進(jìn)行加載,而且游戲的內(nèi)存占用峰值會有所增長,但是至少每次進(jìn)出門所需的加載時(shí)間大幅減少了。我們于去年9月2日的版本中采用了這個(gè)方案,在此次更新之后,至少大多數(shù)工坊主不需要每次進(jìn)出門都刷手機(jī)解悶了。為什么說是大多數(shù)呢,因?yàn)椴糠滞婕业碾娔X配置中,內(nèi)存容量不大(比如只有8G),這就導(dǎo)致有的進(jìn)出門的時(shí)候不得不卸載掉某些資源,因此導(dǎo)致了這部分內(nèi)存容量小的玩家進(jìn)出門加載依然體驗(yàn)不好。所以,我們推薦使用16G內(nèi)存進(jìn)行游戲。
不過這個(gè)方法也不是萬能的。目前進(jìn)出挖掘副本和戰(zhàn)斗探索副本,依然會感受到不短的加載時(shí)間。因?yàn)楦北举Y源本身資源就比較多,拿北部遺跡舉例,其模型數(shù)量,和主場景的模型數(shù)量相當(dāng)。這樣的情況下,再大的內(nèi)存也扛不住。再比如挖掘副本,由于我們采用的是Voxel,這也會導(dǎo)致數(shù)據(jù)量非常大,因此需要在進(jìn)入的時(shí)候在內(nèi)存中卸載掉一部分主場景資源,以保證副本的穩(wěn)定流暢。
(Tips:關(guān)于Voxel,大家可以想象成,地圖場景中,有無數(shù)個(gè)可以被拿掉的方塊。玩家每挖一下,也就意味著拿掉一個(gè)方塊。那么這里,本來標(biāo)記為1,系統(tǒng)就需要把它標(biāo)記為0并存儲下來。想想一下,我們最多的挖掘副本有11層,每一層有數(shù)千個(gè)Voxel……)
另外,對于NPC AI行為樹的加載,目前我們也采用了和之前不一樣的做法。之前的做法是,所有的NPC AI的行為樹是一整棵樹。而目前我們把每一個(gè)NPC AI的行為樹按照使用環(huán)境分為了不同的行為樹,比如在主場景中,房間內(nèi),副本內(nèi),任務(wù)劇情內(nèi)……這樣能讓單一行為樹變得簡單一些,也能減少加載時(shí)間。

掉幀優(yōu)化
對于NPC模型加載導(dǎo)致的頻繁掉幀,我們嘗試優(yōu)化加載的方式。之前采用的是在一幀之內(nèi)全部加載完成,而我們現(xiàn)在嘗試將NPC分為多個(gè)部件,在3-4幀內(nèi)分步進(jìn)行加載。由于這個(gè)步驟是在后臺完成的,大家看到的NPC不會有什么不同,但是在游戲體驗(yàn)上來說,它可以有效地減少大家遭遇的掉幀情況。下圖是分布加載的示范。

除此之外,我們也在嘗試對LOD進(jìn)行了更加細(xì)致的規(guī)劃——前文中我們已經(jīng)提到,《沙石鎮(zhèn)時(shí)光》的場景資源非常豐富,沙石鎮(zhèn)上有很多漂亮的建筑,它們都有很多的頂點(diǎn)數(shù)和面數(shù),工坊主在離建筑很近時(shí),它們看起來非常好看;而當(dāng)大家走遠(yuǎn)的時(shí)候,建筑還在視線內(nèi),雖然看起來不是那么清晰了,但此時(shí)建筑的模型的頂點(diǎn)和面數(shù)都不變,性能開銷也還是那么多。這種時(shí)候,LOD就顯得非常重要了。對于已經(jīng)處于視線之外或者較遠(yuǎn)距離的物體,使用性能開銷較低的模型,減少面數(shù),可以降低電腦運(yùn)行時(shí)候的負(fù)擔(dān)。目前這個(gè)工作還在進(jìn)一步推進(jìn)中,爭取在正式版的時(shí)候有一個(gè)比較理想的狀態(tài)。
3、新的問題以及我們的解決方案
可能有不少工坊主都有疑問:在去年9月的版本優(yōu)化后,確實(shí)感覺游戲在加載時(shí)間和幀數(shù)方面有了不小的提升,但是在幾次游戲更新之后,為什么感覺又越來越卡了?
這還得從這幾次更新給小鎮(zhèn)帶來的新變化說起:首先,為了呈現(xiàn)更加美麗的沙石鎮(zhèn)以及隨劇情進(jìn)展而誕生的小鎮(zhèn)新氣象,我們給沙石鎮(zhèn)增加了更多小細(xì)節(jié),例如阿蜜拉陶器店附近的小陶罐、升級的卡托莉游樂廳、研究站頂部的望遠(yuǎn)鏡等等。這些小裝飾單個(gè)算下來可能都沒有太多的占用,但是相加之下,依然會帶來可觀的性能開銷。




另外,隨著劇情的推進(jìn),沙石鎮(zhèn)開始下雨了。雨水的粒子效果以及物理碰撞(如果沒有物理碰撞,那么雨就能下進(jìn)屋子里了)也給優(yōu)化工作造成了不小的挑戰(zhàn)。目前我們采用的方式是,嘗試降低遠(yuǎn)處雨水的粒子效果,進(jìn)而減少一定的性能開銷。
在沙石鎮(zhèn)的設(shè)計(jì)中,我們希望大家能夠一眼看到盡可能多的模型,比如站在城鎮(zhèn)高處,你可以看到很遠(yuǎn)的地方且能看到細(xì)節(jié),而且很多地方都是可以去的(其它的游戲設(shè)計(jì)中,可能會使用一個(gè)簡化的模型將大多數(shù)場景進(jìn)行遮擋),這也導(dǎo)致沙石鎮(zhèn)的城鎮(zhèn)場景性能開銷不可避免的比較多。正如大家所見,隨著版本的更迭,沙石鎮(zhèn)變得越來越熱鬧,也越來越美了,但與此同時(shí),這也意味著更多的性能開銷。而如何在保證游戲體驗(yàn)的同時(shí),把性能開銷降低到可接受的水平,就是我們優(yōu)化工作的重點(diǎn)。

舉例來說,我們正在嘗試減少會移動(dòng)的碰撞體的數(shù)量,由此來減少物理效果造成的性能開銷——具體而言,此前工坊機(jī)器上的軸承會隨著齒輪的旋轉(zhuǎn)而進(jìn)行運(yùn)動(dòng)、產(chǎn)生碰撞,而現(xiàn)在我們將這類不必要的碰撞關(guān)掉了;一些原本由程序控制的場景物體運(yùn)動(dòng),我們使用了性能開銷較低的Tweener動(dòng)畫來呈現(xiàn)。如此一來,雖然看起來并沒有什么不同,但對于性能開銷的的確確是降低了,這一點(diǎn)對于配置較低的機(jī)器來說影響會尤為明顯。
不得不提的是,在過去每一個(gè)《沙石鎮(zhèn)時(shí)光》的角色身上會有多個(gè)功能不同的碰撞體,分別負(fù)責(zé)攻擊判定、受擊判定、檢測和激活周圍物體的交互,現(xiàn)在我們將這些碰撞體也合并成了一個(gè),進(jìn)一步減少了性能開銷。
以上只是我們在做的優(yōu)化工作中的冰山一角,一個(gè)游戲的優(yōu)化,會牽涉到很多很多方面的工作,我們正在努力解決這些問題,已讓大家能體驗(yàn)到一個(gè)比較完善,優(yōu)化比較好的正式版。

4、《沙石鎮(zhèn)時(shí)光》正式版的優(yōu)化目標(biāo)
在本文的最后,我們想要介紹一下《沙石鎮(zhèn)時(shí)光》正式版的優(yōu)化目標(biāo)。我們希望能夠通過進(jìn)一步的游戲優(yōu)化,讓中高配置的工坊主們能夠以穩(wěn)定的50-60幀運(yùn)行游戲;而對于較低配置的電腦,我們也力爭讓游戲穩(wěn)定在45fps左右且極少卡頓的情況下運(yùn)行。

在《沙石鎮(zhèn)時(shí)光》發(fā)售的一年當(dāng)中,我們推出了”洛根再襲“、”小康生活“、”老熟人兒“以及最近的”利刃出鞘“等多次更新,講述了規(guī)劃中第二章節(jié)的故事,在這期間我們也從未停止過游戲的優(yōu)化工作,力圖為大家?guī)砀玫挠螒蝮w驗(yàn)。但由于設(shè)計(jì)和規(guī)劃方面的不成熟,可能依然會有不少工坊主在游玩過程中,感受到了程度不同的優(yōu)化問題。而這些問題,就是我們計(jì)劃在正式版上線時(shí)(包括之后)一步步解決的。這其中并不存在所謂的”屎山代碼“,而是游戲設(shè)計(jì)的權(quán)衡以及技術(shù)的迭代。
《沙石鎮(zhèn)時(shí)光》將于9月26日在Steam,WeGame,EpicGameStore,Bilibili,Nintendo Switch,Sony PlayStation5 和 Xbox one/Series S/X上,同步發(fā)售《沙石鎮(zhèn)時(shí)光》正式版。在正式版中,單人模式主線故事會完結(jié),包括可攻略NPC的劇情,屆時(shí)沙石鎮(zhèn)的故事將迎來大結(jié)局。購買過《沙石鎮(zhèn)時(shí)光》搶先體驗(yàn)版的玩家可以于當(dāng)天通過免費(fèi)更新的方式獲取到所有內(nèi)容。
關(guān)于Sony PlayStation 4平臺,目前我們遇到了一些引擎方面的技術(shù)問題,PS4版本可能會比其他平臺稍晚一段時(shí)間推出,我們會在后續(xù)的公告中告知PS4平臺的上線時(shí)間等消息。
很多玩家所關(guān)注的多人在線合作模式,我們計(jì)劃在正式版上線前就開啟不刪檔測試,但暫時(shí)只有PC版用戶可以免費(fèi)更新,主機(jī)平臺的多人在線合作模式將會視移植情況,在正式版發(fā)布后的3個(gè)月左右再推出。如果您想了解更多有關(guān)《沙石鎮(zhèn)時(shí)光》的信息,您可以關(guān)注我們的官方社交媒體,第一時(shí)間獲取最新消息。