686
社区成员




对象池常使用于大量游戏对象的维护上。作为游戏优化的大头,其实现可以很简单也可以很复杂,这里举例说明多类型对象池的学习记录。此处对象池异于引用池。在Unity中使用常用的对象池时,需要理解对象池的的原理和Unity的生命周期,而此处的“坑”也和一种对象池的实现有关(详见学习问题总结)。
首先,为了实现一个比较完整的对象池,应当让每一种类型的对象都有对应的池子,因此可以引申出一个简单的模型:
public class ObjectPoolManager{
public Dictionary<Type,List<GameObject>> MultiTypeObjectPool;
}
这里定义了一个提供多类型的对象池,可以提供不同对象的复用工作,当然这里可以把List再封装为一个ObjectPool进行更加深入的管理。
基础的对象池需要对象的创建、回收功能。初次创建直接使用Gameobject.Instantiate(),而回收则是SetActive(false),再次使用时,反过来设为true。
public class ObjectPoolManager{
public Dictionary<Type,List<GameObject>> MultiTypeObjectPool;
public GameObject Spawn<T>(){}
public GameObject Despawn(GameObject){}
}
当然,为了让对象池能够发挥更大的作用,应该对生成方法有多个不同的方法,例如重载一个生成方法使得通用性提高,不过内部实现常常会一个方法复用一个基础方法,让栈中堆积。还可以按需求提供生成的对象,例如是否复用、是否需要创建对象池。
另外,为了避免内存泄漏,应该防止用户滥用的情况发生,对已缓存的对象进行检查并释放,还可以提供其他时间限定选项。
对象池提供了很好的优化机制,但也存在滥用的情况,并且具有良好功能的对象池虽然有标准的实现,但也存在一定学习难度,特别是配合其他系统的时候,对整体框架思想需要有良好的把握。明白对象复用的原理,避免在各个环境下出现Bug。