【经验】使用Profiler工具分析内存占用情况
Unity3D为我们提供了一个强大的性能分析工具Profiler。今天我们就使用Profiler来具体分析一下官方样例AngryBots的内存使用信息数据。
首先打开Profiler选择Memory选项。在游戏执行的某一帧查看Detailed选项数据(Simple模式的数据非常直观。能够知道内存大体被哪部分占用了,网上也有非常多相关介绍,我就不再啰嗦了)。例如以下图所看到的:
选中后,unity会自己主动获取这一帧的内存占用数据项,主要分为:Other、Assets、BuiltinResources、Scene Memory、NotSaved这五大部分,以下我们就来一一分析。
- Other
记录数据项非常多,篇幅时间有限,我们就专挑占用大小排行榜靠前的几项来具体分析吧。
- System.ExecutableAndDlls:系统可运行程序和DLL。是仅仅读的内存,用来运行全部的脚本和DLL引用。不同平台和不同硬件得到的值会不一样,能够通过改动Player Setting的Stripping
Level来调节大小。
Ricky:我试着改动了一下Stripping Level似乎没什么改变,感觉虽占用内存大但不会影响游戏执行。
我们临时忽略它吧(- -)!
- GfxClientDevice:GFX(图形加速\图形加速器\显卡 (GraphicsForce Express))client设备。
Ricky:虽占用较大内存。但这也是必备项。没办法优化。继续忽略吧(- -)!!
- ManagedHeap.UsedSize:托管堆使用大小。
Ricky:重点监控对象,不要让它超过20MB。否则可能会有性能问题!
- ShaderLab:Unity自带的着色器语言工具相关资源。
Ricky:这个东西大家都比較熟悉了,忽略它吧。
- SerializedFile:序列化文件,把显示中的Prefab、Atlas和metadata等资源载入进内存。
Ricky:重点监控对象。这里就是你要监控的哪些预设在序列化中在内存中占用大小,依据需求进行优化。
- PersistentManager.Remapper:持久化数据重映射管理相关
Ricky:与持久化数据相关,比方AssetBundle之类的。注意监控相关的文件。
- ManagedHeap.ReservedUnusedSize:托管堆预留不使用内存大小。仅仅由Mono使用。
Ricky:无法优化。
- Assets
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">
- Texture2D: 2D贴图及纹理。
Ricky:重点优化对象,有下面几点能够优化:
- 很多贴图採用的Format格式是ARGB 32 bit所以保真度非常高但占用的内存也非常大。
在不失真的前提下。适当压缩贴图,使用ARGB 16 bit就会降低一倍,假设继续Android採用RGBA Compressed ETC2 8 bits(iOS採用RGBA Compressed PVRTC 4 bits),又能够再降低一倍。把不须要透贴但有alpha通道的贴图,全都转换格式Android:RGB
Compressed ETC 4 bits,iOS:RGB Compressed PVRTC 4 bits。 - 当载入一个新的Prefab或贴图,不及时回收,它就会永驻在内存中,就算切换场景也不会销毁。
应该确定物体不再使用或长时间不使用就先把物体制空(null),然后调用Resources.UnloadUnusedAssets(),才干真正释放内存。
- 有大量空白的图集贴图,能够用TexturePacker等工具进行优化或考虑合并到其它图集中。
- AudioManager:音频管理器
Ricky:随着音频文件的增多而增大。
- AudioClip:音效及声音文件
Ricky:重点优化对象,播放时长较长的音乐文件须要进行压缩成.mp3或.ogg格式。时长较短的音效文件能够使用.wav 或.aiff格式。
- Cubemap:立方图纹理
Ricky:这个一般在天空盒中比較常见,我也不知道怎样优化这个。。。
- Mesh:模型网格
Ricky:主要检查是否有反复的资源。还有尽量降低点面数。
- Scene Memory
- Mesh:场景中使用的网格模型
Ricky:注意网格模型的点面数。能合并的mesh尽量合并。
- Builtin Resources
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">
Ricky:这些都是Unity的一些内部资源,对于项目内存没有什么分析价值,所以我就临时不正确其进行分析了。
- Profiler内存重点关注优化项目
1)ManagedHeap.UsedSize: 移动游戏建议不要超过20MB.
2)SerializedFile: 通过异步载入(LoadFromCache、WWW等)的时候留下的序列化文件,可监视是否被卸载.
3)WebStream: 通过异步WWW下载的资源文件在内存中的解压版本号,比SerializedFile大几倍或几十倍。只是我们如今项目中展示没有。
4)Texture2D: 重点检查是否有反复资源和超大Memory是否须要压缩等.
5)AnimationClip: 重点检查是否有反复资源.
6)Mesh: 重点检查是否有反复资源.
- 项目中可能遇到的问题
1.Device.Present:
1)GPU的presentdevice确实很耗时,一般出如今使用了很复杂的shader.
2)GPU执行的很快,而因为Vsync的原因,使得它须要等待较长的时间.
3)相同是Vsync的原因,但其它线程非常耗时,所以导致该等待时间非常长,比方:过量AssetBundle载入时easy出现该问题.
4)Shader.CreateGPUProgram:Shader在runtime阶段(非预载入)会出现卡顿(华为K3V2芯片).
5)StackTraceUtility.PostprocessStacktrace()和StackTraceUtility.ExtractStackTrace(): 通常是由Debug.Log或类似API造成,游戏公布后需将Debug API进行屏蔽。
2.Overhead:
1)普通情况为Vsync所致.
2)通常出如今Android设备上.
3.GC.Collect:
原因:
1)代码分配内存过量(恶性的)
2)一定时间间隔由系统调用(良性的).
占用时间:
1)与现有Garbage size相关
2)与剩余内存使用颗粒相关(比方场景物件过多。利用率低的情况下,GC释放后须要做内存重排)
4.GarbageCollectAssetsProfile:
1)引擎在运行UnloadUnusedAssets操作(该操作是比較耗时的,建议在切场景的时候进行)。
2)尽可能地避免使用Unity内建GUI。避免GUI.Repaint过渡GCAllow.
3)if(other.tag == a.tag)改为other.CompareTag(a.tag).由于other.tag为产生180B的GC Allow.
4)少用foreach,由于每次foreach为产生一个enumerator(约16B的内存分配)。尽量改为for.
5)Lambda表达式,使用不当会产生内存泄漏.
5.尽量少用LINQ:
1)部分功能无法在某些平台使用.
2)会分配大量GC Allow.
6.控制StartCoroutine的次数:
1)开启一个Coroutine(协程),至少分配37B的内存.
2)Coroutine类的实例 -> 21B.
3)Enumerator -> 16B.
7.使用StringBuilder替代字符串直接连接.
8.缓存组件:
1)每次GetComponent均会分配一定的GC Allow.
2)每次Object.name都会分配39B的堆内存.
Ricky Yang个人原创,版权全部,转载注明,谢谢。
http://blog.csdn.net/yangyy753
【经验】使用Profiler工具分析内存占用情况的更多相关文章
- Java程序内存分析:使用mat工具分析内存占用
国内私募机构九鼎控股打造APP,来就送 20元现金领取地址:http://jdb.jiudingcapital.com/phone.html内部邀请码:C8E245J (不写邀请码,没有现金送)国内私 ...
- Android使用procrank和dumpsys meminfo 、top分析内存占用情况
如果你想查看所有进程的内存使用情况,可以使用命令procrank.dumpsys meminfo查看,当然也只可以过滤出某个进程如:dumpsys meminfo | grep -i phone 先来 ...
- 通过JDK常用工具监控Java进程的内存占用情况
目录 1 JDK 工具的使用 2 查看 GC 日志信息 3 添加 JMS 远程监控 Tomcat是一款常用的Web容器, 它是运行在 JVM(Java Virtual Machine) 中的一个Jav ...
- JVM内存占用情况深入分析
内存分布 首先,列举一下一个JVM进程主要占用内存的一些地方: Young Old metaspace java thread count * Xss other thread count * sta ...
- 阿里云下 centos7下启动程序总是被killed ,看内存占用情况以检查哪些服务存在问题并调整参数作调优
很久不搭理自己的网站了,几天突然发现启动程序总是被killed, 于是查看了系统日志 vi /var/log/messages 发现出现 kernel: Out of memory: Kill pro ...
- [PHP] 循环查看php-fpm的内存占用情况
在webmail的业务中进行发信,如果携带了附件,会把附件拼接内嵌到邮件正文里,这时会极大的占用内存,可以使用以下命令查看fpm的进程内存占用 ps --no-headers --sort -rss ...
- 查看LINUX进程内存占用情况
可以直接使用top命令后,查看%MEM的内容.可以选择按进程查看或者按用户查看,如想查看oracle用户的进程内存使用情况的话可以使用如下的命令: (1)top top命令是Linux下常用的性能分析 ...
- 查看LINUX进程内存占用情况(转)
可以直接使用top命令后,查看%MEM的内容.可以选择按进程查看或者按用户查看,如想查看oracle用户的进程内存使用情况的话可以使用如下的命令: (1)top top命令是Linux下常用的性能分析 ...
- Linux-进程内存占用情况
可以直接使用top命令后,查看%MEM的内容.可以选择按进程查看或者按用户查看,如想查看oracle用户的进程内存使用情况的话可以使用如下的命令: (1)top top命令是Linux下常用的性能分析 ...
随机推荐
- php 备份数据库代码(生成word,excel,json,xml,sql)
单表备份代码: 复制代码代码如下: <?php class Db { var $conn; function Db($host="localhost",$user=" ...
- POJ 3368:Frequent values(线段树区间合并)
题目大意,给出一段非降序列,求一些区间中出现频率最高的数的出现次数. 分析: 显然,区间中一个数多次出现必然是连续的,也就是最长的连续相等的一段. 用线段树解决,维护三个信息:一个区间最长连续的区间的 ...
- FreeBSD查看带宽占用情况,CPU,硬盘IO 虚拟内存等命令
FreeBSD查看带宽占用情况,CPU,硬盘IO 虚拟内存等命令 来源 https://www.liurongxing.com/freebsd-tips.html 来源 http://blog.51c ...
- Testlink集成Jira时如果出现Error咋办?
TestLink在用SOAP集成Jira时,如果出现: SOAP Fault: (code: WSDL, string: SOAP-ERROR: Parsing WSDL: Couldn't load ...
- java根据开始时间结束时间计算中间间隔日期
public static void main(String[] args) throws Exception { String beginDate = "2016-07-16"; ...
- 有关MongoDB数据库设计的问题
问题一:是否collection越少越好,尽量把关系数据库中分表表示的关系嵌套进文档里?问题二:如果这样的话,一句SQL能搞定的复杂查询,mongodb也许要查询多次.mongodb的查询速度是否还比 ...
- python 对比两个字典的差异
实际遇到的问题逻辑很繁杂,就不全写了.最后是通过对比两个字典差异来解决的.找出两个字典的差异,可参考以下代码. dict1 = {'a':1,'b':2,'c':3,'d':4} dict2 = {' ...
- IOS 滑动指示导航栏 渐变
关于导航栏渐变,本人在写APP的时候,发现了各路大神各现其通,其实我觉得这个是个很简单的问题,不需要搞得那么麻烦,对个项目要求整齐来说,一般会建一个工具类,自定义View,各个同事需要的时候,直接调用 ...
- HDOJ-1671 Phone List
Phone List Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Probl ...
- updatepanel中使用alert弹出框方法
原文发布时间为:2009-05-17 -- 来源于本人的百度文章 [由搬家工具导入] ScriptManager.RegisterStartupScript(this.UpdatePa ...