详解Unity Profiler内存分析问题

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

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

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掉游戏。code

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进行调试,只有这样才能获得真正精确的测试数据。

相关文章
相关标签/搜索