Unity 客户端框架(五):对象池

关于对象池,引用百度上的一句话:对象池使用的基本思路是:将用过的对象保存起来,等下一次需要这种对象的时候,再拿出来重复使用,从而在一定程度上减少频繁创建对象所造成的开销。</span>

简单的来说就是: 重复利用对象,减少创建和销毁对象的性能消耗


{
    
    //实例池对象
    private static GameObject poolParent;


    public override void Init()
    {
        //初始化实例池
        poolParent = new GameObject();
        poolParent.name = "Pool";
        poolParent.SetActive(false);
        GameObject.DontDestroyOnLoad(poolParent);
    }

    //池里对象字典
    private Dictionary<string, List<GameObject>> pool = new Dictionary<string, List<GameObject>>();


    //出池  对象名+路径
    public GameObject OnGetObj(string objName,string path = null)
    {

        if (path != null)
        {
            if (!path.Contains("/"))
            {
                path += "/";
            }
        }

        //如果不存在池里,加载生成
        if (!pool.ContainsKey(objName) || pool[objName].Count == 0)
        {

            if(path == null)
            {
                Debug.LogError("Obj Pool doens't have : " + objName);
                return null;
            }

            //使用资源管理器
            //250000  效率
            GameObject go = null;
            go = ResManager.Instance.LoadInstance(path + objName) as GameObject;

            //300000  效率
            //GameObject go = null;
            //ResManager.Instance.LoadAsyncInstance(path + objName, (_obj) => { go = _obj as GameObject; });

            if (go == null)
                Debug.LogError("Cannot find  resource : " + path + objName);
            //GameObject result = GameObject.Instantiate(go) as GameObject;
            go.name = objName;
            return go;
        }
        else
        {
            //否则从池里取出
            GameObject result = pool[objName][0];
            pool[objName].RemoveAt(0);
            //result.transform.localPosition = Vector3.zero;
            //result.transform.localRotation = Quaternion.Euler(Vector3.zero);
            if(result.transform.parent != poolParent.transform)
            {
                Debug.LogError("obj not in Pool :   " + result);
            }
            result.transform.SetParent(null);
            return result;
        }

    }



    //进池
    public void OnReturnObj(GameObject go)
    {
        if(go.transform.parent == poolParent.transform)
        {
            return;
        }
        //如果池里没有此类对象,新建一个List
        if(!pool.ContainsKey(go.name))
        {
            pool.Add(go.name, new List<GameObject>());
        }
        go.transform.SetParent(poolParent.transform);
        pool[go.name].Add(go);
    }

    public void OnDestroy()
    {
        pool.Clear();
        GameObject.Destroy(poolParent.gameObject);
    }

}



                
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值