【厚積薄發】Texture Streaming Mipmap使用疑問

2021-02-21 侑虎科技

這是第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優化物理開銷

【厚積薄發】如何做好幀同步下的移動系統

相關焦點

  • 【厚積薄發】如何能避免動態字體Font Texture過大
    do not fit onto a single texture (max size 4096).A:我們使用FairyGUI,默認使用高清字體模式——編輯器下用設計解析度設計字體大小,手機上根據實際解析度進行了等比放大。例如設計解析度用1280*720,手機解析度1920*1080,字號就擴大了1.5倍。
  • 【厚積薄發】CommandBuffer的GPU開銷
    UWA 問答社區:answer.uwa4d.comUWA QQ群2:793972859(原群已滿員)本期目錄:Q:在進行後處理方案預研的時候發現,PostProcessV2中使用的CommandBuffer方案,似乎比V1使用Graphics接口的方案需要更多的GPU開銷。
  • 是時候放棄Spark Streaming,轉向Structured Streaming了
    總結一下主要有下面幾點: 使用 Processing Time 而不是 Event Time 首先解釋一下,Processing Time 是數據到達 Spark 被處理的時間,而 Event Time 是數據自帶的屬性,一般表示數據產生於數據源的時間。
  • 【厚積薄發】關於Camera.activeTexture和Camera.targetTexture的疑問
    第二個問題:推薦使用RenderDoc查看渲染狀態,分為兩種情況,在安卓平臺上開啟了Always Blit和沒開啟會不一樣。EasyMovieTexture在Android播放視頻失敗,報錯信息如下:AndroidJavaException: java.lang.IllegalStateException: Unable to update texture contents (see logcat for details)
  • 基於物理的渲染-Specular IBL-PrefilteredEnvironmentMap
    如果你依然不清楚這些,那也沒關係,你只要知道,由於我們使用了這招,所以我們不用像Diffuse Irradiance裡面那樣採用黎曼和的方式對整個半球進行積分,而是通過少數幾個隨機的向量來實現對鏡面反射光線的描述。
  • Structured Streaming與Flink比較
    維表實現及異步ioStructured Streaming不直接支持與維表的join操作,但是可以使用map、flatmap及udf等來實現該功能,所有的這些都是同步算子,不支持異步IO操作。但是Structured Streaming直接與靜態數據集的join,可以也可以幫助實現維表的join功能,當然維表要不可變。
  • 【厚積薄發】技術分享連載(七十四)| 網格頂點屬性丟失| 優化數據表的加載| 圖集格式設置...
    然而這帶來了一個問題,就是在部分使用網格的特效中,美術會對模型上一些頂點做特殊處理,以達到一種網格遮罩的效果,而這個設置需要用到網格的頂點色。然而在開啟Optimize Mesh Data這一選項後,打出來包中Mesh上的頂點色會丟失。請問有什麼比較好的解決方法,既能使用此方法優化網格,又能保留網格的頂點色效果?
  • 【厚積薄發】AssetBundle中加載SpriteAtlas圖集之後卸載異常
    項目是簡單的測試項目並沒有在別處使用加載資源。測試Unity版本2019.4.9。所以SpriteAtlas是無法使用這個接口卸載的,而Texture是可以的。卸載SpriteAtlas可以將圖集單獨打AssetBundle,使用AssetBundle.Unload(true)來卸載,或者清空引用後由下一次Resources.UnloadUnusedAssets來卸載。
  • texture什麼意思
    texture什麼意思單詞解析text,文字,我們背過的和text有關的單詞還有:pretext, context. texture 紋理學單詞,只記住意思可不行,會用才行,小夥伴們可以在評論區造句,我們一起學習哦!
  • 使用std:unordered_map的踩坑記
    C++程式設計師基本上每段程序都要和stl打交道,其中std::unordered_map是最常用的數據結構之一。接下來就介紹一個我使用unordered_map的時候遇到的一個坑。很多程式設計師都會說,unordered_map使用很簡單呀,有什麼可講的。那我問一個簡單的問題:如何判斷一個元素在不在unordered_map裡面?如果是寫慣了PHP的同學,上來就會用[]直接訪問,訪問不到就判斷是不是NULL就好了。
  • map和parseInt結合使用
    「 話不多說進入正題,在快手中看到過一個考題是關於map和parseInt結合使用輸出結果值。
  • 【厚積薄發】Packages目錄下Shader打包疑問
    A1:我這邊是只使用SBP而不用Addressable,這樣通過使用AssetBundleBuild是可以將Packages中的資源也打包成AssetBundle的。不過一般項目中使用的Shader往往還是會自己編寫,直接使用官方提供總會遇到這種那種問題。因此我也會考慮儘量不用官方默認Shader,這時對於URP而言自然更加需要將Shader拷出來進行改造了。
  • 【厚積薄發】LWRP+UGUI使用方式
    一般保險起見,還是在OpenGL ES3.0以上使用Tex2DLod比較好,避免不必要的麻煩。可以看看其他社區朋友,是否有類似的經驗。發出這個疑問主要是因為Resources.UnloadAsset去卸載這個GameObject的時候會提示報錯:GameObject、Component、AssetBundle不能被Resources.UnloadAsset卸載。
  • MapStruct的使用,java實體類的轉換
    準備工作:Maven配置,需要我們在pom文件中添加以下引用<properties><org.mapstruct.version>1.2.0.Final</org.mapstruct.version></properties><dependency><groupId>org.mapstruct