在使用Unity开发游戏的过程中,借助Profiler来分析内存使用状况是至关重要的。但许多开发者可能还对Profiler中各项数据表示的含义不甚明确,今天我们Unity官方的技术工程师柳振东,将针对Profiler内存分析相关的问题及解答,与大家进行分享。

要想完全发挥Profiler内存分析的威力,首先要做的就是了解Profiler展示的数据所表达的含义,以及到底哪些模块所使用的内存才会被统计到Unity的Profiler中。Profiler涉及到的知识点还有很多,我们今天先从中挑选一些大家常有的疑问来作解答。

1.    在Unity的Profiler中看到的总内存使用和我使用其它工具看到的系统内存占用不太一样,这是为什么呢?

Profiler中看到的内存是通过Unity自身引擎看到的内存分配,凡是引擎Allocation和Deallocation的内存,引擎均有记录,所以我们可以给出确切的引擎内存占用信息。但是,仍有其他内存我们是无法获知的。
比如,如果引擎使用了第三方库,那么库分配的内存我们是无法进行统计的。另外,在移动设备上大家看到的内存,其实都要比Profiler大很多,这是因为不管是通过Xcode的Instrument还是通过Android的USS,其记录的真实物理内存都包括两部分,一个是真实Used的物理内存,另一个则是缓存的(Cached)的物理内存。这是OS所决定的,Android和iOS系统在资源不使用时均不会立即将其进行回收,而是将其放在缓存的物理内存中,以便下次再用时,可以快速地加载。当系统发现App的内存不够用时,才会在底层调用一个memory killer线程来轮询缓存物理内存,进而为app来清理内存。而Unity Profiler记录的则是目前真实使用的物理内存,即上述所说的第一部分。因此,当游戏运行时间越长,Profiler分配内存和通过其他软件获得的系统内存差距会越大。
因此,只要所使用的第三方库不存在内存泄露问题,我们一般都建议只需要查看Profiler即可,只要Profile中的内存可以保证正常升高和回落,那么引擎这边分配的内存就是没有问题的。
2.    我们做项目的时候发现有时profiler中System.ExecutableAndDlls这项占用很多,有什么解决办法吗?
“System.ExecutableAndDlls”该项显示的是执行文件和所调用的库(物理、渲染、IO等系统库)的总和。请不用担心该选项的数值,因为很多Application均在共用这些库,并且它对于真实游戏的内存压力非常小,而且也不会导致OS因为该内存来Kill掉游戏。
3.    为什么在Profiler中的Simple模式下,Used Total的数值不等于其右边各项Unity,Mono,GfxDriver,FMOD与Profiler总和呢?
其实在Unity中,Used Total的计算公式为Used Total = Unity + Mono + GfxDriver + Profiler + additionalUsedMemory。公式中的additionalUsedMemory项在profiler中并没有显示,因为这一项一般情况下都为0,只在某些特殊发布平台下才会有数值(一般Android,PC和IOS都为0)。因此一般情况下Used Total的值就是除FMOD之外各项的总和了。当然,这个规则对于Reserved Total是同样适用的。
4.    我们项目的资源主要使用AssetBundle动态加载资源,发现Profiler中Detailed模式下PersistentManager.Remapper一项占用时多时少,这一项主要是做什么的呢?
Remapper主要提供文件的持久化存储,包括各种序列化的asset,项目的setting文件等,维护文件系统的中的文件与内存中数据的对应关系。那么如果项目大量使用AssetBundle的话,在对AssetBundle进行Unload之前都会需要占用Remapper的内存的。而Remapper本身的实现使用内存池,其数值只会增大,那么为了使Remapper占用的内存保持在一个稳定的数值上,我们需要每次在加载一定数量的AssetBundle之后进行Unload操作,而不要一次性把所有AssetBundle都加载后才调用Unload。(这样的操作对维持整个mono heap的大小也是至关重要的,因为mono heap本身也是只增大不减小的)
5.     我们在Editor中调试项目的时候发现纹理的内存大小是其本身大小的两倍,是因为Unity把内存和显存的大小都计算进去了吗?
其实并不是这个原因,因为Editor本身会保有纹理的一份内存,在Editor下进行profiler会把Editor本身所使用的纹理大小也计算进去,因此会有内存变为两倍的情况。我们官方并不建议在Editor下对项目进行性能调试,而是务必要在真机上跑编译好的项目,然后连接profiler进行调试,只有这样才能得到真正精确的测试数据。
原文地址:http://forum.china.unity3d.com/thread-16622-1-1.html

