有些性能消耗是我们无法处理的,但是很多是我们可以进行优化的,比如代码部分。
工作原理和扩展原因:
什么是托管堆?
游戏中脚本运行时的内存管理器自动管理的一段内存。托管堆上分配的内存,有非null引用类型对象、所有装箱的值类型对象、字符串。
截取一张来自官方的图片:
整个框可以看做是一个托管堆的内存量。彩色的是已经分配的内存。当GC释放内存时,就一会出现红色圆圈中的空白可用内存。
Unity的内存管理机制不会对内存进行整理,所以就会出现在一片区域中,零星的几个位置有可用内存。
当分配一个新对象时,需要的内存大小为X,在托管堆上判断是否存在连续的大小为X的空间,如果存在,就可以放置,如果不存在,就会扩展托管堆。扩展的量视平台而定,大多数Unity平台会使托管堆在扩展时翻倍。这就是托管堆的扩展原因。
内存碎片化:像上图中红圈部分出现的地方多,但又不是连续的,这种现象就叫做内存碎片化。这是由于Unity的GC管理是非分代、非压缩导致的。
所谓非分代:表示GC每次执行都是遍历扫描整个托管堆;
非压缩:不会为内存中的对象重新分配内存地址来消除这些内存碎片。
因此,在游戏运行中,托管堆是只会变大,而不会变小。
由于托管堆中的内存不会归还给操作系统,因此对于32位程序,如果托管堆不断扩展,会导致地址空间耗尽,操作系统将会终止该程序,出现闪退。对于64位程序,地址空间足够大到可以运行时间操作人类平均寿命的程序,地址空间耗尽几乎不可能发生。
来源于Unity的官方优化文档
上一篇:资源预处理和资源规范建议
下一篇:没有了!