参考:http://blog.csdn.net/znybn1/article/details/76464896
为啥要点?因为讲的重点。
了解 ?
游戏运行时来存储数据,当这些数据不再被使用时,存储这些数据的内存被释放以便于字后这些内存被复用。
垃圾(Garbage)是存储这些无用数据的内存的术语,GC(Garbage Collection 垃圾回收)是使这些内存可以再次使用的过程。
GC 引起的问题?
性能问题表现为帧率过低,帧率剧烈波动或间歇性卡顿。
Unity内存管理简介?
Unity可以访问两个内存池,栈和堆(托管堆)。栈用于短期存储小块数据,堆用于长期存储和较大数据块。
栈用于短期存储小块数据,堆用于长期存储和较大数据块。
当变量超出作用域,该内存不再被使用并可以归还给原来的内存池。当内存被归还给原有的内存池丽,我们
称该内存被释放。栈内存在变量超出作用域时被实时释放,而堆内存在变量超出作用域之后并没有被释放并保持被分配的状态。
无用的堆只在执行GC时才被释放。
GC 识别和释放未使用的堆内存。GC定期运行以清理堆。
堆分配时候步骤?
首先,Unity检查堆上是否有足够的空间内存,如果有,则该变量的内存被分配。
如果没有,Unity触发GC试图释放未使用的堆内存,这个操作可能很慢。如果GC之后堆内存足够,则该变量的内存被分配。
如果GC之后堆上还是没有足够的空闲内存,Unity将向操作系统申请更多内存以扩大堆大小。这个操作可能很慢。
堆分配可能会很慢,特别在必须执行GC和扩大堆大小时。
(我们减少GC,其实就是降低扩大堆的次数)
GC是个费时的操作,堆上的对象越多,代码中的引用数越多,GC越费时。
何时触发GC?
堆分配时堆上的可用内存不足时触发GC。
GC会自动运行。(频率因平台而异)
手动强制调用GC。
GC 的问题?
如果堆上有很多对象和大量的对象引用要检查,则检查所有这些对象的过程可能很慢。这可能导致游戏卡顿或缓慢运行。
另一个问题是GC在不合时宜的场合被触发。
堆碎片:当从堆中分配内存时,会根据必须存储的数据大小从不同大小的块中的可用空间中获取内存。
当这些内存返回到堆时,堆可能分成很多由分配快分隔的小空闲kuai.这意味着虽然可用内存总量很高。但是由于
碎片化严重而无法分配一块连续的大内存。这意味着GC被触发或不得不扩大堆大小。
(游戏内存大小会高于实际所需要的大小,GC会被频繁的触发)