這是第165篇UWA技術知識分享的推送。今天我們繼續為大家精選了若干和開發、優化相關的問題,建議閱讀時間10分鐘,認真讀完必有收穫。
UWA 問答社區:answer.uwa4d.com
UWA QQ群2:793972859(原群已滿員)
本期目錄:
Q:項目升級到了2018.4,預計今年上線。
1、看到Unity新增了StreamingMipmap流,想問下loadedMipmapLevel是否是當前貼圖正在使用的Mipmap level,官方解釋是Which mipmap level is currently loaded by the streaming system.試了一下,對著一個物體走近走遠,這個值都是固定,如果不是,請問怎樣得到當前貼圖的Mipmap level呢?
2、2018.4請問是否可以使用Job System,官方說這是試驗,可能引起崩潰,不知道有沒有大佬線上項目開啟了這個或者StreamingMipmap?
A:這個值在真機上是準確的,只是在引擎端會出現一些加載Bug。我們也在測試過程中發現了這個問題,當時重新建立項目、重新導入後才在真機上顯示正確的。
我們在UWA DAY 2019上詳細說明了我們在測試Texture Streaming所遇到的一些問題和大量的Streaming邏輯解釋,後續題主有興趣可以觀看:Unity引擎加載模塊和內存管理的量化分析及優化方法(https://edu.uwa4d.com/course-intro/1/91),可以節省你大量不必要的測試和摸索時間,以及消除你崩潰到想砸鍵盤、扔電腦的心情。(相信我,當時我們研究這個功能時,心情就是這樣的!)
關於你第二問題,這個很難回答,目前還沒有在已經上線的項目中看到使用。這裡有一篇文章,建議題主和正在使用TextureStremingJob的團隊查看:TextureStreamingJob 崩潰分析一則
該回答由UWA提供,歡迎大家轉至社區交流:
https://answer.uwa4d.com/question/5d0b7d73f465ea0d54c5ef9b
Q:Unity裡可以通過_WorldSpaceLightPos0來得到平行光方向,這其實是Unity覺得這個uniform很常用,自動幫我們傳入了。
我在Unreal的材質節點裡找了很久,沒有找到類似Light Vector表示平行光方向的節點。還是說Unreal中只能通過Blueprint自己從外部傳入了。我知道Blueprint + Material Parameter Collections可以滿足我的要求,就像 SetGlobalVector 一樣。
所以想問問能不能從材質節點直接獲取到平行光方向,省得從外部自己傳入了。
A:方法不是沒有,如圖所示,建立一個custom節點,然後在參數裡輸入如圖代碼即可,做成Material Function就可以到處復用。
但是個人並不推薦,很顯然這是一個很hack的方法。這個方法依賴底層Shader實現,不保證每個版本都能用(4.22測試)。
究其原因,是因為Unreal假定材質編輯器提供的主要節點,都是可以通用於所有光照流程的(forward shading/defer shading),而獲取Light Direction這種設定顯然不符合支持超多光源的Deferred Shading管線,所以官方本身是不會提供節點的。
因此順帶一提,這個做法只有在Forward Shading可以使用。不像Unity,自己編寫的Shader,Epic官方不怎麼管兼容性,這個版本可以用,下個版本引擎Shader改了,能不能用就不保證了(不過這段代碼應該可以適配相當數量的版本)。
所以題主說的方案,才是官方鼓勵的。
代碼:
#ifdef EyeAdaptationStruct
#if MATERIALBLENDING_ANY_TRANSLUCENT
return TranslucentBasePass.Shared.Forward.DirectionalLightDirection;
#else
return OpaqueBasePass.Shared.Forward.DirectionalLightDirection;
#endif
#else
return 0;
#endif
感謝招文勇@UWA問答社區提供了回答,歡迎大家轉至社區交流:
https://answer.uwa4d.com/question/5d0276a318013226f621cc9f
Q:帶子網格的SkinnedMeshRenderer在使用BakeMesh製作殘影的時候,發現只會Bake出子網格中的第一個網格。這個角色身上是有四個子網格的,大家有遇到過類似問題的嗎?(Unity版本:2017.4.18f1)
A:原來的實現方式是這種,直接用Graphics畫出來一個Mesh,這種在結果看來是不支持子網格。
Graphics.DrawMesh(ghostMesh.mesh, ghostMesh.position, ghostMesh.rotation, ghostMesh.material, 0, Camera.main);
後修改成了這種,實例化一個GameObject,然後掛上對應子網格個數的材質,就可以正常顯示了。
public void InstanceGhost() {
if (mesh.subMeshCount > 0) {
ghostGo = new GameObject("ghostGo");
SkinnedMeshRenderer smr = ghostGo.AddComponent<SkinnedMeshRenderer>();
smr.sharedMesh = mesh;
Material[] mats = new Material[smr.sharedMesh.subMeshCount];
for (int i = 0; i < mesh.subMeshCount; i++) {
mats[i] = material;
}
smr.materials = mats;
ghostGo.transform.parent = GetGhostRoot();
ghostGo.transform.position = position;
ghostGo.transform.rotation = rotation;
}
}
感謝題主範世青@UWA問答社區提供了回答,歡迎大家轉至社區交流:
https://answer.uwa4d.com/question/5cff0b57f8404a26fbe43599
Q:請問大佬們,您們現在的後處理優化,都是從哪幾點入手的,能否分享一下?
A1:Unity PostProcess在代碼上的優化空間有限,可以根據項目的使用在代碼上去掉一些細節效果。我們之前的項目在代碼上的優化不多,主要還是解決Bug。
在使用上可以對後期效果進行規劃,在後期效果中最重要的是Bloom和ColoeGrading,其中Bloom的性能開銷較大,因此可以在高配畫質下開啟,中配畫質下只使用ColorGraiding,讓畫面有一致性。在低配下可以關閉後期處理。然後其他的也有很多對畫面有提升的效果,比如景深、SSAO、抗鋸齒、Chromatic Aberration、Vignette等可以根據情況來設計開啟和關閉,默認情況下關閉。
感謝文雅@UWA問答社區提供了回答
A2:如果你用的是PostProcess Stack V2,可以看下這裡:
https://www.bilibili.com/video/av53641372/?share_medium=web
中間有一段說了各種效果對性能影響大的選項。
感謝deviljz@UWA問答社區提供了回答,歡迎大家轉至社區交流:
https://answer.uwa4d.com/question/5ce5467ad1d3d045c846d769
Q:目前有個需求,就是需要把烘焙信息與場景分離開。也就是說我的預製體需要再任意場景都顯示陰影。
在網上找了資料發現,只需把預製體的光照數據lightmapIndex和lightmapScaleOffset記錄下來,並且讓光照貼圖加載設置到lightmapsetting就行了。
但是我在測試的過程發現:這邊設置成功了;
這邊也設置了,但是就是不生效。整個預製體還是黑的。
如果我把這個設置為任意一個默認的Data。然後還是按照之前的操作就生效了,這是為什麼?
A:你需要在打開場景或者實例化Prefab後,再手動賦值一遍才會生效。
感謝鄭驍@UWA問答社區提供了回答,歡迎大家轉至社區交流:
https://answer.uwa4d.com/question/5d0c5448f465ea0d54c5ef9c
今天的分享就到這裡。當然,生有涯而知無涯。在漫漫的開發周期中,您看到的這些問題也許都只是冰山一角,我們早已在UWA問答網站上準備了更多的技術話題等你一起來探索和分享。歡迎熱愛進步的你加入,也許你的方法恰能解別人的燃眉之急;而他山之「石」,也能攻你之「玉」。
官網:www.uwa4d.com
官方技術博客:blog.uwa4d.com
官方問答社區:answer.uwa4d.com
UWA學堂:edu.uwa4d.com
官方技術QQ群:793972859(原群已滿員)
封面圖來源於網絡
(長按識別二維碼進入UWA問答)
質量保障體系馬力全開!
近期精彩回顧
【厚積薄發】Unity2018升級DrawMeshInstanced不生效
【厚積薄發】TextureStreamingJob 崩潰分析一則
【厚積薄發】如何利用UWA優化物理開銷
【厚積薄發】如何做好幀同步下的移動系統