이 섹션은 런타임에 뮤터블을 사용하는 프로젝트와 관련 있습니다. 프로젝트가 언리얼 에디터에서 뮤터블만 사용하는 워크플로를 이용하면, 리소스가 추가로 사용되지 않습니다.
뮤터블(Mutable)은 런타임 때 CustomizableObjects로부터 에셋을 생성하는 데 사용되는 플러그인이며, 뮤터블을 실행하려면 다음과 같은 추가 리소스가 필요합니다.
- CPU 시간:
- 대부분의 CPU 로딩 시간은 작업자 스레드에서 발생합니다. 이는 언리얼 태스크 시스템을 사용하여 작업을 여러 태스크로 나눕니다.
- 일부 소량 작업은 게임 스레드에서도 발생합니다. 이러한 작업은 히치를 피할 만큼 충분히 작아야 합니다.
- 메모리:
- 뮤터블이 생성한 최종 에셋은 텍스처, 스켈레탈 메시, 애니메이션 블루프린트 같은 일반 언리얼 엔진 리소스입니다.
- 뮤터블은 이러한 리소스를 빌드할 때 중간 작업을 위한 '작업 메모리'가 필요합니다.
- 디스크 스트리밍 대역폭:
- 뮤터블은 캐릭터를 계속 만들면서 자체 데이터를 로드합니다. 여기서 언리얼 디스크 스트리밍 시스템이 사용됩니다.
CPU와 메모리 사용량 모두를 위한 뮤터블용 언리얼 인사이트 채널이 있습니다. 이러한 채널은 기본적으로 비활성화되어 있지만, 활성화하면 런타임 때 수행된 작업 상황을 잘 파악할 수 있습니다.
뮤터블 작업
인스턴스 작업이나 업데이트 같은 모든 뮤터블 작업은 순차적으로 작동하며, 절대로 2개 이상의 작업이 동시에 진행되지 않습니다. 이러한 이유로 모든 작업은 비동기로 처리되며, 작업 완료를 알리는 콜백이 있습니다.
명시적 호출은 CustomizableObjectInstance의 파라미터가 변경되면 강제로 업데이트를 적용합니다. 뮤터블이 업데이트 작업을 완료하면, 엔진 리소스가 생성되거나 대체됩니다.
뮤터블은 언리얼의 텍스처 스트리밍 기능과 통합될 수 있습니다. 이렇게 통합할 때는 텍스처 스트리밍 시스템이 새로운 텍스처 밉맵을 요청할 때마다 뮤터블 큐가 작동합니다. 이는 일반 인스턴스 업데이트에서도 순차적으로 발생합니다.
메모리 및 캐시
뮤터블이 사용하는 작업 메모리 양은 빌드 중인 CustomizableObject의 영향을 직접적으로 받습니다. 추정 상한은 무압축 포맷으로 생성된 최대 텍스처나 최대 메시 메모리의 2배 정도입니다. 이러한 상한은 텍스처에 한 작업, UV 레이아웃 블록의 사용 유무, CustomizableObject 컴파일 세팅에 따라 달라집니다.
뮤터블은 작업 메모리를 일정 한도 아래로 유지하려 합니다. 이러한 한도는 플랫폼별 INI 파일에 지정할 수 있지만, 프로젝트에 따라서는 다양한 게임 속 시나리오에 맞춰 한도를 조정해야 할 수 있습니다. 예를 들어, 플레이어가 캐릭터 생성 화면에 있을 때는 데이터를 캐시하고 인스턴스 업데이트 속도를 높이기 위해 뮤터블에 더 많은 메모리를 허용하는 것이 좋을 수 있습니다. 이러한 경우, UCustomizableObject::SetWorkingMemory 메서드나 mutable.WorkingMemory CVar를 사용하여 직접 설정할 수 있습니다.