UDN
Search public documentation:

MobileLoadTimesAndInstallPackageSizeKR
English Translation
中国翻译

Interested in the Unreal Engine?
Visit the Unreal Technology site.

Looking for jobs and company info?
Check out the Epic games site.

Questions about support via UDN?
Contact the UDN Staff

모바일 로드 시간과 인스톨 패키지 크기

문서 요약: 모바일 어플리케이션 로드 시간과 최종 인스톨 파일 크기를 줄이는 데 흔히 쓰이는 방법에 대한 글입니다.

문서 변경내역: Bryant Freitag? 작성. 홍성진 번역.

개요


어플리케이션 로드 시간과 인스톨 크기를 줄이기 위해 흔히 사용되는 방법에 대한 글입니다.

로드 시간


셰이더


종종 모바일 플랫폼에서 스타트업 시간을 크게 차지하는 요소는 셰이더 컴파일입니다. 일반적으로 게임플레이 도중에는 이런 작업이 불가능한데, 컴파일 시간이 버벅이는 것으로 보일 것이기 때문입니다. 이러한 버벅임을 해결하기 위해 언리얼 엔진에서는 스타트업 시간에 대부분의 셰이더를 '워밍(warm)'하여 필수적인 컴파일과 셰이더 패치 단계를 시스템에서 미리 컴파일하여 렌더링할 수 있도록 하고 있습니다. 현재 모바일 디바이스에서는 추후 직접 바이너리를 로드할 수 있도록 미리 컴파일/워밍된 셰이더를 저장할 수 있는 기능을 제공해 주고 있지 않습니다.

셰이더 키

UE3 모바일 플랫폼에서의 셰이더는 고유 셰이더 키로 구분됩니다. 이러한 구현 내용에 대한 설명은 모바일 머티리얼 참고서의 해당 부분을 참고해 주시기 바랍니다. 셰이더 키의 수를 줄인다는 것은 어플리케이션의 머티리얼 총 갯수를 줄이는 것으로 간단히 해결되는 문제가 아닌데, 머티리얼은 일정한 세팅에 따라 다양한 키를 만들어 낼 수 있기 때문입니다.

셰이더 키 줄이기


모바일 셰이더 분석기 (MobileShaderAnalyzer)

MobileShaderAnalyzer 툴은 어플리케이션이 셰이더 키를 몇 개나 생성하는가, 어느 머티리얼에서 생성되었는가, 머티리얼을 어떻게 변경해야 키를 줄일 수 있는가 등을 측정하는 데 도움이 됩니다. 이 툴 사용법 관련 정보는 위의 링크를 참고해 주시기 바랍니다.

중복 키

MobileShaderAnalyzer 문서에 언급했듯이, 머티리얼이 어떻게 사용되는지 엔진은 알지 못하기 때문에 일부 세팅에는 여러가지 중복 버전이 있을 수 있습니다. 이러한 머티리얼의 의도를 명시적으로 엔진에 알려주므로써 어플리케이션에서 중복된 것을 다수 제거할 수 있습니다:

  • 스키닝(Skinning). 반드시 스킨을 입힌 메시에만 사용된다 알고있는데 셰이더가 스킨을 입힌 버전과 입히지 않은 버전 둘 다 보인다면, 어플리케이션의 DefaultEngine.ini 내 MobileMaterialCookSettings 섹션 아래 그 머티리얼 이름을 ‘+SkinningOnlyMaterials=’ 줄로 추가해 주면 됩니다. 그러면 쿠킹할 때 이 셰이더는 스킨을 입힌 버전만 생성되어, 이 머티리얼이 생성하는 키의 수를 바로 절반으로 줄일 수 있습니다. 예:

  [MobileMaterialCookSettings]
  +SkinningOnlyMaterials=M_FireChest
  +SkinningOnlyMaterials=M_IceChest
  

  • 포그(Fog). 타이틀에 포그를 사용하도록 설정하면, 엔진은 포그 있는 셰이더와 없는 셰이더를 생성한 다음, 가능한 상황에서는 포그 없는 셰이더로 렌더링하는 식으로 퍼포먼스를 높이고 있습니다. 포그 버전 셰이더를 항상 사용해도 퍼포먼스상에 무리가 없는 경우라면, 어플리케이션 DefaultSystemSettings.ini 의 [SystemSettings] 섹션 아래 bMobileMinimizeFogShaders=true 설정을 추가하여 이러한 셰이더 중복을 피할 수 있습니다.
  • 파티클(Particle) 세팅. 셰이더 안에서 on/off 상태 중복을 하게 만드는 파티클 세팅이 다수 있습니다. 활용하지 않겠다 싶은 키 세팅 토글을 확인한 경우, 머티리얼에서 그 기능을 꺼 주세요.

