본문으로 건너뛰기
게임 프로젝트 기초집LESSON 17

성능 기초: Object Pool과 불필요한 Update 호출 점검하기

난이도초급 프로젝트
예상 시간60분
선수지식16강 재시작과 최고 점수

17강. 성능 기초: Object Pool과 불필요한 Update 호출 점검하기

1. 이번 강의에서 해결할 문제​

빠른 생성과 긴 플레이에서 Instantiate·Destroy가 반복되고 비활성 택배가 이전 상태를 유지할 수 있습니다. 측정 가능한 반복 객체만 Pool로 교체합니다.

2. 학습 목표​

3. 핵심 개념​

Pool은 반복되는 동일 Prefab에 적합하지만 모든 객체에 필요한 것은 아닙니다. Unity의 ObjectPool<T>는 비어 있으면 생성하고 반환된 인스턴스를 재사용합니다. Pool 적용 전후는 같은 생성 간격과 플레이 시간에서 측정합니다.

4. 단계별 실습​

C# · 파일 경로: Assets/_Project/Scripts/Gameplay/PackagePool.cs

PackagePool.cs
using DeliverySorter.Data;
using UnityEngine;
using UnityEngine.Pool;

namespace DeliverySorter.Gameplay
{
public sealed class PackagePool : MonoBehaviour
{
[SerializeField] private PackageActor prefab;
[SerializeField, Min(1)] private int defaultCapacity = 12;
[SerializeField, Min(1)] private int maxSize = 40;
private ObjectPool<PackageActor> pool;

private void Awake()
{
pool = new ObjectPool<PackageActor>(
() => Instantiate(prefab, transform),
item => item.gameObject.SetActive(true),
item => item.gameObject.SetActive(false),
item => Destroy(item.gameObject),
collectionCheck: true,
defaultCapacity,
maxSize);
}

public PackageActor Get(PackageDefinition definition, Vector3 position, float speed, PlayfieldBounds bounds)
{
PackageActor item = pool.Get();
item.transform.SetPositionAndRotation(position, Quaternion.identity);
item.Initialize(definition, speed, bounds, Release);
return item;
}

private void Release(PackageActor item) => pool.Release(item);
}
}

C# · PackageActor.cs 변경 요점

PackageActor.cs
private System.Action<PackageActor> release;

public void Initialize(PackageDefinition definition, float speed, PlayfieldBounds bounds,
System.Action<PackageActor> releaseAction)
{
Definition = definition;
IsResolved = false;
release = releaseAction;
// Sprite, 색, 속도와 경계도 매번 초기화
}

public void Release() { release?.Invoke(this); release = null; }

GameSession의 Destroy(package.gameObject)를 package.Release()로 바꾸고 Spawner는 Instantiate 대신 pool.Get(...)을 호출합니다.

Unity Editor·Inspector 작업: PackagePool GameObject에 Prefab, Capacity와 Max Size를 연결합니다. Prefab의 비활성 상태와 Collider·Trail·애니메이션 초기화 항목을 목록으로 만듭니다.

테스트 작업: 0.1초 간격으로 3분 실행해 중복 Release 예외, 이전 색·속도·Resolved 상태가 남지 않는지 확인합니다. Profiler 수치는 PC 사양과 Scene 구성에 따라 달라짐을 기록합니다.

5. 코드가 동작하는 이유​

Get은 비활성 인스턴스를 활성화하고 Initialize가 모든 실행 상태를 새 값으로 덮습니다. 첫 판정 뒤 GameSession이 Release하여 Pool로 돌아갑니다. collectionCheck가 같은 객체의 중복 반환을 개발 중 발견합니다.

6. 자주 하는 실수와 해결법​

7. 직접 실습​

8. 이해 점검 질문 3개​

9. 핵심 요약​

MINI QUIZ

성능 기초: Object Pool과 불필요한 Update 호출 점검하기 미니 퀴즈

선택 즉시 정답과 해설을 확인할 수 있습니다. 결과는 이 브라우저에만 저장됩니다.

0 / 2
  1. 문제 1“성능 기초: Object Pool과 불필요한 Update 호출 점검하기”에서 다음 단계로 넘어가기 전에 확인할 핵심은 무엇인가요?
  2. 문제 2“성능 기초: Object Pool과 불필요한 Update 호출 점검하기”에서 ‘측정 없이 모든 객체 Pool’ 문제가 생겼습니다. 가장 알맞은 진단 또는 대응은 무엇인가요?
LESSON STATUS

학습을 마쳤나요?

직접 실습과 점검 질문까지 확인한 뒤 완료로 표시하세요.

17강. 성능 기초: Object Pool과 불필요한 Update 호출 점검하기 미완료 상태