在使用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进行调试,只有这样才能得到真正精确的测试数据。
莱姆开发出了一款DVC1000-P系列电压传感器
OPS3323三通道可编程直流电源的特点及应用
扫地机器人如何运用粉尘传感器,它的原理是怎样的
5G技术对智能门锁有什么作用
继航空领域之后,马斯克与贝索斯在自动驾驶领域的斗争也即将搬上台面
Unity Profiler分析内存使用状况疑问解答
华为欧洲奋斗史
led灯半边不亮的维修方法分享
真一亿像素时代来临 如何辨别真假像素
我国机器人产业发展快,但虚火也旺
电平表的使用方法_电平表的原理与分类
二极管测温度原理是什么 如何使用二极管做更精准的测温呢?
法国Li-Fi公司放弃照明以加强数据通信
高压变频器在焦化辐射进料泵中的应用
将5v转换为3.3v的逻辑电平转换器电路
下半年即将上市的新机:锤子T3、魅族MX7、华为Mate10、小米MIX2每部都是超强旗舰,哪一款是你的菜?
卓然发布高集成COACH 14数码相机处理器平台
热电偶的型号有几种
高通创锐讯推出Wi-Fi无线显示对等连接方案
充电器电路详解(自激型电源的进一步优化)