Unity性能優化中Profiler常見高損耗節點 - 轉


A
Animator.Initialize
主要是在Instantiate實例化時引起(實際上,GameObject.Active操作也會引起Animator.Initialize),而其具體的耗時原因是相關資源(主要是AnimationClip資源)的加載所致。
C
Camera.Render
是Unity引擎的主要渲染函數,其中負責了絕大部分場景的渲染工作

Canvas.SendWillRenderCanvases
為UGUI中非常重要的接口,經常會出現較高的性能開銷。當Canvas中的UI元素出現了長、寬或Alpha變化時,UGUI會更新其所在Canvas中所有UI元素的Transform、狀態等等。Canvas中UI Mesh頂點較多的話,則該項將會出現較高的CPU開銷。

Canvas.SendWillRenderCanvases()
該API為UI元素自身發生變化(比如被Enable或者被縮放,移動並不算)時所產生的調用。發生在canvas被渲染之前。

Canvas.BuildBatch
該API為UI元素合並的Mesh需要改變時所產生的調用。通常之前所提到的Canvas.SendWillRenderCanvases()的調用都會引起Canvas.BuildBatch的調用。另外,Canvas中的UI元素發生移動也會引起Canvas.BuildBatch的調用。

E
EventSystem.Update
來自被觸發的響應事件,這部分的開銷實際上並不屬於事件系統本身,比如:某次點擊觸發了一個開銷很高的邏輯函數,尤其是涉及到資源的加載和實例化。
F
Font.CacheFontForText
主要是指生成動態字體Font Texture的開銷, 一次性打開UI界面中的文字越多,其開銷越大。
G
Gpaphics.PresentAndSync
– 反映GPU上的渲染壓力

GameObject.Deactivate
實際上GameObject.Activate/Deactivate本身通常不會產生很高的開銷,主要都是由其上或其子節點上的組件的OnEnable/OnDisable操作引起,比如UI相關的組件在OnEnable和OnDisable中都會有較多的操作,所以較復雜的UI界面的GameObject.Activate/Deactivate會有很高的開銷。

GameObject.Instantiate
Instantiate的卡頓與三部分開銷相關:相關資源加載、腳本組件的序列化和構造函數的執行,並且絕大部分原因均是相關資源加載導致。

Gfx.WaitForPresent && Graphics.PresentAndSync
這兩個參數在Profiler中經常出現CPU占用較高的情況,且僅在發布版本中可以看到。究其原因,其實是CPU和GPU之間的垂直同步(VSync)導致的,之所以會有兩種參數,主要是與項目是否開啟多線程渲染有關。當項目開啟多線程渲染時,你看到的則是Gfx.WaitForPresent;當項目未開啟多線程渲染時,看到的則是Graphics.PresentAndSync。

L
Loading.UpdatePreloading
為Unity引擎的主要加載函數。場景中的資源加載(包括Texture、Mesh、Shader、AnimationClip等)和相關序列化操作均在其中體現。因此,如果該值開銷較高,建議研發團隊對資源進行進一步的優化和控制。

LogStringToConsole
Unity中有些問題不輸出在Console上,而是輸出在Editor Log上了,右鍵Console > Open Editor Log可以打開編輯器日志,查看具體錯誤信息。

M
MeshSkinning.Update
(蒙皮網格每幀更新)和Animation.Update and Animator.Update(骨骼動畫的更新開銷)兩個函數

MaskableGraphic.OnEnable
在UGUI中,Image組件並沒有重寫其父類的OnEnable函數,所以在激活時會出現MaskableGraphic.OnEnable。其中出現堆內存開銷的話,通常是因為其父類函數Graphic.OnEnable中,UGUI在進行全局容器的Add等類似的操作時,遇到了擴容等產生堆內存的操作。

O
OnTransformChanged
是UI元素在移動時觸發的,所以該回調的開銷是不可避免的,但一般來說該回調本身耗時並不會太高

Overdraw
該模塊可以幫助用戶直接查看項目運行時每幀都渲染的像素數量,從而反映出設備GPU端所承受的壓力。我們可以看到下面的圖片中有地方是黑色,有地方是紅色。顏色越紅,表示該處像素在當前幀中被填充的次數較多,進而GPU的壓力也就越大。移動VR開發者需要特別關注這部分的情況。

P
Profiler.FinalizeAndSendFrame
這個是Unity Profiler在記錄和傳輸性能數據的開銷,研發團隊可忽略,因為在release版本中,該項並不存在;

Physics.Processing
影響物理系統耗時的因素主要為Contacts數量(碰撞對數量)、Rigidbody API的使用情況和每幀的調用次數。

S
Shader.Parse體現的是Shader的加載和解析
Shader.CreateGpuProgram 是將Shader傳入GPU的一次提交,GPU驅動會對其進行編譯,以適應於特定的設備或平台。
在Unity 5.x版本中,Shader.Parse在Shader資源加載時進行執行,而 Shader.CreateGpuProgram在所在GameObject第一渲染時進行執行。
ScrollRect.LateUpdate()
U
UIEvents.IMGUIRenderOverlays

一旦發現UIEvents.IMGUIRenderOverlays中花費了大量的主線程CPU時間以及GC分配,這就表明在項目的代碼庫中的某處使用了Unity的即時模式GUI系統:即便是在代碼庫中僅出現一次OnGUI方法,也會導致IMGUI系統在游戲運行時進行初始化和處理。
重要的是IMGUI非常低效,不適合生產代碼。

void OnGUI() { if(GUI.Button(new Rect(100, 100, 100, 100), "Load UI")) { //TODO } }

W
WaitForJobGroup
這個是主線程在等待子線程完成的耗時開銷,如果該項較高,那么說明該幀中某子線程的開銷很大。就目 前我們優化過的項目而言,絕大部分均為UGUI在子線程的開銷所致。
WaitForTargetFPS
該參數一般出現在CPU開銷過低,且通過設定了目標幀率的情況下(Application.targetFrameRate)。當上一幀低於目標幀率時,將會在本幀產生一個WaitForTargetFPS的空閑等待耗時,以維持目標幀率。

Unity性能優化中Profiler常見高損耗節點


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM