Q1:請問“Dynamic Batching”這個選項開關與否對于性能影響大麼?
一般情況下,如果可以我們還是建議開啟該選項。下圖是我們做的一個實驗,即在紅米2裝置上渲染将近100個動态Cube。Profiler面闆左側為開啟Dynamic Batching的CPU耗時(不透明渲染耗時0.5ms左右),右側為關閉Dynamic Batching的CPU耗時(不透明渲染耗時1.5ms左右)。可以看出,兩者耗時相差将近1ms。當然,不同項目、不同模型,其耗時差距是有一定不同的。是以,建議研發團隊可以根據自身情況關閉和開啟該選項來進行測試。
測試用例: 關閉Dynamic Batching的CPU耗時: 開啟Dynamic Batching的CPU耗時:
Q2:求教一個螢幕後處理的問題。我們期望角色不受螢幕後處理影響,是以目前采用雙相機的方案,根據Layer劃分,但是這種情況下角色的影子也就沒有辦法投影到地表上,請問這種需求有什麼好的實作方式?
可以嘗試根據地表模型的局部細節來動态生成接受陰影的網格(比如Fast Shadow Receiver插件),這樣既可以保證地表模型進行螢幕後處理操作,同時也可以生成相關角色的動态陰影。
Q3:請教Lightmap相關的優化問題。我現在的場景中有N個GameObject共用一個Prefab,烘培Lightmap時,會生成出N個Lightmap貼圖。有沒有辦法把這些生成的Lightmap合成一張?
如果場景中某些物件在Lightmap紋理中占據的空間較大,但實際上并不需要較高的精度,那麼可以選中該物體,并在Lighting面闆的Object子面闆中将其Scale in lightmap數值調低,進而可以降低其在Lightmap紋理中的空間,甚至減少Lightmap紋理的數量。
Q4:我的項目在一幀中進行執行個體化操作時,會産生大量的GC Alloc,請問這是為什麼?我又該如何避免呢?
Unity引擎的Instantiate操作本身是會觸發少量的堆記憶體配置設定,從圖中數值可以看出,該堆記憶體配置設定過大的主要原因可能有以下兩點: Instantiate在該幀中調用次數過多,從圖中可以看到,在一幀中Instantiate執行個體化操作被調用128次; Instantiate執行個體化後,其GameObject身上的代碼元件在執行Awake函數和構造函數(.ctor)時也很有可能産生堆記憶體,從目前的1.3MB堆記憶體來看,很有可能是這種原因。 對此,建議研發團隊在Unity Profiler中直接檢視Instantiate的自堆棧資訊,即可定位其具體的堆記憶體出處。
Q5:請問UGUI的重繪是針對于擁有Canvas元件的Canvas物件,還是針對于擁有CanvasRenderer元件的Panel物件?
UGUI中,Canvas元件可以認為是容器,Image,Text等元件(都需要CanvasRenderer元件)可以認為是元素。在Unity5.2版本之前,在網格重建時,會以Canvas為機關,即一個Canvas中所有的元素最終都是合并到一個Mesh中的,而其中可以被合并渲染的元素則被合在同一個SubMesh中。在Unity5.2版本之後由于引入了多線程的網格合并方式,據我們所知,目前并沒有官方的原了解釋。
原文出處:侑虎科技
本文作者:admin
轉載請與作者聯系,同時請務必标明文章原始出處和原文連結及本聲明。