自定义内存分析器Go-Profiler该如何实现?

发表于2016-11-10
评论3 2.9k浏览
  我来赶个末班车吧,用近一个月的闲暇时间做了自定义内存Profiler:Go-Profiler终于完工了,好像大多数时间都浪费在了坑Unity Serialization。。。之前对我的Go-Profiler有所了解的同学,可以直奔Github链接:https://github.com/MelodySo/Go-Profiler,现在可以给Go-Profiler来一发Star了吗?
  而对于懒人同学,可以在阅读本文后移步文末的zip文件的链接,解压即用。

Go-Profiler的由来:
  做Go-Profiler最主要的初衷,就是我们终于可以在Unity里面DIY一个属于自己的Memory Profiler。每当我们在进行新的一轮内存分析时,经常需要先获得一个内存的大概分布情况,然后对所获取到的所有资源进行细分类,其中很多的事情是人工人肉,一个个来计算的,这样对开发效率造成了很大影响。获取到所有资源的name之后,我们可以根据正则表达式来对其进行过滤,达到细分类的效果。
  还有一个很重要的原因,就是想通过这种方式达到抛砖引玉的效果,希望大家可以也自己动手做一个MemoryProfiler工具,或者Fork我的Go-Profiler然后做一些Contributions。
  Unity的Memory Profiler是图形结构,看起来很不方便,而且没有像Unity自带Profiler那样,对资源进行大分类:Assets,SceneMemory,BuiltinResources,Not Saved。 


  Unity的自带Profier虽然是树形结构,但是我们从中所获取到的信息量有限,而且不可以像Go-Profiler一样自定义扩展,不支持细分类。


  而这是我们的Go-Profiler:




  是的,发现什么了吗?Texture2D/UI   Texture2D/Cloth  Animation/eff   Animation/npc,这些结点是可以通过你自己定义的正则表达式来进行过滤的!这就是Go-Profiler的魅力所在!你还在人肉分类吗?low爆了!!!
  所以,你现在明白什么是Go-Profiler了吗?
  Go-Profiler是:将Unity自带Profiler和Memory Profiler的优势集于一身的,可以根据正则表达式来进行细分类的,支持可配置过滤文件的,功能虽少但是可以帮助开发者在内存分类总结阶段来节省分类时间的内存Profiler工具!
  由于闲暇时间不足,以及个人能力有限,Go-Profiler现版本有一些需要改进之处以及Bug,不过没有大的影响:
1、 计数的Count现在会有点bug
2、有些Foldout元素文字过长,图片会变成小图标,以后可能会分开绘制
3、Unity Editor会报一个错误,该错误目前可以忽略掉,其实可以把它当作一个警告来对待,我们这里的序列化目前来看还没有出现问题,该报错原因我已经弄清楚,以后我可以再发一贴说明一下这个序列化相关的问题,并且将这个可恶的警告移除。
  Serialization depth limit exceeded at 'GoProfiler::PackedItemNode'. There may be an object composition cycle in one or more of your serialized classes.
4、目前需要配合Unity自带Profiler来切换当前的设备,时间有限还没有做切换的逻辑。
5、目前还没有做RefCount功能,以及引用列表功能。
6、和MemoryProfiler一样可以有一个ObjectField,但是仅在编辑器下有效。
7、目前仅支持Unity memory,暂不支持对于Mono堆的内存,以后会继续补上。
8、MemoryFilterSettings目前还没有做序列化到xml/plist的功能,所以右边那两个按钮是花瓶。
9、MemoryFilterSettings的Inspector下,目前没有对不同的ClassID做限制,所以在配置时请注意不要配置相同的ClassID,以后会完善。

特性:
  大多数功能和MemoryProfiler一样,支持本地读/写序列化文件,支持各个平台(需要配合Unity自带Profiler来切换平台)。
Go-Profiler本身的特性,包括:
1、根据物体名字和正则表达式来细分类内存。
2、 树形结构EditorWindow,这个设计参照了Unity自带的Profiler的Memory Detailed界面。
3、将分类加上了可爱的小图标。
4、支持Selection (和其他两种Profiler一样,当然也是Editor Only)。
5、增加了ClearEditorReferences按钮,经常在编辑器下追踪内存的你们懂的。
6、 增加了刷新按钮和刷新功能。
7、对资源进行大分类:Assets,SceneMemory,BuiltinResources,Not Saved。

使用说明:
  使用方法和Unity的MemoryProfiler一样,拿来即用没有任何区别,点击Window -> Go-Profiler即可弹出Go-Profiler Window,甚至序列化读/写文件的方式也是一样的。所以可以做到.memsnap文件可以共用。对于MemoryProfiler的使用方法,时间有限,本文暂不赘述。
  这里简要说明一下,如何使用正则表达式对资源进行细分类:
定位到Assets/GoProfiler/Editor/MemoryFilterSettings

        


  如上图所示:先选择一个ClassID,然后配置key和RegexList正则表达式到里面就好了,这里给对不了解正则表达式的同学简单扫个盲:
  可以去网站测试正则表达式的正确性:http://tool.oschina.net/regex
  . *代表任意个任意字符
  . 代表任意单个字符
  d 代表数字
  d{5} 代表5个连续数字
  [0-9]  数字也可以用这样表示,当然范围也可选
  ^Atlas.* 代表以Atlas开头。
  .*Hero$ 代表以Hero结尾。
  .*_MT_.* 代表中间含有 _MT_
  至于正则表达式更多的用法,请移步:http://www.regexlab.com/zh/regref.htm,本文只起到抛砖引玉的作用。
  配置好该MemoryFilterSettings后,确认在Go-Profiler的MemoryFilterSettings下面选中了该MemoryFilterSettings。当然你也可以配置多份MemoryFilterSettings。
时间有限,突然发现我好像忘记写一个Create MemoryFilterSettings的按钮接口了,没关系你可以转到Windows资源管理器(Mac的Finder)拷贝粘贴一份新的MemoryFilterSettings.asset文件,然后取个其他名字就好了。
  内存总结时,按照Go-Profiler的内存分布,来画一份脑图就好啦![3]
[1] Unity的MemoryProfiler可以在这里找到,一起用效果更佳哦,毕竟Go-Profiler目前的功能还是很粗糙:https://bitbucket.org/Unity-Technologies/memoryprofiler
[2] Go-Profiler 可以直接点击下载,Github对Release文件格式有限制,所以解压后还是个unitypackage:https://github.com/MelodySo/Go-Profiler/files/583982/Go-Profiler.zip
[3] 百度也做过好事,这里对需要画脑图来进行内存总结的同学安利一下百度脑图:http://naotu.baidu.com

如社区发表内容存在侵权行为,您可以点击这里查看侵权投诉指引