【厚積薄發】技術分享連載(九十一)| UI 公用圖集合併| UGUI圖集無法卸載|優化Profiler中Others的耗時...
我們將從日常技術交流中精選若干個開發相關的問題,建議閱讀時間15分鐘,認真讀完必有收穫。如果您有任何獨到的見解或者發現也歡迎聯繫我們,一起探討。
內存
Q:我的項目剛升級到Unity 5.6版本,然後在測試的時候出現了很嚴重的卡頓,我用Profiler真機檢測的時候,發現CPU的Others選項耗時很高,但是看了下也沒什麼粒子消耗,然後Animator的消耗也不高,這是為什麼呢?
A:Unity引擎中有10+的模塊,而Profiler面板中也就明確顯示出6個,Rendering、Scripts、Physics等等,其餘模塊的耗時都在被統計在Others中,所以Others高其實也是正常的。
在題主的Profiler截圖中可以看到,當前幀的CPU耗時為166ms,但面板上的BehaviorUpdate和LateBehaviorUpdate分別為36ms和37ms,這說明還有大量的CPU耗時在面板下方,題主需要往下拉,看看下面都有哪些耗時存在,理論上,這些耗時加起來是需要等於166ms的。
該問題來自UWA問答社區,如您對該問題仍有疑問,可以轉至社區進行進一步交流。
https://answer.uwa4d.com/question/5a2f74959d49d2a42cfa3a37
動畫
Q:我項目中的骨骼「Weapon R」的軌跡很奇怪,想請教下UWA。
我是這麼操作的,第一步:設置@skin.fbx
依次執行Reset -》Enforce T-Pose
第二步:設置動畫文件
第三步:Play。觀察骨骼"Weapon R」,從Idle -》 Run會有詭異的曲線。
再重複上述設置,設置@skin.fbx時僅Reset,不執行Enforce T-Pose,我觀察到Weapon R就是正常的,我在本帖里提供了例子。
A:我們從附件的工程來看,因為Weapon R骨骼的存在,如果Enforce T-Pose,會使手部的旋轉失真,並且從Idle->Run時會導致humanoid的插值混亂,從而得到錯誤的手部動畫,並因此影響Weapon R。可以使用configuration中Pose->BindPose,這樣可以保證可以身體各部位能夠正確映射,並且插值時不會出現問題,這邊這樣測試時沒有出現詭異軌跡。另外修改完config後不要忘了動畫fbx中update一下。
該問題來自UWA問答社區,如您對該問題仍有疑問,可以轉至社區進行進一步交流。
https://answer.uwa4d.com/question/5a260564d99fdb2b3c62886e
UI
Q:我們項目現在用的版本是Unity 4.7,NGUI。我們有幾個小的字體圖集,本來是部分功能模塊特有的,現在很多功能界面交叉引用了。大概是幾個256*256和512*256的圖集,我想把它們合併成一張1024*1024的大的公用圖集。使用會方便一些,但是公用圖集已經有2張1024的,加上這個就是3張大的,我想問下NGUI在使用過多1024圖集的時候,是不是上傳到GPU的時候也會有影響,如果是UGUI也會有這樣的問題嗎?註:公用圖集常駐內存,獨立打包。
A:「上傳到GPU」一般只是發生在載入後的,所以如果這幾張小圖集確實是經常同時被用到的話,合在一個1024圖裡是合理的做法,對DrawCall的合併也會有明顯的好處。針對小圖合併大圖造成的影響這個問題,UGUI和NGUI是差不多的,只是UGUI需要通過Sprite Packer查看下是不是確實只合成一張了。
該問題來自UWA問答社區,如您對該問題仍有疑問,可以轉至社區進行進一步交流。
https://answer.uwa4d.com/question/5a30ec9080dbcb53066289ea
內存
Q:Unity 5.4.6f3版本中UGUI的窗口資源無法卸載,如果該窗口沒有使用字體,僅僅使用了圖集的話是可以被回收的,但是只要UI使用了字體,就會導致無法回收。在Unity5.6.4f1版本中無此問題。 已在問答社區提交了例子。
A:這個問題在真機上是不會出現的,已經通過題主的附件進行了驗證。
而Editor下會出現的原因,可參考類似的這個問題。另外補一句,查資源的內存情況,不建議在Editor下進行,一方面是有可能Editor下的邏輯代碼和Runtime下會有差別,另一方面在Editor里被編輯過的資源也會被載入進內存,並有可能被緩存住。
該問題來自UWA問答社區,如您對該問題仍有疑問,可以轉至社區進行進一步交流。
https://answer.uwa4d.com/question/5a278aee9e3affe04a6aa8cd
載入
Q:Shader.WarmupAllShaders(); 這個是預編譯了所有的Shader么? 我還需要把那些常用的Shader放到一個Prefab上面,然後在遊戲啟動的時候載入么?
A:Shader.WarmupAllShaders有兩個問題,一個是它只warmup當前時刻的所有Shader,如果後續有新的Shader載入進來,還是會重新解析的,但如果warmup時刻已經能保證絕大部分Shader都已經在內存中,那麼使用這個API就足夠了;第二是這個API的耗時非常高,因為它會warmup所有的keywords組合,無論你是否在項目中使用到,所以在Unity 5.0以後可以嘗試通過shadervariantcollection.warmup來取代。
該問題來自UWA問答社區,如您對該問題仍有疑問,可以轉至社區進行進一步交流。
https://answer.uwa4d.com/question/5a3257b8710664857e39b40b
TAG:侑虎科技 |