머티리얼 인스턴스 불변 (MaterialInstanceConstant)

셰이더 키 생성을 최소화시키기 좋은 방법은 마스터 머티리얼과 머티리얼 인스턴스 불변(MIC)을 가급적 많이 사용하는 것입니다. 자손 머티리얼의 MIC 는 변경해도 마스터 머티리얼에서 생성되는 셰이더 키에 순열이 새로 추가되지 않습니다. 콘텐츠 저작 초기부터 마스터 머티리얼을 사용하도록 하면 프로젝트 후반부에 셰이더 키가 폭발적으로 증가하는 현상을 방지할 수 있습니다. 자세한 정보는 머티리얼 인스턴스 페이지를 참고해 주시기 바랍니다.

추가적인 셰이더 키 고려사항


셰이더 그룹

셰이더 그룹이 셰이더 키를 줄이는 데 직접적인 도움이 되지는 않지만, 키 워밍 일정 부분집합을 어플리케이션 내 다른 지점으로 유예시키는 것이 가능합니다. 가장 흔한 예라면 맵 로딩입니다. 앱에서 각 레벨에 대해 셰이더 그룹을 간단하게 만들 수 있으며, 그러면 쿠커는 해당 맵에 대한 모든 키를 자체 셰이더 그룹에 추가시키고 그 레벨이 로드될 때 해당 키를 자동으로 워밍시켜 줍니다. 물론 맵 로딩 시간이야 약간 늘어나겠지만, 보통 전체적인 어플리케이션 로딩 시간은 현저히 줄어들 것입니다. 맵별 셰이더 그룹 생성은 Engine.ini 파일의 MobileShaderGroups 섹션을 통해 다음과 같이 이루어집니다:

   [Engine.MobileShaderGroups]
  .ShaderGroup=MyGroup
  .Package=MyMapName
  

MyMapName 맵에 레퍼런스된 셰이더는 "MyGroup" 셰이더 그룹에 추가되고, 맵을 로드할 때 그 셰이더도 같이 컴파일되고 워밍됩니다. 셰이더 그룹 생성은 게임 쿠커 헬퍼(를 작성해 뒀다면 거기)에서 동적으로도 가능합니다:

  
  Commandlet->AddDynamicMobileShaderGroup(FName(*GroupName), FName(*PkgFilename));
  
  

게임 도중 셰이더 컴파일이 필요하면 다음과 같이 호출해 줍니다:

  
  GMobileShaderInitialization.StartCompilingShaderGroup(FName(*ShaderGroupName), TRUE);
  
  

이러한 컴파일 작업은 버벅임이 보이지 않도록 로딩 화면이나 고정된 UI 화면이 떴을 때 하는 것이 좋습니다.

워밍되지 않은 키

참고로 엔진이 자동으로 워밍해 주지 않는 셰이더 키가 있을 수도 있는데, 주로 엔진 렌더링 파이프라인에 써드 파티 소프트웨어가 묶여 있는 경우가 그렇습니다. 그러한 키는 다음과 같이 DefaultEngine.ini 파일에 수동 추가해 주면 스타트업 때 워밍되도록 할 수 있습니다:

  [Engine.StartupShaderKeys]
  .Key=0x1980000000_0x3000000000000000
  

부팅 시간 프로파일링

부팅 시간 프로파일링 관련 꼼수는 프로파일링 기초 문서를 참고해 주시기 바랍니다.

어플리케이션 크기


여기서는 최종 어플리케이션 패키지의 전체적인 크기를 알아내고 줄이기 위해 사용되는 방법과 툴에 대해 알아보겠습니다.

IPA Viewer (iOS)


