[Unity]TIL (41) | 2023.09.19 | 유니티 오브젝트 풀링

kjg5370·2023년 9월 19일
0

TIL

목록 보기
41/91
post-thumbnail

들어가기 앞서

오늘은 저번 팀 프로젝트에서도 썼었고 이번 숙련 주차 강의를 들으면서
나왔던 개념인 오브젝트 풀링에 대해 정리해보려고 합니다.
오브젝트 풀링을 사요하면 메모리 및 리소스 사용을 최적화 할 수 있으므로 잘 활용해보도록 하겠습니다.

오늘 배운 것

  • 오브젝트 풀링(Object Pooling)
    소프트웨어 개발에서 사용되는 디자인 패턴 중 하나.
    게임 개발에 널리 사용되는 테크닉으로, 게임의 성능을 개선하기 위해 사용.

    • 오브젝트 풀링의 작동 방식

      1. 오브젝트 생성 및 초기화
        미리 정의된 수의 오브젝트(객체 또는 컴포넌트)를 생성하고 초기화.
        이 오브젝트들은 처음에 사용되지 않고 비활성 상태로 유지.

      2. 오브젝트 재사용
        프로그램이 오브젝트를 필요로 할 때마다 오브젝트 풀에서 오브젝트를 가져와 사용.
        오브젝트는 재사용되므로 새로운 오브젝트를 계속해서 생성하는 비용을 절약할 수 있음.

      3. 오브젝트 반환: 오브젝트 사용이 끝나면 오브젝트를 풀로 반환.
        오브젝트는 다시 비활성 상태로 되돌아가며 재사용을 기다림.

    • 장단점

      오브젝트 풀링은 생성과 소멸이라는 비용이 큰 작업을 최소화함으로써 성능을 향상시키는 데 중요한 역할을 함.

      빈번하게 생성하고 파괴되는 객체들을 풀에 저장해 놓고 재사용함으로써 메모리 할당과 가비지 컬렉션에 따른 성능 저하를 방지.

      적절히 사용하면 큰 성능 개선을 가져올 수 있지만, 불필요한 메모리 사용을 증가시킬 수 있으므로 사용 시에는 신중해야 함.

  • 오브젝트 풀 클래스

    using System.Collections.Generic;
     using UnityEngine;
    
     public class ObjectPool : MonoBehaviour
     {
         public GameObject prefab; // 사용할 프리팹
         public int poolSize = 10; // 풀의 크기
    
         private List<GameObject> objectPool;
    
         private void Start()
         {
             // 초기화 및 풀에 오브젝트 추가
             objectPool = new List<GameObject>();
             for (int i = 0; i < poolSize; i++)
             {
                 GameObject obj = Instantiate(prefab);
                 obj.SetActive(false);
                 objectPool.Add(obj);
             }
         }
    
         // 오브젝트 가져오기
         public GameObject GetObject()
         {
             foreach (GameObject obj in objectPool)
             {
                 if (!obj.activeInHierarchy)
                 {
                     obj.SetActive(true);
                     return obj;
                 }
             }
             return null; // 모든 오브젝트가 사용 중일 때는 null 반환
         }
    
         // 오브젝트 반환
         public void ReturnObject(GameObject obj)
         {
             if (objectPool.Contains(obj))
             {
                 obj.SetActive(false);
             }
         }
     }

기억 할 것 & 진행 사항

  • 풀 크기 (Pool Size): 풀에 미리 생성할 오브젝트의 수를 결정하는 것이 중요.
    이 크기를 적절하게 선택해야 메모리를 낭비하지 않고 성능을 향상.
  • 프리팹 (Prefab): 프리팹은 오브젝트의 템플릿으로 사용.
    풀에서 사용할 오브젝트를 미리 프리팹으로 만들고 풀에서 이를 복제하여 사용.
  • SetActive() 메서드: 오브젝트의 활성 상태를 변경할 때 SetActive() 메서드를 사용.
    오브젝트를 풀에서 가져올 때 활성화하고, 반환할 때 비활성화.
  • 오브젝트 풀 관리: 오브젝트 풀을 관리할 때 풀에서 가져온 오브젝트를 주의 깊게 사용해야 함.
    오브젝트를 가져와서 사용 후에는 풀로 반환해야 함.

진행 사항

지급 받은 강의 듣기(진행중)

내일 할 일

  • 하루 계획
    • 오전
      • 09:00 ~ 10:00 : 알고리즘 코드카타
      • 10:00 ~ 10:30 : 팀 회의
      • 10:30 ~ 14:00 :
        • 오늘 계획 (Task)
      • 12시-1시: 점심식사
    • 집중 코딩
      • 14:00 ~ 18:00
    • 저녁
      • 6시-7시: 저녁식사
      • 19:00 ~ 20:00 : 집중 코딩 시간 부족한 부분 해결해보기
      • 20:00 ~ 21:00: TIL 작성, 마무리 회고 진행
      • 21:00 : 내일은 위한 휴식!
profile
학생입니다

0개의 댓글