性能优化

当前位置:首页>技术博客>性能优化
全部 15 TFrame框架 2 游戏渲染 0 编辑器扩展 0 性能优化 3 SDK 4 数据结构和算法 1 杂项 5

代码部分的优化建议

时间:2021-06-16   访问量:1312

背景

有些性能消耗是我们无法处理的,但是很多是我们可以进行优化的,比如代码部分。


托管堆

工作原理和扩展原因:

什么是托管堆?

游戏中脚本运行时的内存管理器自动管理的一段内存。托管堆上分配的内存,有非null引用类型对象、所有装箱的值类型对象、字符串。


截取一张来自官方的图片:



整个框可以看做是一个托管堆的内存量。彩色的是已经分配的内存。当GC释放内存时,就一会出现红色圆圈中的空白可用内存。

Unity的内存管理机制不会对内存进行整理,所以就会出现在一片区域中,零星的几个位置有可用内存。

当分配一个新对象时,需要的内存大小为X,在托管堆上判断是否存在连续的大小为X的空间,如果存在,就可以放置,如果不存在,就会扩展托管堆。扩展的量视平台而定,大多数Unity平台会使托管堆在扩展时翻倍。这就是托管堆的扩展原因。


内存碎片化:像上图中红圈部分出现的地方多,但又不是连续的,这种现象就叫做内存碎片化。这是由于Unity的GC管理是非分代、非压缩导致的。


所谓非分代:表示GC每次执行都是遍历扫描整个托管堆;

非压缩:不会为内存中的对象重新分配内存地址来消除这些内存碎片。


因此,在游戏运行中,托管堆是只会变大,而不会变小。


由于托管堆中的内存不会归还给操作系统,因此对于32位程序,如果托管堆不断扩展,会导致地址空间耗尽,操作系统将会终止该程序,出现闪退。对于64位程序,地址空间足够大到可以运行时间操作人类平均寿命的程序,地址空间耗尽几乎不可能发生。


建议

来源于Unity的官方优化文档



上一篇:资源预处理和资源规范建议

下一篇:没有了!

发表评论:

评论记录:

未查询到任何数据!