본문 바로가기

Unity/작업방식

Unity: Workflow. ListPool<T> 리스트 풀

유니티 uGUI 코드를 살펴보다가 ListPool을 사용하는 부분을 발견했습니다.

 

주로 Mesh가 업데이트 되어야 할 때마다 버텍스를 관리해줄 때 리스트가 사용됩니다. 매번 리스트를 만들고 사용하면 그 동작이 얼마나 자주 진행되는지에 따라 메모리 누수로 인한 CPU Spike가 발생할 수 있습니다. 이를 방지하기 위해 uGUI 코드에서 internal로 사용되던 자료구조입니다.

 

CollectionPool<TCollection, TItem>

 

ListPool<T>

 

ObjectPool<T>

 

구현은 위와 같이 되어있으며 2021.1 버전부터 public 으로 사용할 수 있게 접근제한이 풀렸습니다.

uGUI의 Text 컴포넌트에서 사용되는 VertexHelper 클래스는 이를 리스트풀을 이용해 구현했습니다.

 

VertexHelper

 

조심해야 할 점은 Release를 제대로 시켜주지 않으면 되려 메모리에 악영향을 줄 수 있다는 것입니다.

명시적으로 Initialize, Dispose 메소드에서 Get(), Release()를 호출하도록 구현해주는편이 안전한 코드 작성에 도움이 됩니다.

 

빈번하게 List가 생성되고 삭제되어야 하는 로직을 구성할 때 활용할 수 있겠습니다.