iOS 디바이스의 경우 최종 실행파일 패키지는 하나의 .ipa 패키지로 컴파일되어 디바이스에 설치됩니다. UE3/UDK 의 Binaries 폴더에 있는 IPAExamine.exe 프로그램은 IPA 파일에 포함된 여러가지 파일의 크기 분석 보고서를 생성하는 데 사용되는 명령줄 어플리케이션입니다. 다음과 같이 입력하면 이 툴의 자세한 도움말을 얻을 수 있습니다.

  IPAExamine /?
  

명령줄에 입력하면 됩니다. 가장 단순한 사용법은 이렇습니다:

  IPAExamine <full path to your ipa file>
  

그러면 IPA 내용이 확장자별로 나열되며, 각 확장자 유형별 크기 분석 도표도 같이 확인할 수 있습니다. 보통 전체적인 크기를 줄이는 데 있어 어떤 부분의 데이터를 목표로 삼을 것인지 파악하기에는 이 단계로 충분합니다.

참고로 시스템 세팅 ini 에서 MobileFlashRedForUncachedShaders 불리언 옵션을 켜 주면 실행시간에 워밍되는 셰이더가 있는지 감지할 수 있습니다.

쿠킹된 데이터 조사하기


인스톨 패키지 크기 감소를 위한 대상 영역을 알아내고 난 이후에는, 콘텐츠를 파고들어가 어떤 애셋이 주범인가 구체적으로 알아내고 싶을 것입니다. 종종 메시나 텍스처 데이터가 주범입니다. 다음의 툴로 그러한 경우인지, 각각을 파들어가는 데 도움이 됩니다:

유용한 커맨드렛

PkgInfo

쿠킹된 패키지 (.xxx) 파일의 콘텐츠를 조사하기 위해서는 PkgInfo 커맨드렛을 사용하면 되며, 자세한 내용은 커맨드렛 명령 목록 페이지를 참고해 주시기 바랍니다. 예를 들어 다음 명령의 출력은:

  
  Gamename.exe PkgInfo <path to package> -exports –simple –platform=<platform> > myfile.txt
  
  

엑셀로 간단히 임포트하여 패키지 내용을 보다 깊이 분석할 수 있습니다. 패키지에 어느 애셋이 왜 들어오게 되었는가 잘 모르겠는 경우, Find Asset Referencers 커맨드렛 을 사용하거나, 언리얼 에디터에서 (먼저 모든 패키지가 로드되었는지 확인한 후) '이 오브젝트를 레퍼런스하는 오브젝트 나열' 을 선택하면 해당 정보를 얻을 수 있습니다.

Mine Cooked Packages

또 한가지 쓸만한 툴은, 빌드용으로 쿠킹된 대부분 애셋에 대한 데이터로 SQL DB 를 채우는 MineCookedPackages 커맨드렛입니다. 자세한 설명은 위의 링크에서 확인하시기 바랍니다.

Mine TFC Data
Mine TFC Data 커맨드렛은 매우 강력하긴 하나 현재 에디터에서 텍스처에 설정하는 LODBias 세팅이나, DefaultSystemSettings.ini 파일의 텍스처 그룹 세팅때문에 생긴 텍스처 변경사항을 고려치 않는다는 단점이 있습니다 (디바이스별 세팅은 실행시간에 고려 대상이 되는 반면, '기본' 세팅은 쿠킹 도중 사용됩니다). engine.ini 의 [TextureStreaming] 섹션에 MinTextureResidentMipCount 가 0 (모바일 개발의 경우 기본값)으로 설정된 경우, 쿠킹된 텍스처는 전부 TFC 파일 안에 상주하게 됩니다. 이러한 사실을 안다면, .tfc 파일에 추가되는 텍스처 세부사항이 기록된 로그 파일을 만들어 최종 텍스처 명세서로 사용할 수 있습니다. 그러기 위해서는 쿠커 커맨드렛에 -WriteTFCReport 옵션을 붙여 모든 데이터를 풀 리쿠킹하면 됩니다. 그러면 게임 폴더에 (TFC_Generation_Report.txt 라는) CSV 파일이 출력되며, 쿠킹된 모든 텍스처 레이어에 대한 세부사항이 패키지와 크기별로 나열됩니다.