天天看點

技術分享連載(五十二)

Q1:我們的遊戲中有一些靜止的建築,會和整個場景一起烘焙(包括了每個建築在地表的陰影)。現在希望這些建築是逐漸開放的,比如玩家1級的時候隻有建築A開放,2級的時候建築B開放,現在的問題是當建築未開放時(SetActive(false))地表的相關陰影還在。這種問題一般是怎麼處理的?

這種問題是因為研發團隊将整個場景烘焙成一張Lightmap所緻。如果地圖中的建築是固定的,且遊戲中并沒有動态改變方向光的需求(比如Time Of Day模拟),那麼可以嘗試以下方法來實作需求: (1)如果建築物是根據等級而批量出現的,那麼可以嘗試根據等級不同而烘焙相應建築群的Lightmap,然後在遊戲中根據需求動态替換Lightmap; (2)如果是逐個出現且建築之間相距較為緊密的話,那麼建議嘗試通過Dynamic Projector(Asset Store插件)或Shadow Map(Unity自帶陰影)來進行處理,因為Lightmap方法已無法支援這種需求。同時,可配合Fast Shadow Receiver(Asset Store 插件)來盡可能降低上述實時陰影帶來的性能開銷。

Q2:在一個場景中有很多小物件,例如花花草草之類的靜止物體,造成Draw Call數量較高。在不想讓美術重新出資源的前提下,我是想把相同模型的東西合并,然後把小貼圖打成一個大的貼圖,重新算UV。還有比這種方法更好的優化手段嗎?

對于場景中的靜态物體,可直接嘗試通過Unity的Static Batching方式來進行網格的合批,可以有效地降低由于Draw Call(5.x下的Batches)帶來的性能開銷。當然,Static Batching的前提是網格模型的材質相同,是以不僅需要保證Shader一緻,還需要将各自的小紋理合成大紋理,進而保證Static Batching的順利進行。 同時,如果渲染的網格面數較高,可以通過SimpleLOD、SimplyGon等常用網格簡化工具對其進行快速減面。

Q3:對于Animators.DirtySceneObjects這個參數,它是和哪些因素有關,以及如何優化?

技術分享連載(五十二)
該參數是更新場景中受Mecanim動畫系統影響的每個GameObject的Transform,是以當這類的GameObject數量越多時,其CPU占用也會越高。對于它的優化方式,主要有如下兩種: 如果是蒙皮網格物體,則可以開啟“Optimize GameObject”選項來對其進行優化; 如果是非蒙皮網格(比如具有動畫的UI界面、2D Sprite等),則隻能建議研發團隊盡可能減少同一時刻運動的GameObject數量(一般都不會太多),如果是被緩存的螢幕外的物體,則切記要在移出時關閉其Animator元件。

實體

Q4:請問Physics.Processing的占用過大一般是因為什麼原因導緻的?

技術分享連載(五十二)
影響實體系統耗時的因素主要為Contacts數量(碰撞對數量)、Rigidbody API的使用情況和每幀的調用次數。 第一種情況是最為常見的引發實體子產品耗時較大的原因,是以,我們在UWA性能報告中對其進行了詳細的分析,如果你的報告中Contacts數量較高,切記要驗證其合理性。 第二情況造成較大CPU開銷的情況不多,不過如果你的項目是多角色遊戲(比如MMO、MOBA、ARPG割草遊戲等),那麼你需要注意了。在我們優化過的一些項目中,通過Rigidbody API來移動GameObject位置(設定velocity、改變center等)确實會存在較高的性能開銷。如果你的項目也有類似的做法,那麼要時刻關注實體子產品的開銷了。 第三種情況同樣也是目前引發實體子產品耗時較高的原因。因為Unity引擎預設情況下,實體的更新頻率是0.02s,即每20ms更新一次,是以,當你的項目比較卡時(開發過程中的項目在中低端裝置上恐怕沒幾個是不卡的),實體子產品會讓你的項目更卡。舉個例子,如果上一幀CPU耗時為100ms的話,那麼實體子產品會執行5次,進而進一步加大實體系統的耗時。這種情況下,實體子產品的耗時是很有欺騙性的,你花了好長時間去研究實體的耗時,最後發現原來這個“鍋”不是它的...是以,如果你的項目也遇到了這種情況,切記不要再上當了。

性能優化

Q5:我遊戲場景裡有些草,勾選了Batching Static 如下圖:

技術分享連載(五十二)

檢視FrameDebug可以看到已經生成了Static Batch:

技術分享連載(五十二)

按道理來說這是的DrawCall應該是2,但是檢視Profiler的時候卻顯示Draw Call為7,這是怎麼回事呢?

技術分享連載(五十二)
從Unity 5.0開始,Static Batching的合批機制就已經出現了變化,不再進行索引數組的合批,是以并不會使得Draw Call降低,而是會降低Batches和SetPassCall,是以從圖中來看,Static Batching 開啟後的統計資料是沒有問題的。也是以,UWA在統計時,使用的就是Batches的數值。具體的原因可見Unity官方在論壇中的回複: https://forum.unity3d.com/threads/regression-feature-not-bug-static-dynamic-batching-combining-v-buffers-but-not-draw-calls.360143/

原文出處:侑虎科技

本文作者:admin

轉載請與作者聯系,同時請務必标明文章原始出處和原文連結及本聲明。

繼續閱讀