キャッシュプールの要件
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 });
}
}
}
テスト
テストスクリプトを作成し、空のオブジェクトGameobjectをマウントし、左ボタンを押してキューブを作成し、右クリックして球を作成します。
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);
}
}
欠点:階層パネルに公開されるため、親オブジェクトレベルの下に配置するのが最適です。