這是第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內存優化方法
【厚積薄發】粒子特效美術標準