- 잦은 new() 호출로 인한 메모리 누수를 방지하기 위해 object 재사용이 필요했음
- thread-safe하며 object 재사용이 가능한 ObjectPool이 필요하여 자료 구조 클래스를 제작
- 최초 생성 시 미리 만들어둘 object의 개수를 지정할 수 있도록 함(default는 256개)
- 잘 못 반환되지 않도록 본인이 생성한 object를 등록 후 반환 시 검사
- 사용 가능한 상태의 object를 thread-safe한 Queue에서 가져가도록 함
- 만약 현재 사용 가능한 상태의 object가 없다면(생성된 object가 모두 사용 중) 새로 생성하여 pool에 등록 후 지급
- 사용 완료 후 반납하였을 때 일괄적으로 초기화를 해주기 위해 Reset()를 반드시 재정의해야하는 IRecycle 인터페이스를 제약 조건으로 사용
- object를 자유롭게 생성하기 위해 new()를 제약 조건으로 사용
public interface IRecycle
{
public abstract void Reset();
}
public class ObjectPool<T> where T : IRecycle, new()
{
private readonly int DefaultCapacity = 256;
private ConcurrentList<T> _objects = new();
private ConcurrentQueue<T> _waitingObjectQueue = new();
public ObjectPool(int defaultCapacity = 0)
{
if (defaultCapacity > 0)
{
DefaultCapacity = defaultCapacity;
}
for (int i = 0; i < DefaultCapacity; i++)
{
CreateObject();
}
}
[return: NotNull]
private T CreateObject(bool enqueue = true)
{
T obj = new T();
_objects.Add(obj);
if (enqueue)
{
_waitingObjectQueue.Enqueue(obj);
}
return obj;
}
[return: NotNull]
public T GetObject()
{
if (false == _waitingObjectQueue.TryDequeue(out T? resultObject))
{
return CreateObject(false);
}
return resultObject;
}
public void ReturnObject([NotNull]T obj)
{
if(false == _objects.Contains(obj))
{
return;
}
obj.Reset();
_waitingObjectQueue.Enqueue(obj);
}
}
Git : https://github.com/ChoiMingyeong/Devoram.git/
GitHub - ChoiMingyeong/Devoram: Devoram Engine Repository
Devoram Engine Repository. Contribute to ChoiMingyeong/Devoram development by creating an account on GitHub.
github.com
'개발 > C#' 카테고리의 다른 글
[C#] CustomEventHandler (0) | 2023.12.12 |
---|---|
[C#] Bools (0) | 2023.12.09 |
[C#] ConcurrentList (4) | 2023.12.06 |
[C#] Singleton (2) | 2023.12.05 |