Notifications
Article
Profiler深挖-Memory面板(5)
Published 2 years ago
1.9 K
2
Memory
如下图所示,内存面板中记录着每一帧内存的分配情况。大致分为游戏内存、Mono堆内存、显存,游戏内存又会分为若干个。
先来看上半部分左侧面板
1)Total Allocated:总内存使用量。
2)Texture Memory:总纹理内存使用量。
3)Mesh Memory:总网格内存使用量。
4)Material Count:总材质的数量。
5)Object Count:总Object对象的数量。
6)Total GC Allocated:总堆内存的大小。
7)GC Allocated:当前这一帧堆内存的分配情况。
通过这个面板我们可以看出当前这一帧的内存使用情况,如果内存出现跳动就可以对比两帧仔细看看哪里出了问题,如:贴图、网格、材质的数量是否发生快速增加?或者堆内存只增加不减少等情况一目了然。
这只是一个大致内存信息,接着我们在看下面面板中的内容,会展示更详细的内存。
信息:
Used Total: 0.64 GB Unity: 0.60 GB Mono: 10.3 MB GfxDriver: 36.1 MB Audio: 1.2 MB Video: 1.0 KB Profiler: 1.6 MB
Reserved Total: 0.52 GB Unity: 463.3 MB Mono: 14.8 MB GfxDriver: 36.1 MB Audio: 1.2 MB Video: 1.0 KB Profiler: 16.0 MB
Total System Memory Usage: 0 B
1)UsedTotal:表示当前使用量。包括Unity当前使用内存、堆内存、显存、音频内存、视频内存、Profiler自身内存。
2)Mono堆内存:这是个非常重要的东西,不严谨的编码习惯就产生大量的垃圾堆内存,而且还有可能内存泄漏,详细内容我打算后面详细来说。
3)GfxDriver显存:通过名字可以看出它属于显卡驱动。还记得之前文章我们讲过CPU需要将网格信息计算好一次提交给 CPU吗?为了让显卡能得到正确的数据,需要将顶点数据,VBO、IBO等数据存入,还有纹理也需要存入,这些都需要保 存在显存中。如果这个值比较大重点查一下CPU往GPU提交的数据,在Proifiler中能看到它。
4)Reserved Total:表示系统保留内存。比如运行游戏一开始就将内存撑到了500M,接着很快又回落到了200M,但是系统并没有立即将多余的300M内存回收而是作为应用程序的保留内存方便后面再次使用。假如没有Reserved内存,那么应用程序就要频繁与物理内存打交道(申请/释放),这样从效率和性能考虑都不是最好,所以Reserved内存也可以作为一个缓冲来为应用程序服务。我们要做的以及能做的就是想进一切办法降低UsedTotal的内存情况。
接着往下看:
1)Textures: 312 / 37.2 MB 贴图的使用数量/贴图占用的内存大小
2)Meshes: 76 / 1.9 MB 网格的使用数量/网格占用的内存大小
3)Materials: 48 / 76.0 KB 材质的使用数量/材质占用的内存大小
4)AnimationClips: 0 / 0 B 动画的使用数量/动画占用的内存大小
5)AudioClips: 0 / 0 B 音频的使用数量/音频占用的内存大小
6)Assets: 2309 资源总数量
7)GameObjects in Scene: 13 当前场景游戏对象的数量
8)Total Objects in Scene: 286 总对象在场景中的数量,游戏对象也是对象的一种。
9)Total Object Count: 2595 总对象在内存中的数量
10)GC Allocations per Frame: 354 / 18.0 KB 当前帧分配的堆内存大小
以上信息基本已经能看出当前这个游戏的内存使用的大致情况,Unity还提供了查看更为详细内存的方法。如下图所示。
首先在左上角下拉框选择Detailed表示查看详细信息,然后点击右边Take Sample Editor按钮,来截取当前这一帧的详细内存信息。
1)Othter : 其他内存,也就是不知道放在哪个归类里的内存就放在Other里了。
2)Assets:原生代码所引用的资源内存,这里的内容也是需要我们终点排查的,例如,Texture、Mesh等。
3)Not Saved:被标记了Not Saved的资源,也就是不会被保存文件的资源。
4)Builtin Resources:Unity内置的资源。
5)Scene Memory :当前场景的内存资源,比如游戏对象和游戏组件。
注意在Take Sample Editor按钮的右边有一个Gather object references的按钮,如果勾选则表示是否展示引用数量,也就是右边的Ref count值了。
再往右有一段话 Memory usage in the Editor is not same as it would be in a player 。意思就是,在编辑器Profiler看到的内存,并不等价于真机Profiler看到内存,大致原因如下。
1)编辑器代码中会有一些 #if UNITY_EDITOR宏标记,或者if(Application.isEditor)无论是我们自己的代码还是引擎内部可能都会用,这样就会导致某些代码和真机环境不一致,内存自然也就会不一致了。
2)编辑器可能换存了某些资源,比如在Project窗口中选择一个贴图或者网格资源等,那么此时Unity编辑器就会缓存这个资源, Profiler就会认定被内存占用了。
3)一些引擎内部的不确定性,Unity是个大黑盒谁知道内存干了啥~
所以说要想Profiler看的比较准确,一定要连上真机看!一定要连上真机看!一定要连上真机看!如果觉得打手机包比较麻烦这里提供两个思路。
1)打PC包,用PC包连Profiler比较方便。
2)打开Unity以后不要点击任何游戏资源,也不要点任何东西,直接播放游戏Ctrl+7呼出 Profiler菜单,只有第一次查看内存才是比较准确的。取消播放后如果想再次播放游戏,要把Unity大退一下重新打开Unity执行上述步骤。
3)定期还是要打手机包来查看Profiler
如下图所示,我们可以看到每个资源被应用的次数以及被那里引用了。比如查内存泄漏,需要对比2帧看看那些应该卸载的资源,但是没有被正确卸载,那么一定是被内存那里引用了。
总体来说这个查内存泄漏还是有点不方便的,如果真想查内存泄漏可以使用MemeryProfiler,以及最近才出来的Profiler Analyzer。
Tags:
雨松MOMO
程序员 - Programmer
17
Comments
w
wangxiong
a year ago
期待写一篇关于新的MemeryProfiler的使用介绍
0
Wu Xiaomu
a year ago
Programmer
为了CJ门票和外滩之夜门票和Unity周边!
0