Files
Main/Assets/Plugins/References/FuncellBase/ObjectPool/SimplePool.cs

183 lines
4.7 KiB
C#
Raw Normal View History

2025-01-25 04:38:09 +08:00
using System;
using System.Collections.Generic;
using FLogger = UnityEngine.Gonbest.MagicCube.FLogger;
namespace Thousandto.Core.Base
{
public class SimplePool<T> where T : class
{
#region //静态处理
public static MyFunc<object,T> CreateInstanceWithParam = null;
public static MyFunc<T> CreateInstance = null;
public static MyAction<T> CtorFunc = null;
public static MyAction<T,int> DtorFunc = null;
public static MyAction<T> ReleaseFunc = null;
public static MyFunc<T, int> ElementSizeFunc = null;
private static SimplePool<T> _sharedInstance = null;
public static SimplePool<T> SharedInstance
{
get
{
return _sharedInstance;
}
}
static SimplePool()
{
_sharedInstance = new SimplePool<T>();
SimplePoolSweeper.Register(() => _sharedInstance.Sweep());
}
#endregion
private SetStack<T> m_stack = new SetStack<T>();
public List<T> Stack
{
get
{
return m_stack.Items;
}
}
public void Sweep()
{
try
{
if (ReleaseFunc != null)
{
for (int i = 0; i < m_stack.Count; ++i)
{
ReleaseFunc(m_stack[i]);
}
}
}
finally
{
m_stack.Clear();
m_stack.TrimExcess();
}
}
public void TrimExcess()
{
m_stack.TrimExcess();
}
public T Allocate()
{
T ret = null;
if (m_stack.Count == 0)
{
if (CreateInstance == null)
{
ret = Activator.CreateInstance(typeof(T)) as T;
FLogger.DebugLogWarning("SimplePool: there is no public parameterless ctor. you should specify a ctor for this pool.");
}
else
{
ret = CreateInstance();
}
}
else
{
ret = m_stack.Pop();
}
if (CtorFunc != null)
{
CtorFunc(ret);
}
return ret;
}
//通过参数创建
public T Allocate(object param)
{
T ret = null;
if (m_stack.Count == 0)
{
if (CreateInstanceWithParam == null)
{
ret = Activator.CreateInstance(typeof(T), param) as T;
FLogger.DebugLogWarning("SimplePool: there is no public parameterless ctor. you should specify a ctor for this pool.");
}
else
{
ret = CreateInstanceWithParam(param);
}
}
else
{
ret = m_stack.Pop();
}
if (CtorFunc != null)
{
CtorFunc(ret);
}
return ret;
}
public void Free(ref T o,int param)
{
if (o != null)
{
if (m_stack.Push(o))
{
if (DtorFunc != null)
{
DtorFunc(o, param);
}
}
o = null;
}
}
public int GetTotalSize()
{
int size = 0;
if (ElementSizeFunc != null)
{
for (int i = 0; i < m_stack.Count; ++i)
{
size += ElementSizeFunc(m_stack[i]);
}
}
return size;
}
public void Preload(int count)
{
var c = m_stack.Count + count;
if (CreateInstance != null)
{
for (int i = 0; i < count; ++i)
{
var ret = CreateInstance();
if (ret != null)
{
m_stack.PushFast(ret);
}
}
}
else
{
FLogger.DebugLogWarning("SimplePool: there is no public parameterless ctor. you should specify a ctor for this pool.");
for (int i = 0; i < count; ++i)
{
var ret = Activator.CreateInstance(typeof(T)) as T;
if (ret != null)
{
m_stack.PushFast(ret);
}
}
}
}
}
}