=====堆内存分配时候,unity做了什么:
1.首先,Unity检查堆上是否有足够的空闲内存,如果有,则该变量的内存被分配;
2.如果没有,Unity触发GC试图释放未使用的堆内存,这个操作可能很慢。如果GC之后堆内存足够,则该变量的内存被分配;
3.如果GC之后堆上还是没有足够的空闲内存,Unity将向操作系统申请更多内存以扩大堆大小。这个操作可能很慢。之后该变量的内存被分配
所以,堆分配可能会很慢,特别在必须执行GC和扩大堆大小时。
=====GC时,发生了什么:
当堆变量超出作用域后,存储该变量的内存并没有被立即释放。无用的堆内存只在执行GC时被释放。
每次执行GC时,将执行以下步骤:
- 垃圾收集器检索堆上的每个对象。
- 垃圾收集器搜索所有当前对象引用以确定堆上的对象是否仍在作用域内。
- 不在作用域内的对象被标记为删除。
- 删除被标记的对象并将内存返回给堆。
GC是个费时的操作,堆上的对象越多,代码中的引用数越多,GC就越费时
=====GC带来的问题
1.最明显的问题是GC可能花费相当长的时间来运行(如果堆上有很多对象和大量的对象引用要检查,则检查所有这些对象的过程可能很慢。 这可能会导致我们的游戏卡顿或运行缓慢)
2.GC可能在不合时宜的时刻被触发(如果CPU在我们游戏的性能关键部分已经满负荷了,那此时即使是少量的GC额外开销也可能导致我们的帧速率下降和性能问题。)
3.堆内存碎片化ÿ