日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

技术分享连载(六十四)

發(fā)布時間:2023/12/15 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 技术分享连载(六十四) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

資源管理

Q:Unity 5 的 Shader Variant Collection 功能是否推薦使用?我有以下3個疑點:
1)使用 Shader 變體之后,Shader 是否還能走資源更新?抑或 Shader 不推薦走資源更新?
2)Shader 變體和 Shader Always Include 的主要區(qū)別是什么?二者對內(nèi)存和幀率影響如何?
3)在 Unity 5 較早的版本中,Shader 變體功能似乎有一些Bug,現(xiàn)在是否可靠?

經(jīng)過測試,在較新的版本中(如Unity 5.5.3),將ShaderVariantCollection與Shader打包在相同的AssetBundle中后,其中會包含該Shader在ShaderVariantCollection中指定的Variant。因此:

1)使用 ShaderVariantCollection后依然可以進行資源更新(通過更新AssetBundle,來更新Shader的實現(xiàn)或者ShaderVariantCollection中包含的Variant)。

2)ShaderVariantCollection與Always Included Shaders的區(qū)別主要在于打包時所包含的Variant。Always Included Shaders中的Shader,其所有的Variant都會被包含,好處是,理論上不會出現(xiàn)Variant丟失的情況;壞處是,會導(dǎo)致更大的發(fā)布包以及額外的內(nèi)存占用,而影響最大的是手動進行Warmup時的耗時以及ShaderLab的內(nèi)存占用。因此一般來說,對于Variant特別多的Shader(如Standard Shader),并不推薦放入Always Included Shaders中。

3)目前即使是較新的版本,其可靠性我們也并不能確保,依然建議在使用前進行一些測試來驗證。

此問答來自于UWA 問答社區(qū):
https://answer.uwa4d.com/question/591418087640b5a822204e73
如您對該問題仍有疑問,可以轉(zhuǎn)至社區(qū)進行進一步交流。


性能優(yōu)化

Q2:請問為什么我項目渲染中Material.SetPassFast的開銷這么高?這個該如何優(yōu)化?

Material.SetPassFast是Unity引擎在渲染過程中Material的輪循切換開銷,一般在Unity5.0~Unity5.3版本中出現(xiàn)。它的開銷主要分為兩種:

1) Shader.CreateGPUProgram峰值開銷
這種情況主要出現(xiàn)在Shader第一次渲染時。在Unity5.0以后,引擎為了避免Shader加載時過高的CPU峰值出現(xiàn),已經(jīng)將Shader.Parse和Shader.CreateGPUProgram兩種操作分開執(zhí)行,前者在Shader加載時,后者在Shader第一次渲染時。下圖則為一款項目運行時渲染時的Shader.CreateGPUProgram開銷。

2) 渲染狀態(tài)切換開銷
這種情況是幾乎每一幀都發(fā)生的,有渲染的地方就會有Material的切換。從問題圖中可以看出,在運行的16000幀中,Material.SetPassFast一共被調(diào)用137萬次。這里可以認為幾乎全部是渲染時Material的切換操作。因此,該項較高的主要原因還是材質(zhì)切換操作過多所致。所以,建議研發(fā)團隊在報告中的詳細材質(zhì)頁面查看是否有過多“冗余”的材質(zhì)出現(xiàn),如有則盡可能降低材質(zhì)的使用冗余度。


動畫

Q3:Animator會把所有狀態(tài)的AnimationClip加載到內(nèi)存,有什么好的辦法可以動態(tài)加載?

1)Animator Controller結(jié)構(gòu)不需要改變,但動畫需要變化。比如隨著人物等級或技能升級,同種的攻擊動作隨著變化等。該種需求可以通過AnimatorOverrideController來進行完成,即按需加載新的AnimationClip,然后替換AnimatorOverrideController中相應(yīng)的AnimationClip即可。目前,Unity的AnimatorOverriderController不僅可以進行單個替換,同時也可以ApplyOverrides成組替換;

2)Animator Controller結(jié)構(gòu)需要改變,類似于Animation老版本動畫的AddClip功能。這種需求需要替換AnimatorController,研發(fā)團隊可以在動態(tài)加載AnimationClip的同時,動態(tài)加載相應(yīng)的Animator Controller,然后進行替換即可。

以上方法研發(fā)團隊可根據(jù)自身實際情況而定。


動畫

Q4:為什么Transform.設(shè)置Parent會觸發(fā)Animator的初始化嗎?Parent是等于null的。

把 Parent 設(shè)為null,相當(dāng)于把這個 GameObject 變?yōu)楦?jié)點。如果在設(shè)置之前這個 GameObject 本身是激活狀態(tài),但其的父節(jié)點是未激活狀態(tài),那么設(shè)置之后,相當(dāng)于把這個GameObject 激活。而激活GameObject 時就會觸發(fā) Animator.Initialize 等操作了。


資源管理

Q5:美術(shù)做粒子的時候,粒子與粒子之間共用資源的情況很多,例如某幾個粒子共用一個Material,某幾個粒子共用一個貼圖等,應(yīng)該如何組織AssetBundle?要是對應(yīng)到最細的那個程度,凡是共用過的資源都單獨打一個AssetBundle,好像又會很瑣碎,假如不那么做,粒子與粒子之間的AssetBundle又會有冗余。這方面有什么好的建議?

AssetBundle打包沒有標(biāo)準(zhǔn)的方式,單就粒子系統(tǒng)而言,因為其個體本身比較小,并且在項目中經(jīng)常大量出現(xiàn),所以并不建議將粒子系統(tǒng)逐個打包,而是建議根據(jù)其出現(xiàn)頻率進行打包,比如將同一段時間、同一出現(xiàn)場景等的粒子系統(tǒng)打包在一起。同時,由于粒子系統(tǒng)的Shader基本上都是Unity內(nèi)置Shader,因此,盡可能將Shader進行依賴打包。我們在UWA Day 2017上對于這種情況進行了詳細說明,其Shader在中低端移動設(shè)備上的加載開銷較高,需要研發(fā)團隊特別關(guān)注。





原文出處:侑虎科技
本文作者:admin
轉(zhuǎn)載請與作者聯(lián)系,同時請務(wù)必標(biāo)明文章原始出處和原文鏈接及本聲明。

總結(jié)

以上是生活随笔為你收集整理的技术分享连载(六十四)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。