센로그
[Unity] Object Pool 본문
◆ Object pool이란?
많이 사용되는 오브젝트들을 동적으로 생성/파괴하는 대신, 미리 pool에 담아놓고 필요할 때마다 꺼내 쓰는 방식.
custom allocator의 느낌.
동적으로 메모리 할당 시 발생하는 다양한 문제(시간, 메모리 파편화, 등...)를 해결하기 위한 방법.
게임에서는 실시간성을 확보해야 하기 때문에 특히 시간이 중요함!!
◆ Object pool의 사용
예를들어, 500명의 플레이어가 있는 게임에서, 총알 오브젝트를 생성/파괴한다고 하자.
최소한 500개의 총알이 실시간으로 만들어져야 한다!
■ object pool 미사용시
:생성시마다 Instantiate, 파괴시마다 Destroy를 호출해줘야 함.
동적으로 메모리를 할당 및 해제해야 한다는 뜻.
user↔kernel 모드 변경시 시간이 오래 걸리고, 새로운 메모리 할당/해제시 파편화 문제 발생할 수도 있음.
(pc의 경우 virtual memory 사용해서 괜찮다 하지만, 콘솔 등 다른 장치에서는 문제 발생)
■ object pool 사용시
:초기화할 때 미리 object들을 생성해놓고, 필요하면 꺼내 쓰고 다시 넣어두는 방식
Instantiate 대신 SetActive(true)를, Destroy 대신 SetActive(false)를 사용하는 방식.
새로운 메모리를 할당/해제하는 것이 아닌, 미리 할당한 메모리 내에서 사용하는 방식이라 파편화 X
◆ Object pool 구현 방법
- 보통은 Singleton 패턴으로 PoolManager Instance를 만든 후, 런타임에 사용할 오브젝트들을 미리 만들어놓음.
- 미리 만든 오브젝트들은 비활성화하여 Queue 또는 Stack 등에 보관함
- 사용 요청을 받으면 꺼내주고(활성화, Dequeue), 다 쓴 오브젝트들은 반환(비활성화, Enqueue)하도록 함
- 만약 오브젝트를 전부 꺼내줬는데 사용 요청을 받은 경우, 새로운 오브젝트를 만들어서 꺼내줌. (또는 젤 먼저 꺼내줬던 오브젝트나, 특정 조건에 해당하는 오브젝트들을 다시 반환받은 후 꺼내줌)
'게임 > Unity, C#' 카테고리의 다른 글
[Unity] Scriptable Object (스크립터블 오브젝트) (0) | 2023.06.30 |
---|---|
[Unity] 유니티 라이프사이클 (0) | 2023.06.30 |
[C#] Class vs Struct (0) | 2023.06.29 |
[C#] 프로퍼티(property) - get, set (0) | 2023.06.29 |
[Unity] Oculus VR raycast로 ui 버튼 클릭 및 하이라이트 (0) | 2022.12.13 |
Comments