[ 오브젝트 풀에서 큐의 동작 원리 ]
오브젝트 풀에서 자주 사용되는 것이 선입선출 구조인 큐(Queue)이다. 큐에 오브젝트를 넣을 때는 Enqueue 메서드, 뺄 때는 Dequeue 메서드를 사용하라고 해서 사용하곤 있지만, 오브젝트 풀에서 정확히 어떤 원리로 동작하고 있는지 이해를 해야 적절한 시점에서 해당 메서드들을 사용할 수 있다.
큐와 오브젝트
예를 들어 설명하자면 큐는 관리자, 오브젝트는 일꾼이다. 일꾼들이 작업할 순서를 정해주는 것이 큐의 역할이다.
활성화는 작업 중인 것이고, 비활성화는 작업을 하고 있지 않은 상태이다.
모집 인원에 맞춰 이제 막 고용된 일꾼들은 일을 하고 있지 않는다.
Enqueue()
맨 처음 일꾼들이 일을 하러 와서 관리자에게 출석 확인을 한다. 작업 명단을 작성해서 관리자가 적절한 때에 일꾼을 작업시키도록 하기 위함이다. 이것이 Enqueue()이다.
새벽에 졸릴 때 그려서 전부 Q를 대문자로 썼다.. 착한 사람 눈에는 소문자 q로 보인다.
Dequeue()
순서에 맞춰 첫 번째 일꾼을 불러낸다. 이것이 Dequeue()이다. 그리고 일꾼에게는 일할 곳을 알려주고 일을 시킨다.
그러면 명단의 첫 번째로 써져 있던 이름을 지우고, 다시 나중에 일을 또 시키기 위해 맨 아래에 다시 적는다. 이것이 Dequeue()를 하고 다시 Enqueue()를 하는 것이다. 실제로 일꾼은 지정된 곳에서 일을 하고 있지만, 관리를 위해서 미리 순서만 정해놓는 것이다.
순환 구조
일이 끝난 일꾼이 다시 돌아오면 대기시켰다가, 필요해질 때 다시 일을 시키는 동작이 반복된다. 이 순환 구조가 오브젝트 풀에서 큐가 동작하는 원리이다.
다시 Enqueue()를 하지 않는다면
만약 Dequeue()를 하고 다시 Enqueue()를 하지 않는다면, 당장 일할 수 있는 일꾼들이 있음에도 불구하고 명단에는 일할 수 있는 사람이 없다고 되어있기 때문에 작업을 하지 못하게 된다. 결국 오브젝트를 재활용하는 오브젝트 풀의 목적에는 맞지 않게 된다.
적절한 오브젝트 비활성화 처리를 하지 않는다면
만약 명단에 순서는 이미 정해져 있지만, 작업이 끝났을 때 다시 복귀하도록 하는 명령을 하지 않는다면 다시 호출되기 전까지 해당 오브젝트는 끝난 상태 그대로 있게 된다. 따라서 재사용 타이밍이 아니더라도 이미 사용 목적을 달성했다면 비활성화해서 보이지 않도록 하는 것이 좋다.
풀 사이즈가 부족하다면
그리고 풀 사이즈가 부족하다면, 이미 활성화 되어있는 오브젝트를 바로 가져다가 쓰게 된다. 지정된 곳에서 일을 하고 있던 일꾼들이 갑자기 다른 곳에서 필요하다며 끌고 가버린 셈이 되는 것이다. 따라서 원하던 작업을 끝마치지 못하게 될 수 있으므로 수가 부족하다면 오브젝트 풀의 사이즈를 늘려야 한다.
그렇다고 너무 많이 생성하게 되면 노는 인력이 너무 많아지기 때문에, 고용비만 늘어나고 효율이 좋지 않게 된다. 따라서 오브젝트 풀의 사이즈는 적당히 설정해야 한다.
'Coding > Unity' 카테고리의 다른 글
[내일배움캠프 55일차 TIL] 2D 하루 낮밤과 다음 날 구현하기 (0) | 2024.07.03 |
---|---|
[내일배움캠프 50일차 TIL] 오브젝트 풀 객체 초기화 (0) | 2024.06.26 |
[내일배움캠프 46일차 TIL] JSON 직렬화로 데이터 저장, 불러오기 (0) | 2024.06.20 |
[내일배움캠프 43일차 TIL] Input System C# 제너레이트 활용 (0) | 2024.06.18 |
[내일배움캠프 42일차 TIL] 파티클 시스템, 애니메이션 이벤트, 사운드 (1) | 2024.06.14 |