[Unity]ベーシックキャッシュプール

キャッシュプールの要件
1.共通のストレージスペースがある
2.オブジェクトが必要な場合は、この共通スペースから取得します。
スペースに目的のオブジェクトがある場合、直接使用に戻ります。
スペースに目的のオブジェクトがない場合は、必要なオブジェクトを作成して戻ります。
3.オブジェクトが使用される場合、オブジェクトは削除されませんが、次の使用のためにこのパブリックスペースに配置されます。


キャッシュプールの役割
頻繁に使用されるオブジェクトをキャッシュプールに入れると、カップのオーバーヘッドを節約できますが、メモリのオーバーヘッドが発生します。CPUパフォーマンスにメモリを使用する一般的なパフォーマンス。一般的な箇条書き、特殊効果、およびその他の関連オブジェクトは、バッファープールを使用します。


ここに画像の説明を挿入
アイデアの作成の原則
キャッシュプールは、マネージャーの役​​割(シングルトンモード)です。
キャッシュプールは、さまざまなオブジェクトコンテナー(辞書+リスト)として使用できます。
キャッシュプールは、取得および配置できます:
メソッドに配置メソッドを
取得

キャッシュプールの知識
1.シングルトンモード
2.
辞書
3. リスト4. GameObject.SetActive ()
5.
GameObject.Instantiate 6.Resources.load

コード

/// <summary>
/// 单例模式基类
/// </summary>
/// <typeparam name="T"></typeparam>
public class BaseManger<T> where T : new()

{
    private static T _instance;

    public static T instance
    {
        get
        {
            if (_instance == null)
            {
                _instance = new T();
            }
            return _instance;
        }

    }

}

/// <summary>
/// 缓存池模块
/// 1.Dictionary List
/// 2.Gameobject和Resources 两个公共类的API
/// </summary>
public class poolMgr:BaseManger<poolMgr> 
{
    //缓存池容器
    public Dictionary<string, List<GameObject>> poolDic = new Dictionary<string, List<GameObject>>();

    /// <summary>
    /// 往外拿东西 
    /// name是预设体的名字和路径
    /// </summary>
    /// <param name="name"></param>
    /// <returns></returns>
    public GameObject GetObj(string name)
    {
        GameObject obj = null;

        //缓存池里有gameobject
        if (poolDic.ContainsKey(name) && poolDic[name].Count > 0)
        {
            obj = poolDic[name][0];
            poolDic[name].RemoveAt(0);
        }
        //缓存池没有,加载预设体
        else
        {
            obj = GameObject.Instantiate(Resources.Load<GameObject>(name));
            //把对象名字改的和池子名字一样
            obj.name = name;
        }

        //取出来的时候激活
        obj.SetActive(true);

        return obj;
    }

    /// <summary>
    /// 还暂时不用的东西
    /// </summary>
    public void PushObj(string name,GameObject obj)
    {
        //放进去的时候让gameobject失活
        obj.SetActive(false);

        //里面有gameobject
        if (poolDic.ContainsKey(name))
        {
            poolDic[name].Add(obj);
        }
        //里面没有
        else
        {
            poolDic.Add(name, new List<GameObject>() { obj });
        }
    }
}

テスト
テストスクリプトを作成し、空のオブジェクトGa​​meobjectをマウントし、左ボタンを押してキューブを作成し、右クリックして球を作成します。

public class PoolTest : MonoBehaviour
{
    void Update()
    {
        if (Input.GetMouseButtonDown(0))
        {
            poolMgr.instance.GetObj("Test/Cube");
        }
        if (Input.GetMouseButtonDown(1))
        {
            poolMgr.instance.GetObj("Test/Sphere");
        }
    }
}

Resources / Testディレクトリに、CubeとSphereのプリセットボディを作成します。
ここに画像の説明を挿入


バッファープールに遅延するスクリプトを記述し、それをキューブと球にマウントします。

public class DelayPush : MonoBehaviour
{
    //当对象激活时 会进入的生命周期函数
    void OnEnable()
    {
        Invoke("push", 1);
    }

    // Update is called once per frame

    void push()
    {
        poolMgr.instance.PushObj(this.gameObject.name, this.gameObject);
    }
}

ここに画像の説明を挿入
欠点:階層パネルに公開されるため、親オブジェクトレベルの下に配置するのが最適です。

元の記事を28件投稿しました 賞賛されました3 訪問数883

おすすめ

転載: blog.csdn.net/wangpuqing1997/article/details/105572378
おすすめ