2026-04-22 09:52:55 +08:00
|
|
|
using System;
|
|
|
|
|
using System.Collections.Generic;
|
|
|
|
|
|
2026-04-27 11:20:13 +08:00
|
|
|
namespace RedHotRoast
|
2026-04-22 09:52:55 +08:00
|
|
|
{
|
|
|
|
|
public class ObjectPool<T> where T : new()
|
|
|
|
|
{
|
|
|
|
|
private Stack<T> m_Stack = new();
|
|
|
|
|
|
|
|
|
|
private Action<T> m_ActionOnNew;
|
|
|
|
|
private Action<T> m_ActionOnGet;
|
|
|
|
|
private Action<T> m_ActionOnRelease;
|
|
|
|
|
|
|
|
|
|
public int CountAll { get; private set; }
|
|
|
|
|
|
|
|
|
|
public ObjectPool()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public ObjectPool(Action<T> actionOnGet, Action<T> actionOnRelease)
|
|
|
|
|
{
|
|
|
|
|
m_ActionOnGet = actionOnGet;
|
|
|
|
|
m_ActionOnRelease = actionOnRelease;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public T Get()
|
|
|
|
|
{
|
|
|
|
|
T element;
|
|
|
|
|
if (m_Stack.Count == 0)
|
|
|
|
|
{
|
|
|
|
|
element = new T();
|
|
|
|
|
CountAll++;
|
|
|
|
|
|
|
|
|
|
if (m_ActionOnNew != null)
|
|
|
|
|
{
|
|
|
|
|
m_ActionOnNew(element);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
element = m_Stack.Pop();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (m_ActionOnGet != null)
|
|
|
|
|
m_ActionOnGet(element);
|
|
|
|
|
|
|
|
|
|
return element;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public void Release(T element)
|
|
|
|
|
{
|
|
|
|
|
if (m_ActionOnRelease != null)
|
|
|
|
|
{
|
|
|
|
|
m_ActionOnRelease(element);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
m_Stack.Push(element);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public void Dispose()
|
|
|
|
|
{
|
|
|
|
|
m_Stack.Clear();
|
|
|
|
|
m_Stack = null;
|
|
|
|
|
|
|
|
|
|
m_ActionOnNew = null;
|
|
|
|
|
m_ActionOnGet = null;
|
|
|
|
|
m_ActionOnRelease = null;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|