【厚積薄發】LWRP+UGUI使用方式

2021-02-16 侑虎科技

這是第173篇UWA技術知識分享的推送。今天我們繼續為大家精選了若干和開發、優化相關的問題,建議閱讀時間20分鐘,認真讀完必有收穫。

UWA 問答社區:answer.uwa4d.com

UWA QQ群2:793972859(原群已滿員)

本期目錄:

Q:由於LWRP不支持多個相機,那UI怎麼辦?如果UI不用camera,而是改用Overlay,UI特效穿插怎麼解決?


A1:UI可以用camera,只是UI不能用多個camera。我們項目現在也有這個問題,需要把我們原本的UI多Canvas多相機改成單個Canvas。可以考慮改一下LWRP的「Blit」Shader,加入一句「Blend SrcAlpha OneMinusSrcAlpha」。

感謝廖武興@UWA問答社區提供了回

A2:需要自行擴展加入相機的,如DepthOnly這樣的ClearMode來應對此需求。

感謝金鑫@UWA問答社區提供了回答,歡迎大家轉至社區交流:

https://answer.uwa4d.com/question/5d5b6bd1c494b506d2673a93

Q:因為一些需求需要在Vertex Shader裡面用Tex2Dlod採樣,但是看了文檔說是Tex2Dlod是S-M-3.0的標準,OpenGL ES2.0隻是部分實現了S-M-3.0的標準,所以不清楚在實際的設備上,不支持Tex2Dlod的設備有多少。我們遊戲需要發海外,如果不支持的比例很大,我們就需要考慮加入一些fallback的機制了。

參考了以下文檔:

https://docs.unity3d.com/Manual/SL-PlatformDifferences.html

https://docs.unity3d.com/Manual/SL-ShaderCompileTargets.html


A1:Tex2DLod只在部分擴展OpenGL ES2.0功能的手機上支持,但具體如何在運行時識別,UWA並沒有特別研究過。一般保險起見,還是在OpenGL ES3.0以上使用Tex2DLod比較好,避免不必要的麻煩。可以看看其他社區朋友,是否有類似的經驗。

該回答由UWA提供

A2:如果不是針對固定平臺的開發,用到這種對Feature Level有要求的功能,肯定是要做fallback的,一個Shader裡寫兩個SubShader,第一個是最完整功能的,後面的是用來做降級的;如果運行時第一個不被支持,會一個個嘗試後面的。

感謝鄭昊@UWA問答社區提供了回

A3:用glGetIntegerv這個API來判斷,代碼如下:

int MaxVertexTextureImageUnits;

glGetIntegerv(GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS, &MaxVertexTextureImageUnits);

感謝王嘯予@UWA問答社區提供了回答,歡迎大家轉至社區交流:

https://answer.uwa4d.com/question/5d5653ffc494b506d26739f5

Q:Resources.UnloadunsedAssets可以卸載掉從AssetBundle中的LoadAsset()中加載出來的GameObject嗎?這個GameObject不是Instantiate出來的,而是直接從AssetBundle中加載出來的。發出這個疑問主要是因為Resources.UnloadAsset去卸載這個GameObject的時候會提示報錯:GameObject、Component、AssetBundle不能被Resources.UnloadAsset卸載。


A1:可以的,更準確地說,Resources.UnloadunsedAssets實際上卸載的是LoadAsset出來的Object,在實例化之前,我們一般還是不將其稱呼為GameObject。

該回答由UWA提供

A2:不知道您是要問Resources.UnloadUnusedAssets還是Resources.UnloadAsset呢?

Unity引擎卸載資源有以下幾種方式:

1、Resources.UnloadAsset 這個方法在API文檔中可以看到一句話,「This function can only be called on Assets that are stored on disk」,例如:Texture等。而問題中的Component等是不能被這個接口卸載的。

2、Resources.UnloadUnusedAssets 這個方法是一個異步地調用,引擎會完整地遍歷一遍後,卸載掉沒有被引用的資源。這個接口耗時非常大,需謹慎使用,否則調用時會造成持續的卡頓。

3、AssetBundle.Unload() 這個接口可以通過傳入參數的不同來控制是只卸載Bundle還是同時卸載Bundle和Bundle中加載出來的資源。不同的團隊在這個接口上的使用方式有所不同,有的團隊使用false,有的團隊使用true,具體還需要結合具體項目具體分析。一般使用true比較暴力,必須在上層處理好資源和Bundle的引用計數,否則很可能會出現一個還在使用的資源被強行卸載掉。

