本文共 2211 字,大约阅读时间需要 7 分钟。
在使用Unity开发游戏的过程中,借助Profiler来分析内存使用状况是至关重要的。但许多开发者可能还对Profiler中各项数据表示的含义不甚明确,今天我们Unity官方的技术工程师柳振东,将针对Profiler内存分析相关的问题及解答,与大家进行分享。 要想完全发挥Profiler内存分析的威力,首先要做的就是了解Profiler展示的数据所表达的含义,以及到底哪些模块所使用的内存才会被统计到Unity的Profiler中。Profiler涉及到的知识点还有很多,今天先从中挑选一些大家常有的疑问来作解答。
Profiler中看到的内存是通过Unity自身引擎的内存分配,凡是引擎分配和释放的内存,引擎均有记录,所以我们可以给出确切的引擎内存占用信息。但是,仍有其他内存我们是无法获知的。
“System.ExecutableAndDlls”该项显示的是执行文件和所调用的库(物理、渲染、IO等系统库)的总和。请不用担心该选项的数值,因为很多Application均在共用这些库,并且它对于真实游戏的内存压力非常小,而且也不会导致系统因为该内存来Kill掉游戏。
其实在Unity中,Used Total的计算公式为Used Total = Unity + Mono + GfxDriver + Profiler + additionalUsedMemory。公式中的additionalUsedMemory项在Profiler中并没有显示,因为这一项一般情况下都为0,只在某些特殊发布平台下才会有数值(一般Android,PC和IOS都为0)。因此一般情况下Used Total的值就是除FMOD之外各项的总和了。当然,这个规则对于Reserved Total是同样适用的。
Remapper主要提供文件的持久化存储,包括各种序列化的Asset,项目的设置文件等,维护文件系统的中的文件与内存中数据的对应关系。
那么如果项目大量使用AssetBundle的话,在对AssetBundle进行Unload之前都会需要占用Remapper的内存的。而Remapper本身的实现使用内存池,其数值只会增大,那么为了使Remapper占用的内存保持在一个稳定的数值上,我们需要每次在加载一定数量的AssetBundle之后进行Unload操作,而不要一次性把所有AssetBundle都加载后才调用Unload。(这样的操作对维持整个Mono Heap的大小也是至关重要的,因为Mono Heap本身也是只增大不减小的。)
总结:一般情况下只需Unity Profiler在手,就能窥测到游戏中各项内存使用状况,当然前提是需要对Profiler各项数据所表达的含义了然于心。并且尽量使用真机调试结合Profiler,这样才能了解到游戏运行的真实内存占用数据
转载: