【Unity】对象池技术

尽可能的使用对象池


【问题】
创建一个类的实例,内存的分配和消耗,会对程序性能产生影响

【目的】
减少内存分配次数
减少内存碎片
避免内存卸载的性能损耗

【问题是如何产生的】
C#使用垃圾回收机制GC,来回收内存

C#随意创建类的实例,然后随意丢弃、不使用、空置引用
导致类实例不断直接或间接引用,不断抛弃,GC就不断处理这些垃圾。
内存不断地被分配,然后内存不够用,然后GC到处询问和检查(遍历所有已分配的内存),查找哪个类实例被完全弃用了,然后回收掉。
随着数据量越来越多,GC检查的内容也越多,回收后内存依旧不足,就会不断请求分配新的内存
造成极大的性能消耗

其他可能导致GC性能消耗的情况
new List ,大量使用动态数组
Dictionary< int ,List > 中的List数组也会被大量抛弃。

【解决】
尽可能使用对象池重复利用已经创建的对象,减少内存分配时的消耗,减少内存块的数量,最终减少GC带来的CPU消耗。

【如何使用对象池】
创建实例对象,调用对象池,对象池Get
销毁实例对象,
移除实例对象,对象池Release

进一步优化
在对象池上做预加载:运行之前让对象池中的对象分配多一点内存
Dictionary预加载,提前将资源内容加载到内存中,可以让后让面创建内存分配减少。
举个例子:在进入下一个场景之前,做一个转场,提前预加载需要的资源和实例对象。

对象池管理器PoolManger

你可能感兴趣的:(Unity面试,unity)