Exemplo n.º 1
0
    public System.Object GetOne()
    {
        lock (this)
        {
            if (_listFreeIndex.Count == 0)
            {
                if (_nCurrentSize == _nCapacity)
                {
                    UnityEngine.Debug.LogError("ObjectPool has no more capacity to create new object");
                    return(null);
                }
                PoolItem pnewitem = new PoolItem(_typeObject, _objCreateParam);
                Debug.Log("Create New PoolItem!! ID:" + pnewitem.InnerObjectHashcode);
                _listObjects.Add(pnewitem.InnerObjectHashcode, pnewitem);
                _listFreeIndex.Add(pnewitem.InnerObjectHashcode);
                _nCurrentSize++;
            }
            //Debug.Log("UsingIndex Add Object :" + _listFreeIndex[0]);
            int      nFreeIndex = (int)_listFreeIndex[0];
            PoolItem pitem      = (PoolItem)_listObjects[nFreeIndex];
            _listFreeIndex.RemoveAt(0);
            _listUsingIndex.Add(nFreeIndex);
            //Debug.Log("UsingIndex Add Object :" + nFreeIndex);
            if (!pitem.IsValidate)
            {//这里需要注意,Recreate()很可能会改变InnerObject的HashCode,
                //所以考虑在这里,使用
                pitem.Recreate();

                if (nFreeIndex != pitem.InnerObjectHashcode)
                {
                    _listObjects.Remove(nFreeIndex);
                    _listUsingIndex.Remove(nFreeIndex);
                    nFreeIndex = pitem.InnerObjectHashcode;
                    _listObjects.Add(nFreeIndex, pitem);
                    _listUsingIndex.Add(nFreeIndex);
                }
            }
            pitem.Using = true;
            return(pitem.InnerObject);
        }
    }