해당 포스팅은 Stuart Butler , Tom Oliver의 Game Development Patterns with Unreal Engine 5를 바탕으로 작성한 내용입니다.
Flyweight 패턴
플라이웨이트 패턴은 객체를 효율적으로 관리하고 메모리 사용을 최소화하기 위해 사용되는 디자인 패턴이다. 많은 객체를 만들어야 하지만, 객체마다 공통되는 데이터가 많을 때 특히 유용하다.
플라이웨이트 패턴을 사용하려면 먼저 다음 세 가지를 고려해야 한다.
내재적 데이터(Intrinsic Data)
공유 가능한 데이터로, 여러 객체가 동일하게 사용할 수 있는 정보 객체마다 중복될 필요가 없는 불변 데이터
예시
- 게임 타일의 텍스처, 속성
- 무기 아이템의 이름, 아이콘
- 파티클 효과의 기본 스프라이트 이미지
특징
- 메모리 절약 효과가 가장 큰 부분
- Flyweight 객체 내부에 저장
외재적 데이터(Extrinsic Data)
객체마다 고유한 데이터로, 공유할 수 없는 정보 각 객체가 다르게 가져야 하는 상태
예시
- 타일의 위치(x, y)
- 아이템 내구도, 강화 레벨
- 파티클의 위치, 회전, 크기
특징
- Flyweight 외부에서 관리하며 필요 시 주입
- 공유 객체(Flyweight)와 분리해 설계
메모리 비용(Memory Cost)
- 플라이웨이트 적용 여부를 결정하는 핵심 기준
- 많은 객체를 만들 때 메모리 사용량을 얼마나 줄일 수 있는가를 판단
- 공유 가능한 데이터가 충분히 많으면 적용 가치가 높음
- 너무 많은 고유 데이터가 존재하면 패턴 효과가 떨어짐
언리얼 엔진에서의 플라이웨이트 패턴
언리얼엔진은 기본적으로 프로젝트에 로드된 모든 에셋에 플라이웨이트 패턴을 적용한다.
필요할 때 한 곳에서 에셋을 참조하면 다른 모든 참조에서도 이 데이터를 공유하는 것이다. 따라서 로드된 특정 버전의 에셋을 변경해야 하는 경우, 플라이웨이트 패턴을 일부로 깨뜨려야 한다. 이런 작업이 필요한 예시로 다이내믹 머티리얼 인스턴스가 있다.