본문으로 건너뛰기
게임 프로젝트 기초집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 호출 점검하기 미완료 상태