Company
교육 철학

Reference Pooling (레퍼런스 풀링)

Reference Pooling (레퍼런스 풀링)

Relevant source files (관련 소스 파일)
Scripts/Editor/Inspector/ObjectPoolComponentInspector.cs
Scripts/Editor/Inspector/ReferencePoolComponentInspector.cs
Scripts/Editor/Inspector/ReferencePoolComponentInspector.cs.meta
Scripts/Runtime/Debugger/DebuggerActiveWindowType.cs
Scripts/Runtime/Debugger/DebuggerComponent.ObjectPoolInformationWindow.cs
Scripts/Runtime/Debugger/DebuggerComponent.ReferencePoolInformationWindow.cs
Scripts/Runtime/Debugger/DebuggerComponent.ReferencePoolInformationWindow.cs.meta
Scripts/Runtime/Debugger/DebuggerComponent.RuntimeMemoryInformationWindow.cs
Scripts/Runtime/Debugger/DebuggerComponent.RuntimeMemorySummaryWindow.cs
Scripts/Runtime/Debugger/DebuggerComponent.cs
Scripts/Runtime/ReferencePool.meta
Scripts/Runtime/ReferencePool/ReferencePoolComponent.cs
Scripts/Runtime/ReferencePool/ReferencePoolComponent.cs.meta
Scripts/Runtime/ReferencePool/ReferenceStrictCheckType.cs
Scripts/Runtime/ReferencePool/ReferenceStrictCheckType.cs.meta

Purpose and Overview (목적 및 개요)

Reference Pooling은 Game Framework의 메모리 최적화 시스템으로, C# 참조 타입 객체를 효율적으로 관리합니다.
Object Pooling: Unity의 GameObject 인스턴스 관리
Reference Pooling: 가벼운 C# 클래스 관리
즉, GameObject가 아닌 순수 C# 객체를 풀링하여 생성/삭제 대신 재사용함으로써 GC 오버헤드를 줄이고 성능을 향상시킵니다.

System Architecture (시스템 아키텍처)

Reference Pooling 시스템은 다음과 같은 주요 구성요소로 이루어져 있습니다:
ReferencePool
정적 클래스. 타입별로 참조 객체 풀을 관리
ReferencePoolComponent
Unity 컴포넌트. 레퍼런스 풀 시스템을 초기화 및 설정
IReference Interface
풀링 대상 클래스가 반드시 구현해야 하는 인터페이스
(특히 Clear() 메서드 필수)
ReferenceStrictCheckType
Enum. 엄격 검사(Strict Check) 실행 조건 정의
Sources:
ReferencePoolComponent.cs
ReferenceStrictCheckType.cs

Object Lifecycle (객체 생명주기)

레퍼런스 풀 객체는 다음 단계를 거칩니다:
1.
클라이언트가 T 타입 객체 요청
풀에 미사용 객체가 있으면 반환
없으면 새 인스턴스 생성
2.
클라이언트 사용 완료 후 Release() 호출
3.
객체의 Clear() 메서드 실행 → 상태 초기화
4.
객체는 다시 풀에 보관, 재사용 가능
Sources:
ReferencePoolComponentInspector.cs
DebuggerComponent.ReferencePoolInformationWindow.cs

Setting Up Reference Pooling (레퍼런스 풀링 설정)

Configuration (설정)

ReferencePoolComponent를 통해 Strict Checking 동작을 설정할 수 있습니다.
AlwaysEnable: 항상 검사 수행
OnlyEnableWhenDevelopment: 개발 빌드에서만 수행
OnlyEnableInEditor: Unity 에디터에서만 수행
AlwaysDisable: 절대 검사하지 않음
Strict Checking은 잘못된 객체 사용을 잡아내지만 성능에 영향을 줌
⇒ 개발 단계에서는 켜두고, 배포 단계에서는 꺼두는 게 일반적
Sources:
ReferenceStrictCheckType.cs
ReferencePoolComponent.cs

Creating Poolable Classes (풀링 가능한 클래스 생성)

풀링 가능한 클래스를 만들려면 반드시 IReference 인터페이스를 구현해야 합니다.
Clear() 메서드 구현
객체가 풀에 반환될 때 상태 초기화
외부 참조(예: static, 다른 객체 strong reference) 보관 금지
→ GC 방해 방지
그 후, ReferencePool을 통해 인스턴스 획득 및 반환 가능

Monitoring and Debugging (모니터링 및 디버깅)

Reference Pool Information Window

DebuggerComponent의 일부
레퍼런스 풀 상세 통계를 실시간 표시
표시 내용:
풀별 객체 개수
사용 중 / 재사용 가능 상태
획득/반환 통계
메모리 사용량
Sources:
DebuggerComponent.ReferencePoolInformationWindow.cs

Editor Inspector

Unity Editor에서 ReferencePoolComponentInspector를 통해 확인 가능
현재 EnableStrictCheck 상태 표시
Play 모드 시 전체 풀 통계 표시
CSV로 내보내기 지원
클래스 이름 전체 표시 옵션
Sources:
ReferencePoolComponentInspector.cs

Performance Considerations (성능 고려사항)

시나리오
풀링 없음
풀링 있음
메모리 사용
생성/삭제 반복 → 높음
재사용 → 낮음
GC 압박
잦은 할당 → 높음
적은 할당 → 낮음
CPU 부하
GC 시 스파이크 발생
일정한 성능 유지
주의사항:
Strict Checking은 개발용 (성능 저하 유발)
너무 큰 풀은 메모리 낭비
반드시 Release() 호출 필요 (안 하면 사실상 메모리 누수)
Clear()는 모든 상태를 초기화해야 함

Integration with Other Systems (다른 시스템과의 통합)

Framework의 여러 시스템에서 Reference Pooling을 내부적으로 사용합니다:
이벤트 시스템의 이벤트 인자
네트워크 메시지 객체
UI 시스템의 커맨드 객체
임시 데이터 컨테이너
즉, Framework 전반 성능 최적화의 핵심 인프라

Best Practices (모범 사례)

1.
IReference 올바르게 구현
Clear()에서 모든 상태 초기화
2.
풀 크기 균형
미리 너무 많이 할당하지 말고, 수요에 맞게 확장
3.
정기 모니터링
내장 디버깅 툴로 풀 상태 확인
4.
객체 수명 고려
짧게 자주 생성/삭제되는 객체에 특히 효과적
5.
두 풀링 시스템의 적절한 활용
Object Pooling → GameObject
Reference Pooling → Lightweight C# class
정리하면,
Reference Pooling은 Unity GameObject가 아닌 순수 C# 객체 관리를 최적화하는 시스템
Object Pooling과 함께 사용하여 게임 성능과 메모리 최적화를 극대화