Unity-遮擋剔除
“遮擋剔除”過程可防止 Unity 為那些被其他游戲?qū)ο笸耆珦踝。ㄕ趽酰┑挠螒驅(qū)ο髨?zhí)行渲染計算。
攝像機在每一幀中執(zhí)行剔除操作,這些操作會檢查場景中的渲染器,并排除(剔除)那些不需要繪制的渲染器。默認情況下,攝像機執(zhí)行視錐體剔除,這一過程將排除所有不在攝像機視錐體范圍內(nèi)的渲染器。但是,視錐體剔除不會檢查渲染器是否被其他游戲?qū)ο笳趽?,因?Unity 仍會浪費 CPU 和 GPU 時間進行在最終幀中不可見的渲染器的渲染操作。遮擋剔除將阻止 Unity 執(zhí)行這些徒勞的操作。

何時使用遮擋剔除

要確定遮擋剔除是否有可能改善項目的運行時性能,請考慮以下事項:
防止無意義的渲染操作可以節(jié)省 CPU 和 GPU 時間。Unity 的內(nèi)置遮擋剔除在 CPU 上執(zhí)行運行時計算,這可能會抵消其節(jié)省的 CPU 時間。因此,當項目因過度繪制而具有 GPU 密集型特征時,遮擋剔除最有可能提高性能。
Unity 在運行時將遮擋剔除數(shù)據(jù)加載到內(nèi)存中。必須確保有足夠的內(nèi)存來加載此數(shù)據(jù)。
當場景中一些界限明確的小區(qū)域被實體游戲?qū)ο蟊舜烁糸_時,遮擋剔除的效果最好。一個常見的例子是通過走廊連接的房間。
可以使用遮擋剔除來遮擋動態(tài)游戲?qū)ο?,但動態(tài)游戲?qū)ο蟛荒苷趽跗渌螒驅(qū)ο?。如果項目會在運行時生成場景幾何體,則 Unity 的內(nèi)置遮擋剔除不適用于該項目。
遮擋剔除的工作原理
遮擋剔除會在 Unity Editor 中生成有關場景的數(shù)據(jù),然后在運行時使用該數(shù)據(jù)來確定攝像機可以看到的內(nèi)容。這種生成數(shù)據(jù)的過程稱為烘焙。
在對遮擋剔除數(shù)據(jù)進行烘焙時,Unity 將場景劃分為多個單元,并生成描述單元內(nèi)幾何體以及相鄰單元之間可見性的數(shù)據(jù)。然后,Unity 盡可能合并單元,以減小生成的數(shù)據(jù)的大小。要配置烘焙過程,可以在?Occlusion Culling 窗口中更改參數(shù),并在場景中使用遮擋區(qū)域。
在運行時,Unity 會將這些烘焙的數(shù)據(jù)加載到內(nèi)存中,并且對于每個啟用了 Occlusion Culling 屬性的攝像機,將會對數(shù)據(jù)執(zhí)行查詢以確定該攝像機可以看到的內(nèi)容。請注意,啟用遮擋剔除后,攝像機將執(zhí)行視錐體剔除和遮擋剔除。
其他資源
Unity 使用 Umbra 庫來執(zhí)行遮擋剔除。有關詳細介紹 Umbra 的文章的鏈接,請參閱“其他資源”頁面。