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# 클래스 관리
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: 절대 검사하지 않음
⇒ 개발 단계에서는 켜두고, 배포 단계에서는 꺼두는 게 일반적
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과 함께 사용하여 게임 성능과 메모리 최적화를 극대화