Profiler窗口
1. CPU
A. WaitForTargetFPS:?
Vsync(垂直同步)功能所,即顯示當(dāng)前幀的CPU等待時(shí)間?
B. Overhead:?
Profiler總體時(shí)間-所有單項(xiàng)的記錄時(shí)間總和愕秫。用于記錄尚不明確的時(shí)間消耗承疲,以幫助進(jìn)一步完善Profiler的統(tǒng)計(jì)。?
C. Physics.Simulate:?
當(dāng)前幀物理模擬的CPU占用時(shí)間冲呢。?
D. Camera.Render:?
相機(jī)渲染準(zhǔn)備工作的CPU占用量?
E. RenderTexture.SetActive:?
設(shè)置RenderTexture操作.?
底層實(shí)現(xiàn):1.比對(duì)當(dāng)前幀與前一幀的ColorSurface和DepthSurface.?
2.如果這兩個(gè)Buffer一致則不生成新的RT舍败,否則則生成新的RT,并設(shè)置與之相對(duì)應(yīng)的Viewport和空間轉(zhuǎn)換矩陣.?
F. Monobehaviour.OnMouse_ :?
用于檢測(cè)鼠標(biāo)的輸入消息接收和反饋,主要包括:SendMouseEvents和DoSendMouseEvents邻薯。(只要Edtor開起來裙戏,這個(gè)就會(huì)存在)?
G. HandleUtility.SetViewInfo:?
僅用于Editor中,作用是將GUI和Editor中的顯示看起來與發(fā)布版本的顯示一致弛说。?
H. GUI.Repaint:?
GUI的重繪(說明在有使用原生的OnGUI)?
I. Event.Internal_MakeMasterEventCurrent:?
負(fù)責(zé)GUI的消息傳送?
J. Cleanup Unused Cached Data:?
清空無用的緩存數(shù)據(jù)挽懦,主要包括RenderBuffer的垃圾回收和TextRendering的垃圾回收。?
1.RenderTexture.GarbageCollectTemporary:存在于RenderBuffer的垃圾回收中木人,清除臨時(shí)的FreeTexture.?
2.TextRendering.Cleanup:TextMesh的垃圾回收操作?
K. Application.Integrate Assets in Background:?
遍歷預(yù)加載的線程隊(duì)列并完成加載信柿,同時(shí),完成紋理的加載醒第、Substance的Update等.?
L. Application.LoadLevelAsync Integrate:?
加載場(chǎng)景的CPU占用渔嚷,通常如果此項(xiàng)時(shí)間長(zhǎng)的話70%的可能是Texture過長(zhǎng)導(dǎo)致.?
M. UnloadScene:?
卸載場(chǎng)景中的GameObjects、Component和GameManager稠曼,一般用在切換場(chǎng)景時(shí).?
N. CollectGameObjectObjects:?
執(zhí)行上面M項(xiàng)的同時(shí)形病,會(huì)將場(chǎng)景中的GameObject和Component聚集到一個(gè)Array中.然后執(zhí)行下面的Destroy.?
O. Destroy:?
刪除GameObject和Component的CPU占用.?
P. AssetBundle.LoadAsync Integrate:?
多線程加載AwakeQueue中的內(nèi)容,即多線程執(zhí)行資源的AwakeFromLoad函數(shù).?
Q. Loading.AwakeFromLoad:?
在資源被加載后調(diào)用霞幅,對(duì)每種資源進(jìn)行與其對(duì)應(yīng)用處理.
2.GPU Usage
A. Device.Present:?
device.PresentFrame的耗時(shí)顯示漠吻,該選項(xiàng)出現(xiàn)在發(fā)布版本中.?
B. Graphics.PresentAndSync:?
GPU上的顯示和垂直同步耗時(shí).該選項(xiàng)出現(xiàn)在發(fā)布版本中.?
C. Mesh.DrawVBO:?
GPU中關(guān)于Mesh的Vertex Buffer Object的渲染耗時(shí).?
D. Shader.Parse:?
資源加入后引擎對(duì)Shader的解析過程.?
E. Shader.CreateGPUProgram:?
根據(jù)當(dāng)前設(shè)備支持的圖形庫來建立GPU工程.
3. Memory Profiler
A. Used Total:?
當(dāng)前幀的Unity內(nèi)存、Mono內(nèi)存司恳、GfxDriver內(nèi)存途乃、Profiler內(nèi)存的總和.?
B. Reserved Total:?
系統(tǒng)在當(dāng)前幀的申請(qǐng)內(nèi)存.?
C. Total System Memory Usage:?
當(dāng)前幀的虛擬內(nèi)存使用量.(通常是我們當(dāng)前使用內(nèi)存的1.5~3倍)?
D. GameObjects in Scene:?
當(dāng)前幀場(chǎng)景中的GameObject數(shù)量.?
E. Total Objects in Scene:?
當(dāng)前幀場(chǎng)景中的Object數(shù)量(除GameObject外,還有Component等).?
F. Total Object Count:?
Object數(shù)據(jù) + Asset數(shù)量.
4. Detail Memory Profiler
A. Assets:?
Texture2d:記錄當(dāng)前幀內(nèi)存中所使用的紋理資源情況扔傅,包括各種GameObject的紋理耍共、天空盒紋理以及場(chǎng)景中所用的Lightmap資源.?
B. Scene Memory:?
記錄當(dāng)前場(chǎng)景中各個(gè)方面的內(nèi)存占用情況,包括GameObject猎塞、所用資源试读、各種組件以及GameManager等(天般情況通過AssetBundle加載的不會(huì)顯示在這里).?
A. Other:?
ManagedHeap.UseSize:代碼在運(yùn)行時(shí)造成的堆內(nèi)存分配,表示上次GC到目前為止所分配的堆內(nèi)存量.?
SerializedFile(3):?
WebStream:這個(gè)是由WWW來進(jìn)行加載的內(nèi)存占用.?
System.ExecutableAndDlls:不同平臺(tái)和不同硬件得到的值會(huì)不一樣荠耽。
5. 優(yōu)化重點(diǎn)
A. CPU-GC Allow:?
關(guān)注原則:1.檢測(cè)任何一次性內(nèi)存分配大于2KB的選項(xiàng) 2.檢測(cè)每幀都具有20B以上內(nèi)存分配的選項(xiàng).?
B. Time ms:?
記錄游戲運(yùn)行時(shí)每幀CPU占用(特別注意占用5ms以上的).?
C. Memory Profiler-Other:?
1.ManagedHeap.UsedSize: 移動(dòng)游戲建議不要超過20MB.?
2.SerializedFile: 通過異步加載(LoadFromCache钩骇、WWW等)的時(shí)候留下的序列化文件,可監(jiān)視是否被卸載.?
3.WebStream: 通過異步WWW下載的資源文件在內(nèi)存中的解壓版本,比SerializedFile大幾倍或幾十倍,重點(diǎn)監(jiān)視.****?
D. Memory Profiler-Assets:?
1.Texture2D: 重點(diǎn)檢查是否有重復(fù)資源和超大Memory是否需要壓縮等.?
2.AnimationClip: 重點(diǎn)檢查是否有重復(fù)資源.?
3.Mesh: 重點(diǎn)檢查是否有重復(fù)資源.
6. 項(xiàng)目中可能遇到的問題
A. Device.Present:?
1.GPU的presentdevice確實(shí)非常耗時(shí),一般出現(xiàn)在使用了非常復(fù)雜的shader.?
2.GPU運(yùn)行的非陈亮浚快伊履,而由于Vsync的原因,使得它需要等待較長(zhǎng)的時(shí)間.?
3.同樣是Vsync的原因款违,但其他線程非常耗時(shí)唐瀑,所以導(dǎo)致該等待時(shí)間很長(zhǎng),比如:過量AssetBundle加載時(shí)容易出現(xiàn)該問題.?
4.Shader.CreateGPUProgram:Shader在runtime階段(非預(yù)加載)會(huì)出現(xiàn)卡頓(華為K3V2芯片).?
B. StackTraceUtility.PostprocessStacktrace()和StackTraceUtility.ExtractStackTrace():?
1.一般是由Debug.Log或類似API造成.?
2.游戲發(fā)布后需將Debug API進(jìn)行屏蔽.
C. Overhead:?
1.一般情況為Vsync所致.?
2.通常出現(xiàn)在Android設(shè)備上.?
D. GC.Collect:?
原因: 1.代碼分配內(nèi)存過量(惡性的) 2.一定時(shí)間間隔由系統(tǒng)調(diào)用(良性的).?
占用時(shí)間:1.與現(xiàn)有Garbage size相關(guān) 2.與剩余內(nèi)存使用顆粒相關(guān)(比如場(chǎng)景物件過多插爹,利用率低的情況下哄辣,GC釋放后需要做內(nèi)存重排)?
E. GarbageCollectAssetsProfile:?
1.引擎在執(zhí)行UnloadUnusedAssets操作(該操作是比較耗時(shí)的,建議在切場(chǎng)景的時(shí)候進(jìn)行).?
2.盡可能地避免使用Unity內(nèi)建GUI请梢,避免GUI.Repaint過渡GC Allow.?
3.if(other.tag == GearParent.MogoPlayerTag)改為other.CompareTag(GearParent.MogoPlayerTag).因?yàn)閛ther.tag為產(chǎn)生180B的GC Allow.?
F. 少用foreach,因?yàn)槊看蝔oreach為產(chǎn)生一個(gè)enumerator(約16B的內(nèi)存分配)力穗,盡量改為for.?
G. Lambda表達(dá)式毅弧,使用不當(dāng)會(huì)產(chǎn)生內(nèi)存泄漏.?
H. 盡量少用LINQ:?
1.部分功能無法在某些平臺(tái)使用.?
2.會(huì)分配大量GC Allow.?
I. 控制StartCoroutine的次數(shù):?
1.開啟一個(gè)Coroutine(協(xié)程),至少分配37B的內(nèi)存.?
2.Coroutine類的實(shí)例 — 21B.?
3.Enumerator — 16B.?
J. 使用StringBuilder替代字符串直接連接.?
K. 緩存組件:?
1.每次GetComponent均會(huì)分配一定的GC Allow.?
2.每次Object.name都會(huì)分配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