지원되는 모든 플랫폼에서 섬이 실행되도록 포트나이트에서는 일부 메모리 제한을 적용하고 있습니다.
포트나이트 언리얼 에디터(Unreal Editor for Fortnite, UEFN)에서는 메모리 기능이 확장되어 더 크고 다양한 경험을 제작할 수 있습니다. 이 기능을 모두 활용하려면 UEFN에서 메모리 사용량이 계산되는 방식을 이해하는 것이 도움이 됩니다.
World Partition(월드 파티션)
월드 파티션(World Partition)은 대규모 섬 경험을 제작하는 데 핵심적인 역할을 합니다. 이 기능은 자동으로 월드를 그리드로 나누며, 필요한 셀만 스트리밍합니다.
또한 월드 파티션은 셀을 로드하고 언로드하는 스트리밍과 플레이어 카메라가 에셋에서 멀어질수록 에셋의 디테일을 그룹화하고 그 양을 줄이는 계층형 레벨 오브 디테일(Hierarchical Level of Detail, HLOD)을 활용합니다.
월드 파티션, 스트리밍, HLOD에 대한 자세한 내용은 스트리밍 및 HLOD를 참고하세요.
메모리 계산 방식
UEFN에서는 쿠킹 시간에 생성된 데이터에서 메모리 사용량을 계산합니다. 이는 다음과 같은 의미입니다.
대규모 섬에서 결과물을 빠르게 얻을 수 있습니다.
동일한 섬 버전, 포트나이트 빌드, 장치에서 계산을 실행할 때마다 일관된 수치를 얻을 수 있습니다.
더 많은 에셋 타입 및 씬 그래프로 지원을 확대했습니다.
UEFN의 메모리 계산 시스템은 편집 시간에만 실행되므로, 플레이 시간에서 메모리 사용량을 평가하는 데 사용할 수 없습니다. 이는 섬의 기준 메모리 사용량이 합리적인 한계치를 초과하지 않도록 확인하는 데 사용됩니다.
하지만 커스텀 런타임 로직이 있으면 메모리 사용량이 커질 수 있으며, 이로 인해 플레이어에게 문제가 발생하고 섬을 플레이하는 능력이 제한될 수 있습니다. 플레이 시간에서 섬의 메모리 사용량과 성능을 더 잘 이해하고 플레이어가 안정성 및 퍼포먼스 문제를 겪지 않도록 공간 프로파일러를 사용할 것을 권장합니다.
세션 레이아웃
세션에 로드되면 HUD에 현재 메모리 사용량(Current Memory Usage) 바가 표시됩니다.
이 바는 최대 100,000 메모리 유닛을 표시하여 섬의 메모리 사용량을 간략하게 보여줍니다.
스트리밍이 활성화된 상태에서 메모리는 섬의 모든 에셋이 사용하는 총 메모리가 아니라 섬 내 플레이어의 위치에 따라 계산됩니다. 메모리 계산을 수행하면 각 스트리밍 셀의 가장 정확한 메모리 사용량 값을 확인할 수 있습니다.
일부 에셋은 플레이어 위치와 관계없이 메모리에 유지되므로 맵 어디에 있든 메모리 사용량에 추가됩니다. 대부분의 에셋은 스트리밍 인/아웃할 때 로드 및 언로드되며 현재 메모리 사용량 바가 이를 반영해 업데이트됩니다.
장치, 랜드스케이프, 커스텀 메시, 텍스처 등 레벨에서 레퍼런스되는 모든 에셋은 총 메모리 사용량에 합산됩니다.
레벨에서 100,000 유닛을 초과하는 영역이 있는 경우 섬을 퍼블리싱할 수 없습니다.
UEFN 사용자는 퍼블리싱하지 않는 한 10만 표시기 제한을 초과할 수 있습니다. 콘솔에서 협업하는 사용자들의 경우에는 가용 메모리 하드웨어 제한에 걸려 세션에서 추방될 수 있습니다. 문제가 해결되면 다시 연결할 수 있습니다.
콘텐츠 변경사항 적용하기
시스템이 메모리 사용량을 정확하게 계산하기 위해서는 쿠킹된 최신 데이터가 필요합니다. 라이브 편집 또는 휴대폰 도구를 사용하여 콘텐츠를 변경하고 나면, 편집 모드에 최신 상태(Up to Date)로 표시되어도 변경사항 푸시(Push Changes) 메시지가 표시됩니다. 이는 라이브 편집에서 메모리 계산에 사용된 쿠킹된 데이터를 업데이트하지 않았기 때문입니다.
변경사항을 푸시하기 전까지 사용량 바가 계속 업데이트되지만 이전 값을 표시하며, 콘텐츠 수정 비용이 반영되지 않습니다.
메모리 계산 실행
섬을 성공적으로 퍼블리싱하려면 모든 지원 하드웨어 플랫폼에서 실행할 수 있어야 합니다.
퍼블리싱하기 전에 프로젝트가 메모리 제한을 초과하지 않는지 확인하는 것이 중요합니다. 프로젝트(Project) 드롭다운에서 메모리 계산 실행(Launch Memory Calculation)을 선택합니다
이 프로세스는 모든 셀에서 사용되는 메모리를 계산합니다.
프라이빗 버전 업로드를 알리는 대화창이 표시됩니다. 버튼을 클릭해 프로그레스 바를 확인하세요.
선택 사항으로 프로젝트 버전에 대한 설명을 추가할 수 있습니다.
화면 하단에 메모리 계산이 진행 중이라는 알림이 표시됩니다.
업로드가 완료되면 알림 창은 계산이 시작되었다는 걸 나타내는 화면으로 바뀝니다.
클라이언트에서는 메모리 계산 결과가 표시됩니다. 계속(Continue)을 누르면 플레이어 캐릭터를 조작할 수 있게 됩니다.
계산이 끝나면 플레이어 캐릭터는 계산이 시작되기 전 원래 위치로 순간이동되며 다음과 같은 두 가지 상태 중 하나를 확인할 수 있습니다.
프로젝트에서 스트리밍(Streaming)을 적용했다면 자유롭게 날아다니면서 여러 영역이 차지하는 공간의 크기를 볼 수 있습니다.
스트리밍이 적용되었다면 플라이스루 동안 메모리 사용량 바가 어떻게 변하는지 확인해 보세요. 이를 사용하여 레벨에서 메모리 사용량이 계획보다 많은 영역을 식별할 수 있습니다.
섬이 메모리를 계획보다 많이 사용하는 경우 퍼블리싱하기 전에 로컬 메모리 이슈를 해결해야 합니다.
섬의 예산이 초과된 경우 해결 방법
제한에 도달했을 때 메모리를 절약하는 전략은 다양합니다. 다음과 같은 방법을 시도해볼 수 있습니다.
메모리 계산 후 섬에서 메모리를 가장 많이 차지하는 에셋 100개가 정리된 시트를 확인할 수 있습니다. 창(Window) > 메시지 로그(Message Log) > 메모리 테스트 결과(Memory Test Results)를 선택하면 됩니다.
아래 표에 각 용어가 정의되어 있습니다.
용어 설명 리소스(Resource)
보통 콘텐츠 브라우저에 있는 에셋의 이름입니다. 일부 리소스는 'Fortnite Asset'으로 표시될 수 있는데, 이는 크리에이터의 프로젝트에서 작성되지 않은 리소스에 할당된 이름입니다. 섬의 메모리 사용량에는 그대로 합산됩니다.
타입(Type)
리소스/에셋의 유형으로, 텍스터, 머티리얼, 레벨 등이 있습니다.
액터 레퍼런스 수(# Actor Refs)
리소스를 직간접적으로 참조하는 액터의 수입니다.
패키지 레퍼런스 수(# Package Refs)
리소스를 참조하는 쿠킹된 패키지의 수입니다. 리소스가 여러 월드 파티션 셀에서 참조되는 경우 일반적으로 이 수치가 증가합니다.
크기(Size)
리소스의 크기로, 샘플링된 위치에서 특정 리소스가 현재 메모리 사용량 바에서 차지하는 양을 나타냅니다.
가능하면 텍스처를 스트리밍하세요. 즉, 텍스처를 스트리밍에 적합하게(2의 거듭제곱 크기로) 작성하고 밉맵이 생성되도록 텍스처를 구성하세요. 텍스처를 스트리밍할 수 없는 경우, 얼마나 멀리까지 사용되는지에 관계없이 텍스처는 항상 메모리를 최대로 사용합니다. 추가 정보는 텍스처 크기 조절하기에서 찾을 수 있습니다.
월드 파티션 패널에서 스트리밍을 켜기로 설정하세요. 큰 섬의 경우 반드시 해야 하지만, 작은 섬에서도 특히 콘텐츠가 너무 밀집된 경우 스트리밍의 장점을 누릴 수 있습니다.
스트리밍을 켤 때 가능하면 '액터에서 공간적으로 로드되었는지 여부(Is Spatially Loaded)'를 활성화하세요. 활성화하지 않으면 메인 레벨 패키지에 쿠킹되어 항상 로드됩니다. 이 옵션은 랜드스케이프 스트리밍 프록시 액터에서 특히 유효한데, 이러한 액터는 보통 요청 시 스트리밍하는 것이 좋은 콜리전 데이터를 많이 포함하고 있기 때문입니다.
섬에 콘텐츠를 고르게 분포시킵니다. 작은 영역에 너무 많은 액터가 집중되면 콘텐츠가 스트리밍되지 않을 수 있으며, 메모리 예산 초과에 영향을 미칠 수 있습니다.
섬에서 사용하는 장치 수를 줄입니다. 장치는 배치할 수 있는 액터 중 가장 비용이 많이 듭니다. 그러나 같은 장치를 인스턴스로 배치하면 메모리 비용을 대폭 줄일 수 있습니다.
프로젝트 크기(Project Size) 창을 살펴봅니다. 디스크에 메모리를 많이 차지하는 오브젝트가 있다면 런타임에서도 메모리를 많이 소모할 가능성이 높습니다. 프로젝트 크기를 확인하려면 프로젝트 드롭다운 메뉴를 클릭하고 프로젝트 크기를 선택합니다.
커스텀 에셋 LOD에서 퀄리티 레벨을 줄입니다. 특히 에셋이 먼 거리에서만 보일 경우 이렇게 하면 좋습니다.
에셋을 여러 번 재사용하세요. 100개의 나무로 구성된 숲에서 100개의 고유한 나무를 사용하는 대신 5가지 베리에이션을 사용하고 복제합니다. 이렇게 하면 메모리에 미치는 영향이 크게 줄어듭니다.
HLOD를 사용하는 경우 프로젝트 프로세스를 통해 생성하고, 멀리서 볼 수 있는 오브젝트에 대해서만 생성되게 합니다.
섬을 모두 동시에 표시하지 않아도 되는 구성으로 나눌 수 있는 경우 데이터 레이어를 활용하세요. 예를 들면 플레이어가 신전에 들어가지 않으면 접근할 수 없는 지하 던전과 같은 경우가 있습니다.
커스텀 콘텐츠의 메시 복잡도를 낮춥니다. 하이 폴리 메시는 메모리 비용을 증가시킵니다. 콘텐츠 브라우저에서 메시를 더블클릭하여 편집하고, 나나이트 세팅(Nanite Settings)의 트라이앵글 퍼센트 유지(Keep Triangle Percent) 값을 조정합니다. 낮은 값을 사용하면 메시의 복잡도가 낮아지고 액터의 메모리 비용도 줄어듭니다.
기타 문제 해결하기
적절한 유효성 검사를 위해 크리에이터는 스트리밍을 활성화하고, 텍스처의 밉맵을 생성해야 합니다. MipGenSettings 옵션이 밉맵 없음(No Mipmaps)으로 설정된 텍스처가 있는 경우, 지금까지는 퍼블리싱을 위해 섬을 제출할 때 플래그가 지정되지 않았습니다. 하지만 이제는 프로젝트에서 MipGenSettings가 '밉맵 없음'으로 설정된 텍스처가 있으면 유효성 검사에 실패합니다.
스트리밍 및 밉맵 요구사항에서 예외는 다음과 같습니다.
이 규칙은 텍셀이 100만 개를 초과하는 텍스처에만 적용됩니다. 예를 들어 텍스처의 치수를 곱했을 때 1,048,576 미만이면, MipGenSettings가 밉맵 없음으로 설정되어 있어도 유효성 검사를 통과합니다.
UI 그룹의 텍스처는 스트리밍을 활성화할 필요가 없습니다.