参照プールは実際には通常オブジェクト プールと呼ばれるもので、プログラム内では主にオブジェクトの頻繁な作成と破棄を防ぎ、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);
}
}