4、Object.DestroyImmediately 這個接口也可以去卸載掉一些Texture的資源。

針對問題中提到LoadAsset出來的資源,如果引用計數完善,可以在沒有資源被使用的時候通過AssetBundle.Unload(true)來完全卸載掉。如果需要單獨卸載,不同類型的資源卸載方式也不同,需要針對性的處理。

UWA問答(https://answer.uwa4d.com)和UWA Blog(https://blog.uwa4d.com)中有很多關於AssetBundle和資源管理相關的文章,建議都閱讀一下。

感謝範君@UWA問答社區提供了回答,歡迎大家轉至社區交流:

https://answer.uwa4d.com/question/5d57b66dc494b506d26739f9

Q:假如我有一個線上包,用2018.3.5打包的客戶端和AssetBundle包,然後現在出了2018.4.0,我發現2018.4裡修了一些崩潰的Bug,希望升級到2018.4,但是線上包並不進行強更(因為會流失),而之後的玩家下載的是新包。

現在的問題是:

1、客戶端本身用這個操作沒有什麼問題,我試了下2018.3.5一樣能打開2018.4的AseetBundle包,運行起來也沒什麼問題。

2、但是2018.4打出來的所有AseetBundle包都變了,主要就是文件頭那裡有個Unity版本號的地方變成了2018.4,內容實際上沒什麼變化。這就導致以前下載了2018.3.5的客戶端的玩家需要重新下所有AseetBundle包。

我想問問有沒有人做過線上包升級Unity版本但是不強更的類似處理?這時候AseetBundle包怎麼處理的?

A1:兩個問題:

1、沒做好很基本的線上底包版本的前後兼容和劃分。

2、沒做好是否要重新打AssetBundle的校驗。

解決方式:

1、對各自版本用各自的Unity版本打各自的AssetBundle包,注意添加版本標識,下載各自的AssetBundle。

2、重打AssetBundle校驗,打完之後檢測還原不需要更新的AssetBundle。

感謝hy@UWA問答社區提供了回


A2:1、不要使用文件的MD5碼做校驗,決定是否下載。

2、使用一個版本列表,記錄每個文件打包的版本號,根據版本號來決定是不是要更新。

3、版本更新的問題,使用SVN的記錄修改來增量更新。這個與Unity的版本號變化沒有關係。

所以,就算Unity版本變了,打出來的AssetBundle變化了,但只要是版本沒有變化 ,都可以認為是不需要更新的。如果之前已經上線的,就已經是針對MD5做校驗更新的那就沒辦法了。

感謝kk@UWA問答社區提供了回答,歡迎大家轉至社區交流:

https://answer.uwa4d.com/question/5cd927725dad710abee805a4

Q:《關於Unity中的UGUI優化,你可能遇到這些問題》關於這篇文章裡面「網格重建」的前兩個問題:我有些不解。


修改Image的Color,其實是修改最終UGUI生成的Mesh的頂點色,然後通過模型頂點色影響最終表現,這裡說的會導致Canvas的Layout相關的重建,以至於導致Canvas重建,不會新增DrawCall,我可以理解。但是通過修改Image使用的MAT的顏色屬性去影響最終表現,卻會增加一個DrawCall,這裡我不理解。

我理解的是[來源於渲染流程(https://zhuanlan.zhihu.com/p/36311174)]: 在改變MAT顏色的下一個渲染幀,CPU開始組織相關Mesh數據以及渲染狀態數據,然後分批次給GPU通知,先SetPass call,後DrawCall,如果按照這個流程走下去,會發現其實DrawCall也不會增加,只不過在某個DrawCall的時候,其Batch的數據和上一幀有一點兒變化。 所以如何理解這裡?


A:如果只是渲染一個Image,那麼無論怎麼做都是只有一個DrawCall;如果多個Image,這就要考慮到優化了,如果不修改MAT的屬性,那麼所有的Image都是同樣的MAT實例,會合批為同一個DrawCall即可繪製;如果你通過修改其中一個Image使用的MAT的顏色屬性,那麼必定生成一個新的MAT,不符合合批條件,即會用另外一個DrawCall來繪製該Image,即所謂的產生一個DrawCall。

感謝Wangtao@UWA問答社區提供了回答歡迎大家轉至社區交流:

https://answer.uwa4d.com/question/5d5a7294c494b506d2673a75

封面圖:Texture Panner

https://lab.uwa4d.com/lab/5b699752d7f10a201f020599

今天的分享就到這裡。當然,生有涯而知無涯。在漫漫的開發周期中,您看到的這些問題也許都只是冰山一角,我們早已在UWA問答網站上準備了更多的技術話題等你一起來探索和分享。歡迎熱愛進步的你加入,也許你的方法恰能解別人的燃眉之急;而他山之「石」,也能攻你之「玉」。

官網:www.uwa4d.com

官方技術博客:blog.uwa4d.com

官方問答社區:answer.uwa4d.com

UWA學堂:edu.uwa4d.com

官方技術QQ群:793972859(原群已滿員)

(長按識別二維碼進入UWA問答)

自動化測試已上線!

近期精彩回顧

【厚積薄發】ToLua的釋放時機

【厚積薄發】異步上傳管線AUP答疑

【厚積薄發】PSS內存優化方法

【厚積薄發】粒子特效美術標準

相關焦點

  • UGUI 降低填充率技巧兩則
    Polygon Mode Sprites在UI部分中我們會大量使用圖片作為元素,如果圖片邊緣有大片留白就會和上面那個問題一樣,產生很多無用填充。當然,目前Unity只在Sprite Render裡支持了這個模式,在UGUI的Image中還無法正常使用。
  • 【厚積薄發】UGUI LateBinding使用注意事項
    當我以AssetBundle的方式試圖顯示這個UI Prefab時,如果不事先將SpriteAtlas加載完畢,並且寫好SpriteAtlasManager.atlasRequested回調,確實會報錯。
  • 【厚積薄發】Texture Streaming Mipmap使用疑問
    關於你第二問題,這個很難回答,目前還沒有在已經上線的項目中看到使用。A:原來的實現方式是這種,直接用Graphics畫出來一個Mesh,這種在結果看來是不支持子網格。A1:Unity PostProcess在代碼上的優化空間有限,可以根據項目的使用在代碼上去掉一些細節效果。我們之前的項目在代碼上的優化不多,主要還是解決Bug。
  • 【厚積薄發】按鈕穿透點擊實現方式
    UWA 問答社區:answer.uwa4d.comUWA QQ群2:793972859(原群已滿員)本期目錄:按鈕穿透點擊實現方式根據Mesh名稱查找其在FBX中的路徑使用IL2CPP後是否存在Mono內存實例化
  • 說「大器晚成」與「厚積薄發」
    《漢語大詞典》還引用《論衡》中的句子,凸顯「大器晚成,寶貨難售」的並列使用,應是特意藉以證明歷來解釋之無誤。但是,《老子》第四十一章中以「大」起頭並且排比在一起的小句共4個:「大方無隅;大器晚成;大音希聲;大象無形。」大意是:度量特大的方形,反而沒有稜角;度量特大的器皿,總是很晚才能成就;度量特大的聲音,反而難以聽清;度量特大的物象,反而難以看到。
  • 【厚積薄發】使用GPU Instancing屏幕花屏問題
    ——————————————通過GPU Skinning方式A:Unity默認渲染管線是多相機共享RenderTexture的方式,即多個相機逐一使用公共的CameraDepthRenderTexture繪製,每個相機繪製完是否Clear,取決於你下一個相機的ClearMode。
  • 【厚積薄發】Airtest工具在使用時的卡頓問題
    現在不知道CalculateLegacy和CalculateMikk之間的詳細一些的區別,也就是我們什麼時候應該使用CalculateLegacy,什麼時候應該使用CalculateMikk?可以閱讀該篇文章:Bitmap & Texture2D 互轉方法搜集(https://blog.csdn.net/xuehuic/article/details/7386339)同時,也可以使用ImageConversion(https://docs.unity3d.com/ScriptReference
  • 【厚積薄發】使用ScriptableObject代替部分配置表的坑點
    A1:之前的項目曾經用過這種方式做配置表,但是隨著表格和配置的增加,會出現許多問題,比如以下幾個:1. 內存:內存要比普通的加載、解析二進位文件要大不少,大概有8倍。2. 加載速度:加載速度比普通的解析二進位要慢十倍以上,也是個大概值,畢竟是三年前做的項目了。3.
  • 學習成語:厚積薄發
    今日成語厚積薄發成語讀音hòu jī bó
  • 趕集網:十年發展,厚積薄發
    首頁 > 傳媒 > 關鍵詞 > 趕集網最新資訊 > 正文 趕集網:十年發展,厚積薄發
  • 【厚積薄發】技術分享(五十三)| Instantiate產生大量GC|UGUI 重繪| Dynamic Batching...
    我們期望角色不受屏幕後處理影響,所以目前採用雙相機的方案,根據Layer劃分,但是這種情況下角色的影子也就沒有辦法投影到地表上,請問這種需求有什麼好的實現方式?A: 可以嘗試根據地表模型的局部細節來動態生成接受陰影的網格(比如Fast Shadow Receiver插件),這樣既可以保證地表模型進行屏幕後處理操作,同時也可以生成相關角色的動態陰影。
  • Unity3D入門教程——遊戲開發利器UGUI的基本使用方法
    作者:zzlyw前言UGUI是Unity官方推出的新一代交互系統,與傳統的GUI相比,它具有使用靈活、界面美觀、支持個性化定製的特點。本文將會進行UGUI使用的簡單介紹,與大家一起敲開UGUI開發的大門。說到底,UGUI還是一種UI系統,目的就是幫助用戶更好地與軟體進行交互。本文將介紹canvas、image、button等。當學會了使用button和image等控制項後,其他的也就可以舉一反三地進行自學了。
  • 厚積薄發104簡介
    厚積薄發104
  • 摁住急功近利的心,成功需要厚積薄發(深度好文)
    成功不是一蹴而就的,而是一個厚積薄發的過程。追求成功,要摁住急功近利的心,耐得住寂寞、禁得起誘惑,吃得了苦、出得了力,通過堅持不懈地努力,才能品味到甜美的成功果實。可這其中的方式卻不一樣,有的人急功近利,恨不得一夜暴富、一夜成名;有的人卻能夠腳踏實地,通過一點一點、不斷地努力,厚積薄發,等到時機成熟之時,再爆發出最大的能量,那時,成功也就是水到渠成的事情了。有人曾說,「世界上只有兩種人,用一個簡單的實驗就可以把他們區分開來。
  • 【厚積薄發】如何通過Timeline的形式實現技能編輯器
    A1:建議學習Timeline的使用方法以及傳統技能編輯器是怎麼做的,然後再想想看如何結合。A:可以使用以下方式:Sprites.DataUtility.GetOuterUV(activeSprite)感謝題主凡凡
  • 【厚積薄發】粒子特效美術標準
    使用的模式是渲染到RT上。想問這種情況下,如何能做到「開啟GPU Profiler」之後的效果?A:搜了一些信息,不知道題主有沒有嘗試過。可以使用「Unity VideoPlayer Stutter」關鍵詞進行搜索。
  • 學習英語,厚積薄發的秘密在這裡!
    經過網上授課,明顯感覺到,我的方法會讓人「厚積薄發」!在這裡,首先講一下「厚積薄發」的意思。厚積:指大量地、充分地積蓄;薄發:指少量地、慢慢放出。形容只有準備充分才能辦好事情。宅在家裡上網課的那段時間,能跟上老師教學節奏的都是那些字母基礎好的學生。
  • 學問應該這麼做:博觀約取、厚積薄發
    我們都知道厚積薄發這個詞,自蘇軾提出「博觀而約取,厚積而薄發」後,就把博觀約取與厚積薄發聯繫在了一起,既對應也完善,更加精妙。我們如何才能做好學問?博觀約取、厚積薄發就是好方法。不僅如此,博觀約取和厚積薄發本身就是學問。
  • 周永康的「厚積薄發」一語成讖 偶然與必然
    報導稱,如今校園風物依舊,而同學們則為這位曾令學校引以為傲的「傑出校友」惋惜、唏噓;周永康在校內的題詞「厚積薄發」似乎也一語成讖,題詞人和被題中的徐才厚、薄熙來竟先後落馬。(8月2日新華社電)  去年10月周永康曾現身中國石油大學的校慶,很多同學稱其為和藹親切的老頭。當時他還應邀為母校題寫了「厚積薄發,開物成務」的校訓。校方隨後還特意將周永康題寫的校訓刻在大柱上。
  • 學練結合厚積薄發
    學練結合厚積薄發,譜寫人生新篇;師生同心砥礪德行,定能金榜題名!