在使用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. Entity framework 生成的SQL如何设置兼容低版本的数据(转载)

    来源:https://q.cnblogs.com/q/84401/ 右键 edmx 文件,有xml方式打开. 将ProviderManifestToken 改为 2008 .

  2. Python学习日记(二十三) 类命名空间和组合

    类命名空间 在一个类中它的函数(方法)属于动态属性,直接定义的变量属于静态属性 首先先定义一个类,并在这个类里面加入静态变量.属性等然后将一个对象实例化 class Fighter: #定义一个战机的 ...

  3. Django图书管理系统(前端对有外键的数据表增删改查)

    图书管理 书籍管理 book name 项目源码位置:https://gitee.com/machangwei-8/learning_materials/tree/master/%E9%A1%B9%E ...

  4. git---怎样将分支上的一个单文件合并到主分支上(master)

    一.首先切换到主分支  注意将分支上的数据全部提交 以免造成数据冲突或丢失 git checkeout master 二.选择要合并的文件 git checkout --patch 分支名称  要合并 ...

  5. Linux 永久改变系统时间

    Centos系统,必须同时修改系统时间和硬件时间,才可以保证修改有效,单纯的使用date命令修改系统时间,是立即生效,重启后系统还原.具体操作如下: 1.date {查看目前本地的时间}2.hwclo ...

  6. 牛客NOIP暑期七天营-提高组1 解题报告

    https://ac.nowcoder.com/acm/contest/920#question A 构造+双指针 发现m的限制是1e5,而点数是5e4,所以不能构造太多的边,思考一下最短路树的定义. ...

  7. linux下svn的使用

    环境搭建: yum install subversion       yum安装svn服务 svn --version 检查是否安装 cd /usr/local/svn/conf 找到conf 文件 ...

  8. 04 c++中的友元

    c++中的类具有封装性,类中的私有数据只有该类的成员函数可以访问,程序中访问类中的私有成员,必须通过对象来调用成员函数,但是频繁的调用会使运行效率降低. 为了解决上述问题,c++中加入友元机制,友元可 ...

  9. 解决jdbc向数据库存入数据出现乱码的情况

    解决办法 1.修改项目的编码,建议统一使用utf-8来实现,这样整个项目就是utf-8. 2.jdbc:mysql://locathost:3306/数据库名称?useUnicode=true& ...

  10. machine learning (7)---normal equation相对于gradient descent而言求解linear regression问题的另一种方式

    Normal equation: 一种用来linear regression问题的求解Θ的方法,另一种可以是gradient descent 仅适用于linear regression问题的求解,对其 ...