真的在優(yōu)化了,沒有摸魚……

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

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

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

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

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



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

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

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

在《沙石鎮(zhèn)時光》發(fā)售的一年當中,我們推出了”洛根再襲“、”小康生活“、”老熟人兒“以及最近的”利刃出鞘“等多次更新,講述了規(guī)劃中第二章節(jié)的故事,在這期間我們也從未停止過游戲的優(yōu)化工作,力圖為大家?guī)砀玫挠螒蝮w驗。但由于設(shè)計和規(guī)劃方面的不成熟,可能依然會有不少工坊主在游玩過程中,感受到了程度不同的優(yōu)化問題。而這些問題,就是我們計劃在正式版上線時(包括之后)一步步解決的。這其中并不存在所謂的”屎山代碼“,而是游戲設(shè)計的權(quán)衡以及技術(shù)的迭代。

《沙石鎮(zhèn)時光》將于9月26日在Steam,WeGame,EpicGameStore,Bilibili,Nintendo Switch,Sony PlayStation5 和 Xbox one/Series S/X上,同步發(fā)售《沙石鎮(zhèn)時光》正式版。在正式版中,單人模式主線故事會完結(jié),包括可攻略NPC的劇情,屆時沙石鎮(zhèn)的故事將迎來大結(jié)局。購買過《沙石鎮(zhèn)時光》搶先體驗版的玩家可以于當天通過免費更新的方式獲取到所有內(nèi)容。
關(guān)于Sony PlayStation 4平臺,目前我們遇到了一些引擎方面的技術(shù)問題,PS4版本可能會比其他平臺稍晚一段時間推出,我們會在后續(xù)的公告中告知PS4平臺的上線時間等消息。
很多玩家所關(guān)注的多人在線合作模式,我們計劃在正式版上線前就開啟不刪檔測試,但暫時只有PC版用戶可以免費更新,主機平臺的多人在線合作模式將會視移植情況,在正式版發(fā)布后的3個月左右再推出。如果您想了解更多有關(guān)《沙石鎮(zhèn)時光》的信息,您可以關(guān)注我們的官方社交媒體,第一時間獲取最新消息。