개발/C#

[C#] ObjectPool

min1119 2023. 12. 7. 00:42
  • 잦은 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

Permalink : https://github.com/ChoiMingyeong/Devoram/blob/acb03c511c34c846cbc918e2d0f9fb85d90da1c5/Devoram/DevoramUtility/ObjectPool.cs

'개발 > 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