2026. 1. 28. 21:22ㆍ본 캠프


EventBus 구조를 설계했을 때 WeakRefernce로 구독자/콜백을 감싼 형태를 왜 구성했는지에 대해 기술하기 위해서
프로파일러를 켜봤는데, 이 정보에서는 주로 그래픽관련된 부분이 많이 표시됐기 때문에 '메모리 프로파일러' 라는 별도의 패키지를
설치해서 확인하는 과정을 거쳤다.

메모리프로파일에서 내가 찾고자 하는 부분은 첫번째로 만든 기능인 상세보기 기능에서 EventBus 구조를 통해 얼마나 메모리/수명 관리를 잘 했는지에 대한 여부를 확인하고자 했다.
인게임 시스템과 UI가 합쳐진 기능이기 때문에 가장 효과적으로 기술할 수 있는 부분이라고 생각했다.
C#의 일반적인 이벤트/델리게이트 구독은 구독자를 강한참조로 붙잡는데
Unity에서 씬 전환, 오브젝트 Destory, Enable/Disable이 잦아져서 구독 해제가 누락되게 되면
파괴된 MonoBehaviour가 GC 대상이어도 이벤트 버스가 참조를 들고 살아남는 문제로 인해 런타임 오류가 생기거나 반복진입에서 구독이 누적되면서 메모리가 쌓일 위험이 있다.
그래서 EventBus가 구독자를 WeakReference<Action<T>>형태로 감싸게 되면 EventBus가 구독자 객체의 수명을 강제로 연장하지 않게 만들 수 있고, 실수로 구독해제를 누락하거나 예외 흐름, 파괴 순서 꼬임에 대한 안전장치가 된다.

실제로 런타임에서 EventBus가 이벤트 타입별 핸들러를 WeakReference형태로 보관하는 패턴이 생성된 걸 볼 수 있다.

상세보기 0회 진입/ 상세보기 20회 진입 스냅샷의 비교를 보면 Count In A 에서 B로 갔을 때 오히려 감소하고 있는 걸 볼 수 있다.
특별히 구독 누락 상황에서의 안전망 효과는 실험해보지 않았기에 반복하는 시점에서 누적 증가가 없다는 점이 고무적이다.
특히 지금의 프로젝트는 날짜가 전환 됐을 때 신을 재로딩하고 튜토리얼 신, 엔딩 신 등이 있다보니 신 전환이 자주 일어나서
어느정도 효과가 있었다고 볼 수 있다.
'본 캠프' 카테고리의 다른 글
| [내일배움캠프 본 캠프 마지막] 최종 프로젝트 발표 (0) | 2026.02.02 |
|---|---|
| [내일배움캠프 본 캠프 86일차] QTE_6 (0) | 2026.01.29 |
| [내일배움캠프 본 캠프 84일차] 모의면접 마지막 회고 (0) | 2026.01.27 |
| [내일배움캠프 본 캠프 83일차] 타임라인 사용하기 (0) | 2026.01.26 |
| [내일배움캠프 본 캠프 82일차] QTE_5 (0) | 2026.01.23 |