[Unity優(yōu)化] Unity Profiler性能分析

Profiler窗口


1. CPU

A. WaitForTargetFPS:?

Vsync(垂直同步)功能所,即顯示當前幀的CPU等待時間?

B. Overhead:?

Profiler總體時間-所有單項的記錄時間總和。用于記錄尚不明確的時間消耗,以幫助進一步完善Profiler的統(tǒng)計。?

C. Physics.Simulate:?

當前幀物理模擬的CPU占用時間。?

D. Camera.Render:?

相機渲染準備工作的CPU占用量?

E. RenderTexture.SetActive:?

設(shè)置RenderTexture操作.?

底層實現(xiàn):1.比對當前幀與前一幀的ColorSurface和DepthSurface.?

2.如果這兩個Buffer一致則不生成新的RT,否則則生成新的RT,并設(shè)置與之相對應(yīng)的Viewport和空間轉(zhuǎn)換矩陣.?

F. Monobehaviour.OnMouse_ :?

用于檢測鼠標的輸入消息接收和反饋,主要包括:SendMouseEvents和DoSendMouseEvents。(只要Edtor開起來,這個就會存在)?

G. HandleUtility.SetViewInfo:?

僅用于Editor中,作用是將GUI和Editor中的顯示看起來與發(fā)布版本的顯示一致。?

H. GUI.Repaint:?

GUI的重繪(說明在有使用原生的OnGUI)?

I. Event.Internal_MakeMasterEventCurrent:?

負責GUI的消息傳送?

J. Cleanup Unused Cached Data:?

清空無用的緩存數(shù)據(jù),主要包括RenderBuffer的垃圾回收和TextRendering的垃圾回收。?

1.RenderTexture.GarbageCollectTemporary:存在于RenderBuffer的垃圾回收中,清除臨時的FreeTexture.?

2.TextRendering.Cleanup:TextMesh的垃圾回收操作?

K. Application.Integrate Assets in Background:?

遍歷預(yù)加載的線程隊列并完成加載,同時,完成紋理的加載、Substance的Update等.?

L. Application.LoadLevelAsync Integrate:?

加載場景的CPU占用,通常如果此項時間長的話70%的可能是Texture過長導致.?

M. UnloadScene:?

卸載場景中的GameObjects、Component和GameManager,一般用在切換場景時.?

N. CollectGameObjectObjects:?

執(zhí)行上面M項的同時,會將場景中的GameObject和Component聚集到一個Array中.然后執(zhí)行下面的Destroy.?

O. Destroy:?

刪除GameObject和Component的CPU占用.?

P. AssetBundle.LoadAsync Integrate:?

多線程加載AwakeQueue中的內(nèi)容,即多線程執(zhí)行資源的AwakeFromLoad函數(shù).?

Q. Loading.AwakeFromLoad:?

在資源被加載后調(diào)用,對每種資源進行與其對應(yīng)用處理.

2.GPU Usage

A. Device.Present:?

device.PresentFrame的耗時顯示,該選項出現(xiàn)在發(fā)布版本中.?

B. Graphics.PresentAndSync:?

GPU上的顯示和垂直同步耗時.該選項出現(xiàn)在發(fā)布版本中.?

C. Mesh.DrawVBO:?

GPU中關(guān)于Mesh的Vertex Buffer Object的渲染耗時.?

D. Shader.Parse:?

資源加入后引擎對Shader的解析過程.?

E. Shader.CreateGPUProgram:?

根據(jù)當前設(shè)備支持的圖形庫來建立GPU工程.

3. Memory Profiler

A. Used Total:?

當前幀的Unity內(nèi)存、Mono內(nèi)存、GfxDriver內(nèi)存、Profiler內(nèi)存的總和.?

B. Reserved Total:?

系統(tǒng)在當前幀的申請內(nèi)存.?

C. Total System Memory Usage:?

當前幀的虛擬內(nèi)存使用量.(通常是我們當前使用內(nèi)存的1.5~3倍)?

D. GameObjects in Scene:?

當前幀場景中的GameObject數(shù)量.?

E. Total Objects in Scene:?

當前幀場景中的Object數(shù)量(除GameObject外,還有Component等).?

F. Total Object Count:?

Object數(shù)據(jù) + Asset數(shù)量.

4. Detail Memory Profiler

A. Assets:?

Texture2d:記錄當前幀內(nèi)存中所使用的紋理資源情況,包括各種GameObject的紋理、天空盒紋理以及場景中所用的Lightmap資源.?

