How to Develop a Game
Object Pooling
PublishDate: 2025-06-01 | CreateDate: 2025-06-01 | LastModify: 2025-06-01 | Creator:ljf12825

对象池是一种优化性能和内存分配的设计模式,尤其常用于游戏开发和高频率实例化的场景中

概念

对象池是一个事先创建好的一组可复用对象的容器,避免频繁地创建和销毁对象。在需要时,从池中取一个对象;使用完毕后,不销毁,而是回收进池中待复用

适用场景

工作流程

1.初始化:创建一定量的对象并放入池中,默认设置为非激活状态

2.取出对象(Spawn/Get):

3.回收对象(Recycle/Release):

4.自动扩展或缩减池大小(可选)

简单实现

public class ObjectPool<T> where T : Component
{
    private Queue<T> pool = new Queue<T>();
    private T prefab;

    public ObjectPool(T prefab, int initialSize)
    {
        this.prefab = prefab;
        for (int i = 0; i < initialSize; i++)
        {
            var obj = GameObject.Instantiate(prefab);
            obj.gameObject.SetActive(false);
            pool.Enqueue(obj);
        }
    }

    public T Get()
    {
        if (pool.Count == 0)
        {
            var obj = GameObject.Instantiate(prefab);
            obj.gameObject.SetActive(false);
            pool.Enqueue(obj);
        }

        var item = pool.Dequeue();
        item.gameObject.SetActive(true);
        return item;
    }

    public void ReturnToPool(T item)
    {
        item.gameObject.SetActive(false);
        pool.Enqueue(item);
    }
}

优势

注意事项

进阶

对象池的核心思想很简单————重用对象,避免频繁创建销毁
但是如果想把它做得健壮、泛用、易扩展、适用于复杂项目,就没那么简单了

从简单到复杂的演进

第一层:最简单的对象池(适合个人项目)

仅供学习和简单功能验证;缺乏健壮性

第二层:实用的泛型对象池(中小项目)

大多数游戏项目都能满足;但初始化管理、类型多时稍显混乱

第三层:可扩展的池管理系统(大型项目)

更适合团队协作/商业项目/动态资源系统;但开发成本高,需要系统设计经验

第四层:框架级池化(配合IoC、DI、状态机)