Unity技術分享88-耗時分析、修改材質球、載入資源
我們將從日常技術交流中精選若干個開發相關的問題,建議閱讀時間15分鐘,認真讀完必有收穫。如果您有任何獨到的見解或者發現也歡迎聯繫我們,一起探討。
UI
Q1:在UI中,有兩個字體控制項每幀都要顯示不同的數字,第一個有8個字,第二個有6~7個字,需要開outline增加辨識度,從而引起了較高的性能開銷。 把這兩個控制項單獨放到另外獨立的Canvas,該問題依然存在。現已確定該開銷是由這兩個字體控制項每幀的文本更改引起的。 下圖是UI布局:
下面是引起的開銷截圖:
評論提到一個是8個字,一個是6到7個字,都開啟了outline。 首先建議再做一次確認,看是不是禁用這兩個之後,SendWill就確實沒開銷了。因為這個字數看上去並不應該造成很明顯的開銷;
其次,如果確實是這兩個造成的,那麼就需要先考慮下能不能轉成帶outline效果的靜態字體,不行的話再考慮下能不能降低更新的頻率了,是不是確實要每幀都變;
如果要再降低,就只能考慮靜態字體了,如果文本是一些比較固定的內容就很好處理,但如果是像聊天一樣,內容無法預知的話似乎就沒什麼辦法了。或者就是低端機用shadow來做。
該問題來自UWA問答社區,如您對該問題仍有疑問,可以轉至社區進行進一步交流。
https://answer.uwa4d.com/question/5a1685a335b1f0ea7d4a7a71
物理
Q2:我的遊戲場景中有一個boxcollider2D,位置在(0.0f,0.0f) 到 (1.0f,1.0f);調用Physics2D.BoxCast(new Vector2(1.0f,1.702), Vector2(1.0f, 1.4f), 0, Vector2(0.0f,1.0f), 2.0f); 會產生碰撞,理論上碰撞的邊界在1.700 ,我已經將位置放到1.702,應該是規避了浮點數誤差的問題的,如果我將該值放大了1.706就不會產生碰撞了,請問哪裡可以調整這個誤差值的範圍呢?
Unity 2017.1版本的Physics2DSettings裡面有一個Default Contact Offset,表示當兩個collider之間的距離小於它們的ContactOffset之和就會產生碰撞。把這個值設置小一點應該能解決題主的問題,如下圖所示:
Unity 5.x中Contact Offset,默認是0.01,這也是為何1.702不行,而1.706可以的原因。
該問題來自UWA問答社區,如您對該問題仍有疑問,可以轉至社區進行進一步交流。
https://answer.uwa4d.com/question/5a1672b235b1f0ea7d4a7a70
渲染
Q3:UWA有篇文章推薦了使用MaterialPropertyBlock的方式來操作Material屬性,能夠提升效率。原文如下:使用MaterialPropertyBlock來替換Material屬性操作,在查閱 ShaderLab: Properties文檔(https://docs.unity3d.com/Manual/SL-Properties.html)的時候,提到:
[PerRendererData] - indicates that a texture property will be coming from per-renderer data in the form of a MaterialPropertyBlock. Material inspector changes the texture slot UI for these properties.
那麼問題來了,Shader參數用不用[PerRendererData] 來描述,對MaterialPropertyBlock操作到底有沒有什麼影響?我測試了用和不用2種情況,顯示效果上都是正常的。
理論上[PerRendererData]只是修改Editor的顯示行為的。當題主通過MaterialPropertyBlock改變了某個Material的Texture之後,只有加上了這個,才能在預覽對應的Material面板上看到這個新Texture。
下圖1表示在沒有PerRendererData時,Editor下和Runtime時的顯示內容;而圖2和圖3分別是加了PerRendererData後,Editor下和Runtime時的顯示。
圖1
圖2
圖3
該問題來自UWA問答社區,如您對該問題仍有疑問,可以轉至社區進行進一步交流。
https://answer.uwa4d.com/question/5a13f080a92f435f5e27cef3
載入
Q4:現在用Resources.Load()載入資源時,UI動畫會出現卡頓的現象,如果想消除卡頓,是不是只能通過非同步載入,分拆Prefab和優化材質網格動畫之類的操作來實現?還是說UI動畫可以在另外的線程播放之類呢?另外我想問下,非同步速度是不是一定比同步慢呢?
非同步載入可以緩解同步載入的卡頓,但是還是一樣會卡,可以查看這個問題帖子中的說明。建議題主嘗試進行資源分拆,不要同一時刻進行載入,如果不是及時顯示的UI或其他GameObject,可以嘗試將部分耗時資源(Atlas、Shadder等)進行預載入,如果是及時顯示的UI的,那麼非同步載入並不能滿足這個需求,也就無需考慮了;
非同步速度也不一定百分百比同步慢,只能說一般情況下是如此;但具體慢多少,需要看載入的資源類型、資源量。
該問題來自UWA問答社區,如您對該問題仍有疑問,可以轉至社區進行進一步交流。
https://answer.uwa4d.com/question/5a13c4baa92f435f5e27ceec
動畫
Q5:遊戲對戰時因為會頻繁更換武器或釋放技能(主要是網路玩家),會替換不同的動作,但是發現每次設置animatorOverride[name]=clip(每次設置3-6個),CPU佔用50-180ms,請問這是什麼原因?我按照官方的指導存了一個list(https://docs.unity3d.com/ScriptReference/AnimatorOverrideController.ApplyOverrides.html),然後每次LateUpdate的時候調用ApplyOverrides,發現佔用更高了,每次400ms,請問這個要怎麼解決?目前每個網路玩家玩家OverRidesCount是73,會不會是Clip過多的原因?
我們在真機運行時發現animatorOverride[name]=clip的耗時會受到animatorcotrollor中的clip數目的影響,隨數目的增多耗時會明顯增加,70個以上的clip耗時確實能達到50ms(紅米note2)以上。但換為applyOverrides方法時耗時仍然很高,而且出現了堆內存分配,但並沒有達到400ms那麼高。 另外,這邊嘗試了整體替換AnimatorOverrideController,即不在現用的AnimatorOverrideController中替換clip,而是在另一OverrideController中換好clip後,再整體替換到runtimeAnimatorController,這樣耗時就會降到很低了。
該問題來自UWA問答社區,感謝Saber提供了回答,如您對該問題仍有疑問,可以轉至社區進行進一步交流。
https://answer.uwa4d.com/question/5a16904135b1f0ea7d4a7a72
※技術分享連載|Lua在iOS下的性能|Shader.CreateGPUProgram優化……
※如何更深入地掌握研發項目的物理性能?
TAG:侑虎科技 |