Unity ゲーム フレームワーク - モジュールの使用法 - 参照プール

参照プールは実際には通常オブジェクト プールと呼ばれるもので、プログラム内では主にオブジェクトの頻繁な作成と破棄を防ぎ、gc を削減し、プリロードする役割を果たします。
GF には 2 種類のプールがあり、1 つは参照プールと呼ばれ、もう 1 つはオブジェクト プールと呼ばれます。原理は同じですが、具体的な実装と対象オブジェクトが異なります。一般的には参照プールが使用されます。オブジェクト プールは通常、UnityEngine でオブジェクト (Unity の GameObject オブジェクトなど) を保存するために使用される参照プールの使用は、基本的に
参照プール コンポーネント ReferencePoolComponent とは独立して存在できます。コンポーネントの属性、つまり EnableStrictCheck (必須チェックを有効にするかどうか)。

API の使用法:
指定した数の参照を参照プールに追加します:
ReferencePool.Add(4);
ReferencePool.Add(typeof(StructData),4);
追加された参照は未使用 (未使用) としてマークされ、参照カウントは + になります。 1

参照プールから参照を取得します:
StructData StructData1 = ReferencePool.Acquire();
取得時に、参照プールが空の場合は、参照を作成します。参照プールに解放済みまたは未使用の参照がある場合、その参照は参照プールから取り出され、取り出した後はオブジェクトは参照プールに保持されません。取得した参照はUsing(使用中)とマークされ、参照数が+1されます。

参照を解放します:
ReferencePool.Release(StructData1);
参照を参照プールに返します

参照の削除:
ReferencePool.Remove(2);
ReferencePool.RemoveAll(typeof(StructData));
削除は参照プールから削除され、参照プール内のストレージは未使用および解放としてマークされます。
参照カウントは、プール コンポーネントのインスペクター パネルから確認できます。
[写真]
上図から、データ ノード、有限ステート マシン、およびログ ノード (印刷ログがある場合) が確認できます。表示されているものに加えて、フレームワーク内の多数のイベントと関連コンポーネントが役に立ちます。

以下のデモ コードを貼り付けます。

using GameFramework;
using System.Collections.Generic;
using UnityEngine;

public class Player : MonoBehaviour
{
    
    
    ReferencePoolInfo[] Tem;
    State state1,state2;
    StructData StructData1, StructData2, StructData3;
    void Start()
    {
    
    
        //创建状态列表(使用引用池)
        state1 = ReferencePool.Acquire<State>();
        state1.Add("游走状态");
        state2 = ReferencePool.Acquire<State>();
        state2.Add("移动状态");

        StructData1 = ReferencePool.Acquire<StructData>();
        StructData1.Add("游走状态", new Vector2Int(0, 0));
        StructData2 = ReferencePool.Acquire<StructData>();
        StructData2.Add("移动状态", new Vector2Int(1, 15));
        StructData3 = ReferencePool.Acquire<StructData>();
        StructData3.Add("跳跃状态", new Vector2Int(4, 15));
        ReferencePool.Add<StructData>(4);

        Tem = ReferencePool.GetAllReferencePoolInfos();
        foreach (var item in Tem)
        {
    
    
            Debug.LogError(item.Type + ":" + item.UsingReferenceCount);
        }
    }
    [ContextMenu("ReleaseItem")]
    public void ReleaseItem()
    {
    
    
        ReferencePool.Release(state2);
        foreach (var item in Tem)
        {
    
    
            Debug.LogError(item.Type + ":" + item.UsingReferenceCount);
        }
    }
    [ContextMenu("ReleaseList")]
    public void ReleaseList()
    {
    
    
        ReferencePool.Release(StructData1);
        ReferencePool.Release(StructData3);
        ReferencePool.RemoveAll(typeof(StructData));
        foreach (var item in Tem)
        {
    
    
            Debug.LogError(item.Type + ":" + item.UsingReferenceCount);
        }
    }
    [ContextMenu("AddItem")]
    public void AddItem()
    {
    
    
        StructData C = ReferencePool.Acquire<StructData>();
    }
}
public class State : IReference
{
    
    
    string StateName;
    public State()
    {
    
    
    }
    public void Add(string StateName)
    {
    
    
        this.StateName = StateName;
    }
    public void Clear()
    {
    
    
        StateName = null;
    }
}
public class StructData : IReference
{
    
    
    string StateName;
    Vector2Int pos;
    public StructData()
    {
    
    
    }
    public void Add(string StateName, Vector2Int pos)
    {
    
    
        this.StateName = StateName;
        this.pos = pos;
    }
    public void Clear()
    {
    
    
        StateName = null;
        pos = default(Vector2Int);
    }
}

おすすめ

転載: blog.csdn.net/qq_37619255/article/details/130068701