B. Scene Memory:?

記錄當前場景中各個方面的內(nèi)存占用情況,包括GameObject、所用資源、各種組件以及GameManager等(天般情況通過AssetBundle加載的不會顯示在這里).?

A. Other:?

ManagedHeap.UseSize:代碼在運行時造成的堆內(nèi)存分配,表示上次GC到目前為止所分配的堆內(nèi)存量.?

SerializedFile(3):?

WebStream:這個是由WWW來進行加載的內(nèi)存占用.?

System.ExecutableAndDlls:不同平臺和不同硬件得到的值會不一樣。

5. 優(yōu)化重點

A. CPU-GC Allow:?

關(guān)注原則:1.檢測任何一次性內(nèi)存分配大于2KB的選項 2.檢測每幀都具有20B以上內(nèi)存分配的選項.?

B. Time ms:?

記錄游戲運行時每幀CPU占用(特別注意占用5ms以上的).?

C. Memory Profiler-Other:?

1.ManagedHeap.UsedSize: 移動游戲建議不要超過20MB.?

2.SerializedFile: 通過異步加載(LoadFromCache、WWW等)的時候留下的序列化文件,可監(jiān)視是否被卸載.?

3.WebStream: 通過異步WWW下載的資源文件在內(nèi)存中的解壓版本,比SerializedFile大幾倍或幾十倍,重點監(jiān)視.****?

D. Memory Profiler-Assets:?

1.Texture2D: 重點檢查是否有重復資源和超大Memory是否需要壓縮等.?

2.AnimationClip: 重點檢查是否有重復資源.?

3.Mesh: 重點檢查是否有重復資源.

6. 項目中可能遇到的問題

A. Device.Present:?

1.GPU的presentdevice確實非常耗時,一般出現(xiàn)在使用了非常復雜的shader.?

2.GPU運行的非???,而由于Vsync的原因,使得它需要等待較長的時間.?

3.同樣是Vsync的原因,但其他線程非常耗時,所以導致該等待時間很長,比如:過量AssetBundle加載時容易出現(xiàn)該問題.?

4.Shader.CreateGPUProgram:Shader在runtime階段(非預(yù)加載)會出現(xiàn)卡頓(華為K3V2芯片).?

B. StackTraceUtility.PostprocessStacktrace()和StackTraceUtility.ExtractStackTrace():?

1.一般是由Debug.Log或類似API造成.?

2.游戲發(fā)布后需將Debug API進行屏蔽.

C. Overhead:?

1.一般情況為Vsync所致.?

2.通常出現(xiàn)在Android設(shè)備上.?

D. GC.Collect:?

原因: 1.代碼分配內(nèi)存過量(惡性的) 2.一定時間間隔由系統(tǒng)調(diào)用(良性的).?

占用時間:1.與現(xiàn)有Garbage size相關(guān) 2.與剩余內(nèi)存使用顆粒相關(guān)(比如場景物件過多,利用率低的情況下,GC釋放后需要做內(nèi)存重排)?

E. GarbageCollectAssetsProfile:?

1.引擎在執(zhí)行UnloadUnusedAssets操作(該操作是比較耗時的,建議在切場景的時候進行).?

2.盡可能地避免使用Unity內(nèi)建GUI,避免GUI.Repaint過渡GC Allow.?

3.if(other.tag == GearParent.MogoPlayerTag)改為other.CompareTag(GearParent.MogoPlayerTag).因為other.tag為產(chǎn)生180B的GC Allow.?

F. 少用foreach,因為每次foreach為產(chǎn)生一個enumerator(約16B的內(nèi)存分配),盡量改為for.?

G. Lambda表達式,使用不當會產(chǎn)生內(nèi)存泄漏.?

H. 盡量少用LINQ:?

1.部分功能無法在某些平臺使用.?

2.會分配大量GC Allow.?

I. 控制StartCoroutine的次數(shù):?

1.開啟一個Coroutine(協(xié)程),至少分配37B的內(nèi)存.?

2.Coroutine類的實例 — 21B.?

3.Enumerator — 16B.?

J. 使用StringBuilder替代字符串直接連接.?

K. 緩存組件:?

1.每次GetComponent均會分配一定的GC Allow.?

2.每次Object.name都會分配39B的堆內(nèi)存.

Unity優(yōu)化系列文章:http://www.unity.5helpyou.com/tag/unity%E4%BC%98%E5%8C%96

本文轉(zhuǎn)截自:http://www.unity.5helpyou.com/2791.html

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容