如何设计渲染等级?
Q1:現思考如何設計項目中的渲染等級,求有經驗的大佬指個方向,例如ShaderLOD,還有其他什么思路嗎?謝謝!
整理了一下我們游戲中效果分級的內容,供參考:
?
渲染
Q2:我用2017.2.0渲染一張地圖,為什么在小米4上Camera.Render會有很高的耗時?一個空場景,為什么Camera.Render耗時這么高?
UWA:我們做了一個簡單測試來研究一下這個問題,即在場景中只渲染一個Cube。
?
機型:
(1) 華為6Plus
(2) 小米4
Profiler截圖如下,藍色框:華為6Plus 紅色框:小米4
?
由上圖可知,小米4的Camera.Render耗時不穩定,有時候會出現10+ms的峰值。
通過查看Unity Profiler以及和其他設備進行對比,發現了以下兩點是造成小米4上耗時不穩的原因:
1、Culling不穩
下圖為小米4和華為6Plus設備上,Culling操作的耗時比較。藍框為華為6Plus設備,紅框為小米4設備。通過Timeline可以看到是場景SceneNode的計算導致。
?
2、Drawing不穩
渲染耗時也同樣不穩定,如下圖所示:通過Timeline發現,小米4設備上,主線程的渲染進程會經常等待子線程完成后再進行后續操作,而同樣的App,在華為6Plus上則不會如此表現,如下圖所示。
?
小米4:
?
華為6Plus:
?
因此,對于上述測試做個總結:
(1) Culling中的SceneNode計算操作在小米4設備上經常伴隨更為耗時的CPU開銷;
(2) 小米4上更容易表現出主線程渲染等待子線程的情況。
以上兩點是題主問題的主要原因,但至于更深層次的解釋,這個恐怕要聯系手機研發廠商甚至底層芯片硬件廠商了。但需要說明的是,這僅是一個簡單測試例子的表現情況,復雜場景并不一定同樣適合。但測試和分析方法都是不變的,題主后續如有需求,可自行測試尋找答案即可。
渲染
Q3:我們用的Unity 5.5場景帶有2級LOD,我們使用Lightmap渲染場景,結果次級的LOD模型渲染出來的陰影面是純黑的,這個該怎么辦呢?煩請大神指點!
Untiy官方在5.5版本里其實是不支持LOD的Lightmap的,即便是到了2017.4版本里,官方文檔也是讓你去使用Light Probes
當然它也說到:
“When you use the Progressive Lightmapper, there is no need to place Light Probes around the LOD Group to generate baked indirect lighting. However, to make Realtime GI affect the Renderers in the LOD Group, you must include the Light Probes.”
我們也是在用Unity 5.5版本,沒有試過Progressive Lightmapper,不知道效果如何。所以第一個解決方案是升級到Unity 5.6或者Unity 2017嘗試下Progressive Lightmapper。
如果想在Unity 5.5的下面做,我們是使用手動拷貝烘焙后的scale和offset的方式來實現,就是在運行時將原始模型的光照題圖信息完整地拷貝給LOD低層級的模型。但是這有一個非常強的限制:要保證兩個模型的UV2是完全可以對應上的,否則UV2可能會出現一些錯亂。使用Simpylgon這樣的中間件可以做到盡量保持UV2不變。
這樣做有兩個問題:
?
- 如果是減少了很多面的模型,比如刪除掉了一個組件,結果組件露出來的面因為之前是被遮擋的,會是黑色的。不過大部分情況下減面很多的LOD模型也會距離很遠,二手手游賬號購買平臺這種通常可以接受;
- 運行時設置光照信息的材質不能進行靜態合批,否則在設備上會有問題。
另外還有一個就是因為是運行時修改的,所以在編輯器模式下如果不讓設置組件可以運行的話,會有預覽效果不對的問題,運行狀態下可以保證正確。
原始LOD0烘焙效果:
?
LOD1為了避免黑所以不參與烘焙的效果:
?
運行時修改了光照貼圖參數的效果:
?
設置光照貼圖參數的Component代碼:
?
然后,給美術提供一些可以做一鍵設置和清理的功能,邏輯可以自己寫。
?
渲染
Q4:什么情況下Transparent的材質在Render.OpaqueGeometry過程中渲染?
?
UWA:Render.OpaqueGeometry和Render. TransparentGeometry的執行,是依據RenderQueue<2450來區分的,RenderQueue的大小可以完全控制物體渲染的順序,比如把半透物件渲染順序調整到不透明物件之前,讓Grass在Terrain前面畫,在一些使用多層紋理的項目中,是一個比較不錯的選擇。通過RenderQueue來控制物體的渲染順序,改變RQ來達到想要做的特殊事情。
2D
Q5:之前是看UWA相關的視頻,把這個腳本掛在預設上的,然后通過這次的測試結果看到這個函數在解壓的時候占了很高的堆內存,這個腳本是在解壓資源的時候也會被調用么?
?
另外,我們昨天用UWA GOT在跟蹤解壓時堆內存的問題時,發現并沒有出現網站上報告的PolygonImage這個問題啊?是因為什么呢?
UWA:PolygonImage的實現是作為一個MeshEffect來修改對應的Image的幾何(把四邊形變為多邊形),過程中會出現一定量的堆內存分配(多邊形越復雜,分配的堆內存越多)。
而MeshEffect的觸發,只發生在對應的Image被重建的時候:被激活、修改顏色(透明度)、修改長寬等等…
所以該效果不建議使用在頻繁變化的Image上,會造成大量的堆內存分配。
而題主在UWA GOT中沒有觀察到這一項,很可能是因為沒有打開(激活)某些使用了PolygonImage的界面。
關于UWA:
由侑虎科技開發的游戲/VR應用性能優化平臺,目前提供 1)性能診斷與優化 2)資源檢測與分析 3)UWA GOT 三大工具,幫助開發者在短時間內大幅度提升性能表現;同時其搭建的知識分享的博客和答疑解惑的互動平臺使廣大開發者收益。
總結
- 上一篇: 从零点五开始,做半个不能玩的小游戏(二)
- 下一篇: 基于行为树的新手引导设计