InfinityBakeTool是一款專為低端平臺設(shè)計(jì)的Infinity 粒子系統(tǒng)輔助工具。通過空間換時(shí)間的策略,烘培一段時(shí)間的特效效果,將繁重的模擬運(yùn)算轉(zhuǎn)移至離線階段。在 Runtime 時(shí)跳過粒子系統(tǒng)的模擬時(shí)間,顯著提升粒子系統(tǒng)的性能。
InfinityBakeTool 特性
粒子系統(tǒng)是游戲開發(fā)中不可或缺的核心技術(shù),尤其在營造復(fù)雜絢麗的場景時(shí),往往需要數(shù)百甚至數(shù)千個(gè)粒子系統(tǒng)協(xié)同工作。這些系統(tǒng)對性能要求極高,而移動端開發(fā)者受硬件限制,常采用烘焙(Baking)策略來優(yōu)化運(yùn)行時(shí)表現(xiàn)。
無論是將特效直接烘培成 Texture,還是通過 VAT(Vertex Animation Texture)方案進(jìn)行烘培,都需要烘培得到一張或多張 Texture。這雖然能夠解決 CPU 負(fù)擔(dān)過重的問題,但烘焙后的 Texture 往往很大,尤其是前者。VAT 方案相比前者 Texture 確實(shí)會大大減小,但需要額外對 Shader 做定制化處理。而這兩種方案烘培得到不同的 Texture 就意味著不同粒子系統(tǒng)之間是無法進(jìn)行合批的。
相比傳統(tǒng)的烘培方式,InfinityBakeTool 采用了不同的策略:
1.僅烘焙 Instance 渲染數(shù)據(jù),以文件形式存儲。根據(jù)不同粒子系統(tǒng)的模塊參數(shù)決定烘培哪些渲染數(shù)據(jù),對于渲染 Quad,渲染 Mesh 一視同仁,用盡可能小的空間換取珍貴的運(yùn)行時(shí)間。
2.額外烘焙影響渲染的參數(shù),使烘焙后的粒子系統(tǒng)仍然支持跨粒子系統(tǒng)的合批渲染。不光是原 InfinityParticleSystem 之間也能夠進(jìn)行合批, BakedInfinityParticleSystem 之間也能夠進(jìn)行合批。
InfinityBakeTool 如何進(jìn)行工作
1.能夠?qū)Χ嗔W酉到y(tǒng)形成的特效組合進(jìn)行一鍵烘焙,形成 prefab
2.生成的 prefab 保留原特效的層級結(jié)構(gòu),原特效中的每一個(gè)粒子系統(tǒng)烘培生成一個(gè) bakedinfinity 類型的 asset
3.BakedInfinityParticleSystem 能夠在 Runtime 下運(yùn)行,提供了 Play(),Pause(),Stop(),Simulate()等常用 API
Infinity 性能對 Demo
隨著 Infinity 粒子系統(tǒng) 1.3.0 版本的發(fā)布,我們同步開放了 Demo 工程,方便開發(fā)者對比 Built-in 粒子系統(tǒng),Infinity 粒子系統(tǒng),和 BakedInfinity 粒子系統(tǒng)之間的性能差異。
我們構(gòu)造了六種不同類型的測試場景,代表粒子系統(tǒng)使用中常見的幾種類型:
1.TestType:粒子系統(tǒng)種類 100+
2.Test200/500/1000:單一粒子系統(tǒng)粒子數(shù)量少,粒子系統(tǒng)大量重復(fù)
3.TestMore:多個(gè)粒子系統(tǒng)粒子數(shù)量負(fù)載不均衡,少則十?dāng)?shù),多則上萬
4.TestMesh:渲染 Mesh 的粒子系統(tǒng)
5.TestSingle:單一粒子系統(tǒng)粒子數(shù)量大
6.TestPool:測試池化場景,特效批量生成,批量死亡
Demo 下載:
git clone https://cnb.cool/tuanjie/Infinity_Benchmark_Suite.git
InfinityBakeTool 帶來的性能收益
BakedInfinityParticleSystem 在 Runtime 下能夠跳過模擬過程,僅需要執(zhí)行 Transform 更新和渲染相關(guān)邏輯,能夠大大提升 CPU 耗時(shí)降低主線程開銷;
烘焙后的粒子系統(tǒng)仍然使用 GPU Instancing 渲染支持合批,相比 Built-in 粒子系統(tǒng)渲染線程開銷仍有很大優(yōu)勢;
在內(nèi)存開銷方面,雖然烘焙過程需要額外存儲多幀的渲染數(shù)據(jù),需要占用更多的內(nèi)存,但 Runtime 下省掉了運(yùn)行時(shí)模擬數(shù)據(jù)占用內(nèi)存的開銷,除此之外,由于多粒子系統(tǒng)共享參數(shù)和渲染數(shù)據(jù),所以部分場景在烘焙后內(nèi)存開銷反而變低;
InfinityBakeTool 在 Test200/500/1000 這種單一粒子系統(tǒng)粒子數(shù)量少,粒子系統(tǒng)大量重復(fù)的場景下優(yōu)勢十分顯著,下面以 Test1000 為例進(jìn)行展示,該場景中有 1000 個(gè)粒子系統(tǒng)持續(xù)播放,場景內(nèi)粒子總數(shù)達(dá) 1.5w。從 Profiler 中可以直觀地看到烘培后的 Infinity 粒子系統(tǒng)帶來的性能優(yōu)勢。
![]()
Test1000 場景效果圖
![]()
Built-in 粒子系統(tǒng)的 Test1000
![]()
BakedInfinity 粒子系統(tǒng)的 Test1000
我們在不同機(jī)型不同芯片上進(jìn)行了測試,下圖表中展示的是純主線程耗時(shí),和主線程+渲染線程耗時(shí),所有測試均取 1000 幀的平均值,在鎖 30fps 的狀態(tài)下進(jìn)行測試的,測試結(jié)果如下,可以看到,烘焙后的場景在 CPU 耗時(shí)方面基本能夠達(dá)到 50% 以上的提升。
![]()
![]()
Android / IOS 上的性能測試結(jié)果
這個(gè)場景在內(nèi)存占用方面也沒有增加額外開銷,反而小有優(yōu)勢。
![]()
![]()
Android / IOS 上的性能測試結(jié)果
在 DrawCall 方面,烘焙后的粒子系統(tǒng)仍然能夠合批渲染,這個(gè)場景在 DrawCall 方面也有極大提升,能夠從幾百數(shù)量級直接降低到個(gè)位數(shù)。
![]()
![]()
Android / IOS 上的性能測試結(jié)果
烘焙方案對于小游戲項(xiàng)目有明顯優(yōu)勢,Test500 場景在小游戲上的測試結(jié)果如下,可以看到烘焙方案能夠有效降低 CPU 占用率和功耗開銷,內(nèi)存開銷有勝有負(fù)。
![]()
![]()
微信小游戲上的性能測試結(jié)果
![]()
微信小游戲上的性能測試結(jié)果
但對于粒子數(shù)量很大的特效進(jìn)行烘焙,可能會占用過多的內(nèi)存,例如 TestMore 和 TestSingle 的場景,開發(fā)者使用時(shí)應(yīng)該酌情考量,InfinityBakeTool 界面在每次烘焙結(jié)束后會顯示當(dāng)前設(shè)置下渲染數(shù)據(jù)大小的估計(jì)值,可以作為參考供開發(fā)者調(diào)整參數(shù),使烘焙后的數(shù)據(jù)大小降低到可接受的狀態(tài)。
快速上手
您可以通過以下步驟對粒子系統(tǒng)進(jìn)行烘焙:
1.在 Tool 工具欄中打開 InfinityParticleSystem Bake Tool
2.配置相應(yīng)參數(shù):
![]()
基礎(chǔ)設(shè)置:
起始時(shí)間 指定從何時(shí)開始烘焙粒子系統(tǒng)
模擬總時(shí)間 從起始時(shí)間開始至烘焙結(jié)束的總時(shí)間
每秒幀數(shù) 每秒烘焙輸出的幀數(shù),總幀數(shù)將在下方顯示
Save Path 用于設(shè)置烘焙生成結(jié)果的輸出保存位置,默認(rèn)保存至項(xiàng)目的
Assets/目錄下。
GameObject 要進(jìn)行烘焙的目標(biāo)系統(tǒng)對象
Prefab 要進(jìn)行烘焙的目標(biāo)預(yù)制體
3.點(diǎn)擊烘焙按鈕,烘焙結(jié)果將保存在設(shè)置的路徑中:
![]()
4.烘焙能夠得到以“Name_Baked”命名的文件夾,包含一個(gè) prefab 和一個(gè) data 文件夾
prefab能夠拖入場景中直接使用
data文件夾內(nèi)包含若干.bakedinfinity asset文件,每一個(gè)asset文件代表原特效中可渲染的Infinity粒子系統(tǒng)
1.BakedInfinityParticleSystem 只支持 Runtime
2.烘焙過程中會移除所有 GameObject 為隱藏狀態(tài)或不進(jìn)行實(shí)際渲染的粒子系統(tǒng)
3.不支持Main Module - Auto Random Seed,烘培過程只能支持確定的 Random Seed
4.只支持在 Local 空間中進(jìn)行模擬的粒子系統(tǒng),不支持在 World 空間(或 Custom 空間)中進(jìn)行模擬的粒子系統(tǒng),涉及到的模塊包括:
Main Module - SimulationSpace
Velocity over Lifetime Module - Space
Limit Velocity over Lifetime Module - Space
Force Over Lifetime Module - Space
Known issues
1.有限支持Main Module - Gravity Modifer,若該值不為 0 并且該粒子系統(tǒng)及其父級粒子系統(tǒng)有旋轉(zhuǎn)時(shí),渲染效果不正常
2.有限支持Sub Emitter Module 模塊
對于 sub 粒子系統(tǒng)的 Transform,Bake 過程會將其歸一化,若原 Transform 中的 Rotation 不等于 0,BakedInfinityParticleSystem 可能會出現(xiàn)錯(cuò)誤旋轉(zhuǎn)
對于 Trigger 或 Collision 觸發(fā) Sub 生成粒子的效果支持受限
如果 father 粒子系統(tǒng)啟用 Looping,而 Sub 粒子系統(tǒng)不啟用,烘焙前 Sub 粒子系統(tǒng)使用 father 的設(shè)置,烘焙后由于丟失父子信息,使用自己的設(shè)置
3.有限支持涉及與場景中其他 GameObject 產(chǎn)生交互的模塊,包括:
External Force Module
Collision Module
Triggers Module
4.暫不支持Trails Module 的烘焙
5.暫不支持Lights Module 的烘焙,無法生成動態(tài)光源
Unity 官方微信
第一時(shí)間了解Unity引擎動向,學(xué)習(xí)進(jìn)階開發(fā)技能
每一個(gè)“點(diǎn)贊”、“在看”,都是我們前進(jìn)的動力
![]()
特別聲明:以上內(nèi)容(如有圖片或視頻亦包括在內(nèi))為自媒體平臺“網(wǎng)易號”用戶上傳并發(fā)布,本平臺僅提供信息存儲服務(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.