详解Unity Profiler内存分析问题的更多相关文章

  1. Android应用AsyncTask处理机制详解及源码分析

    1 背景 Android异步处理机制一直都是Android的一个核心,也是应用工程师面试的一个知识点.前面我们分析了Handler异步机制原理(不了解的可以阅读我的<Android异步消息处理机 ...

  2. Java SPI机制实战详解及源码分析

    背景介绍 提起SPI机制,可能很多人不太熟悉,它是由JDK直接提供的,全称为:Service Provider Interface.而在平时的使用过程中也很少遇到,但如果你阅读一些框架的源码时,会发现 ...

  3. Spring Boot启动命令参数详解及源码分析

    使用过Spring Boot,我们都知道通过java -jar可以快速启动Spring Boot项目.同时,也可以通过在执行jar -jar时传递参数来进行配置.本文带大家系统的了解一下Spring ...

  4. 【转载】Android应用AsyncTask处理机制详解及源码分析

    [工匠若水 http://blog.csdn.net/yanbober 转载烦请注明出处,尊重分享成果] 1 背景 Android异步处理机制一直都是Android的一个核心,也是应用工程师面试的一个 ...

  5. 线程池底层原理详解与源码分析(补充部分---ScheduledThreadPoolExecutor类分析)

    [1]前言 本篇幅是对 线程池底层原理详解与源码分析  的补充,默认你已经看完了上一篇对ThreadPoolExecutor类有了足够的了解. [2]ScheduledThreadPoolExecut ...

  6. Unity Profiler 性能分析

    Profiler窗口 1. CPU A. WaitForTargetFPS:       Vsync(垂直同步)功能所,即显示当前帧的CPU等待时间    B. Overhead:       Pro ...

  7. SpringMVC异常处理机制详解[附带源码分析]

    目录 前言 重要接口和类介绍 HandlerExceptionResolver接口 AbstractHandlerExceptionResolver抽象类 AbstractHandlerMethodE ...

  8. Linux 链接详解----静态链接实例分析

    由Linux链接详解(1)中我们简单的分析了静态库的引用解析和重定位的内容, 下面我们结合实例来看一下静态链接重定位过程. /* * a.c */ ; void add(int c); int mai ...

  9. HTTP协议详解之http请求分析

    当今web程序的开发技术真是百家争鸣,ASP.NET, PHP, JSP,Perl, AJAX 等等. 无论Web技术在未来如何发展,理解Web程序之间通信的基本协议相当重要, 因为它让我们理解了We ...

随机推荐

  1. springboot启动后执行一段代码的方式

    文章转载自: https://www.cnblogs.com/zuidongfeng/p/9926471.html https://blog.csdn.net/zknxx/article/detail ...

  2. django.core.exceptions.ImproperlyConfigured: SQLite 3.8.3 or later is required (found 3.7.17)

    https://blog.csdn.net/qq_39969226/article/details/92218635

  3. D3.js画思维导图(转)

    思维导图的节点具有层级关系和隶属关系,很像枝叶从树干伸展开来的形状.在前面讲解布局的时候,提到有五个布局是由层级布局扩展来的,其中的树状图(tree layout)和集群图(cluster layou ...

  4. 浅析MySQL使用 GROUP BY 分组聚合与细分聚合

    原创文章,转载请注明出处:http://www.cnblogs.com/weix-l/p/7521278.html: 若有错误,请评论指出,谢谢! 1. 聚合函数(Aggregate Function ...

  5. 【DRF框架】认证组件

    DRF框架的认证组件 核心代码:       self.perform_authentication(request)  框架自带模块:    from rest_framework import a ...

  6. 百度云服务器CentOs6.8安装gnome图形化界面并通过VNC远程访问

    一:安装gnome桌面 利用xshell 登陆上远程主机 依次执行下列命令: [root@lys]#yum groupinstall -y "X Window System" [r ...

  7. K8S集群证书已过期且etcd和apiserver已不能正常使用下的恢复方案

    在这种比较极端的情况下,要小心翼翼的规划和操作,才不会让集群彻底死翘翘.首先,几个ca根证书是10年期,应该还没有过期.我们可以基于这几个根证书,来重新生成一套可用的各组件认证证书. 前期,先制定以下 ...

  8. php最快测试环境建立

    win下待验证,但linux下真快. 不要nginx,不要php-fpm,就一个字,快! 1, 安装php yum install php 输出如下: Dependencies Resolved == ...

  9. 51nod 1657 电子龟

    电子龟的行动,是沿着直线左右走动的.他能够接受两种指令,“T”(向后转,即如果面向左,改成向右:否则就向左)和“F”(向当前面朝的方向往前移动一个单位距离). 现在给出一串指令,让电子龟来执行.你必须 ...

  10. 优化MyEclipse编译速度慢的问题、build、project clean 慢

    优化MyEclipse编译速度慢的问题(重点是1) 1 .关闭MyEclipse的自动validation windows > perferences > myeclipse > v ...