언어:
페이지 정보
태그:
수준별:
엔진 버전:
언리얼 엔진

APK 패키지 크기 줄이기

언리얼 엔진

Android 디바이스를 타깃으로 하는 UE4 프로젝트라면 어떤 유형이든, Android 어플리케이션 패키지 (APK) 파일 크기를 Google 플레이 스토어의 50MB 제한 내로 줄이는 것이 난제가 될 수 있습니다. 이 튜토리얼에서는 UE4 에디터에 제공된 툴만을 사용해서 프로젝트의 최종 APK 패키지 크기를 최대한 줄이는 데 도움이 될 수 있는 방법들에 대해서 다뤄보도록 하겠습니다.

ETC1 텍스처 고려사항

ETC1 텍스처 포맷을 사용해서 프로젝트를 Android용으로 패키징할 때, ETC1 은 알파 정보가 삽입된 텍스처를 압축하지 않는 대신 완전 미압축 텍스처로 취급한다는 점을 알아두셔야 합니다. 프로젝트의 실행 시간 퍼포먼스에 크게 영향을 끼치지는 않겠지만, 프로젝트 APK 파일 크기가 커집니다. 프로젝트가 알파를 사용하는 텍스처를 요하는 경우, 하나의 텍스처 안에 알파를 삽입시키는 것보다는 디퓨즈용으로 하나 알파용으로 하나, 두 개의 텍스처를 별도로 사용하면 프로젝트 쿠킹 & 패키징할 때 압축이 되도록 할 수 있습니다.

플랫폼 무관 기법

위의 Android 전용 기법에 추가로, 타깃 플랫폼과 상관없이 게임 패키지 크기를 줄일 수 있는 방법이 여러가지 있습니다.

새 공백 프로젝트 생성

Android 기반 모바일 프로젝트 작업을 처음 시작할 때, 시작용 콘텐츠가 포함된 프로젝트나 기존의 프로젝트를 기반으로 해서 작업을 했으면 하는 유혹이 있을 것입니다. 그러면 아니아니 아니되오! 그 대신 완전히 공백 C++ 또는 블루프린트 기반 프로젝트를 새로 만든 다음 이주 툴 을 사용해서 사용하고자 하는 콘텐츠를 이주시키셔야 합니다. 이런 식으로 프로젝트에 딱 필요한 콘텐츠만 포함되도록 해야합니다.

쿠킹된 콘텐츠 압축

APK 패키지 크기 줄이기에 가장 쉽고 빠른 방법은 UE4 더러 패킹 프로세스 도중 APK 패키지를 압축하라 이르는 것입니다. 패키지 압축을 켜려면 UE4 에디터에서 다음과 같은 작업을 해 줘야 합니다.

  1. 먼저 편집 메뉴의 프로젝트 세팅 을 선택하여 프로젝트 세팅을 엽니다.

    T_Project_Settings_Menu.png

    T_Project_Settings_Menu_Mac.png

  2. 프로젝트 섹션 아래 Packaging 섹션을 클릭하면 프로젝트 패키징 방식 옵션이 표시됩니다.

    클릭하면 이미지 원본을 확인합니다.

  3. 패키징 세팅 하단의 고급 프로퍼티 를 클릭하면 고급 프로젝트 세팅 이 나옵니다.

    클릭하면 이미지 원본을 확인합니다.

  4. Create compressed cooked packages (압축 쿠킹 패키지 생성) 옵션을 찾아 (이미 켜져있지 않은 경우) 켜줍니다.

    클릭하면 이미지 원본을 확인합니다.

압축 쿠킹 패키지 생성 옵션을 켜지 않고 게임을 패키징하지 않은 경우, 나중에 켜고서 다시 패키징을 해 보면 크기 차이가 크게 난다는 것을 알 수 있을 것입니다. 사실 압축 쿠킹 패키지 생성 옵션을 켜면 프로젝트에 따라 APK 패키지 파일 크기가 50% 정도까지 압축되는 경우도 종종 볼 수 있습니다.

공유 머티리얼 셰이더 & 라이브러리

Share Material Shader Code (머티리얼 셰이더 코드 공유) 및 Share Material Native Libraries (머티리얼 네이티브 라이브러리 공유) 옵션을 둘 다 켜면 프로젝트 패키지 전반적인 크기를 줄이는 데 도움이 되지만, 대신 로드 시간이 늘어납니다. UE4 프로젝트에서 이 옵션을 켜는 방법은 다음과 같습니다:

  1. 먼저 메인 툴바 에서 편집 > 프로젝트 세팅 으로 갑니다.

    T_Project_Settings_Menu.png

    T_Project_Settings_Menu_Mac.png

  2. Packing (패킹) 섹션 하단에 다음 옵션 박스를 체크합니다:

    • Share Material Shader Code (머티리얼 셰이더 코드 공유)

    • Share Material Native Libraries (머티리얼 네이티브 라이브러리 공유)

    클릭하면 이미지 원본을 확인합니다.

에디터 콘텐츠 제외

이 옵션을 켜면 UE4 에디터가 사용하는 콘텐츠가 프로젝트 패키지에 들어가지 않도록 합니다. 참고로 이 옵션을 켜면 프로젝트에서 에디터 콘텐츠를 활용하는 경우 문제가 될 수 있습니다. UE4 프로젝트에서 이 두 옵션을 켜는 방법은 다음과 같습니다:

  1. 먼저 메인 툴바편집 > 프로젝트 세팅 으로 갑니다.

    T_Project_Settings_Menu.png

    T_Project_Settings_Menu_Mac.png

  2. 프로젝트 섹션 아래 Packaging (패키징) 섹션을 클릭하면 프로젝트 패키징 방법 옵션이 표시됩니다.

    클릭하면 이미지 원본을 확인합니다.

  3. Packaging (패키징) 세팅 하단에 있는 고급 프로퍼티 를 클릭하면 고급 프로젝트 세팅 이 드러납니다.

    클릭하면 이미지 원본을 확인합니다.

  4. 화면을 내리면 Exclude editor content when cooking (쿠킹할 때 에디터 콘텐츠 제외) 옵션이 보입니다. 그 옆의 박스를 클릭하여 체크하면 켜집니다.

    클릭하면 이미지 원본을 확인합니다.

    참고로 이 옵션을 켜면 에디터 콘텐츠를 활용하는 프로젝트의 경우 문제가 생길 수 있습니다.

프로젝트의 레벨 구성

간과하고 있다가 APK 패키지 크기가 비대해지게 만드는 요인 한 가지는, 기본으로 로드할 레벨은 무엇이고 레벨 전환시 사용할 레벨은 무엇인지 정하는 프로젝트 옵션을 제대로 구성하지 않은 경우입니다. 어떤 레벨을 어떻게 사용할지 설정하는 방법은 다음과 같습니다.

  1. 먼저 메인 툴바 에서 편집 > 프로젝트 세팅 으로 갑니다.

    T_Project_Settings_Menu.png

    T_Project_Settings_Menu_Mac.png

  2. 그리고 프로젝트 아래 맵 & 모드 섹션에서 Default Maps (디폴트 맵)에 프로젝트의 맵을 설정합니다.

    클릭하면 이미지 원본을 확인합니다.

  3. Game Default Map (게임 디폴트 맵) 옆의 화살표를 클릭하고 애셋 목록에서 게임 기본 시작 레벨에 사용하고자 하는 맵을 선택합니다.

    클릭하면 이미지 원본을 확인합니다.

  4. 필요한 맵 유형마다 레벨 입력이 완료될 때까지 이 프로세스를 반복합니다.

패키지에 포함시킬 콘텐츠 선택

프로젝트 세팅의 Packaging (패키징) 섹션에서는 게임 패키지에 어떤 맵과 콘텐츠를 포함시킬지 지정할 수 있습니다. 프로젝트에 포함시킬 맵을 지정하는 방법은 다음과 같습니다:

쿠킹할 맵을 지정하지 않으면 테스트 맵까지 포함해서 모든 맵이 쿠킹됩니다. 쿠킹할 맵을 지정하지 않으면 최종 게임 패키지 크기는 필요 이상으로 커질 것입니다.

  1. 먼저 메인 툴바편집 > 프로젝트 세팅 창을 엽니다.

    T_Project_Settings_Menu.png

    T_Project_Settings_Menu_Mac.png

  2. Project (프로젝트) 아래 Packaging (패키징) 섹션에서 Packaging 옵션을 찾습니다.

    클릭하면 이미지 원본을 확인합니다.

  3. 패키징 섹션 하단의 작은 흰색 삼각형 을 클릭하면 고급 패키징 옵션이 나옵니다.

    클릭하면 이미지 원본을 확인합니다.

  4. 고급 패키징 옵션 아래 부분으로 내려가면 Cook everything in the project content directory(ignore list of maps below) (프로젝트 콘텐츠 디렉터리 내 전부 쿠킹 (아래 맵 목록 무시)) 옵션이 있습니다. 여기 보이는 옵션으로 프로젝트와 함께 어떤 콘텐츠와 맵을 패키지에 포함시킬지 지정할 수 있습니다.

    클릭하면 이미지 원본을 확인합니다.

  5. 항목을 포함 또는 제외시키려면 새 항목 생성에 사용하고자 하는 옵션 옆의 흰색 더하기 아이콘을 누릅니다.

    클릭하면 이미지 원본을 확인합니다.

  6. 그리고 새 항목 옆의 작은 흰색 점 세 개를 클릭하여 뜨는 창에서, 빌드에 포함 또는 제외시킬 애셋을 선택합니다.

    클릭하면 이미지 원본을 확인합니다.

  7. 애셋을 선택하면, 입력 창이 프로젝트 폴더 내 해당 애셋에 대한 링크로 바뀝니다.

    클릭하면 이미지 원본을 확인합니다.

프로퍼티 이름

설명

Cook everything in the project content directory(ignore list of maps below.

프로젝트 콘텐츠 디렉터리 내 전부 쿠킹 (아래 맵 목록 무시) - 프로젝트 콘텐츠 디렉터리의 모든 것을 쿠킹합니다.

Cook only maps(this only affects cook all).

맵만 쿠킹 (모두 쿠킹에만 영향) - 맵만 쿠킹합니다 (cookall 플래그에만 영향을 끼칩니다).

Create compressed cooked packages.

압축 쿠킹 패키지 생성 - 압축된 쿠킹 패키지를 생성합니다 (디플로이 크기가 줄어듭니다).

Do not include editor content in this package may cause game to crash / error if you are using this content

이 패키지에는 에디터 콘텐츠를 포함시키지 않습니다. 이 콘텐츠를 사용하는 경우 게임 크래시 / 오류가 날 수 있습니다 - 에디터 전용 콘텐츠는 쿠킹에서 제외시킵니다.

List of maps to include in a packaged build

패키지 빌드에 포함시킬 맵 목록 - 명령줄에 다른 맵 목록을 지정하지 않은 경우 포함시킬 맵 목록입니다.

Additional Asset Directories to Cook

쿠킹할 부가 애셋 디렉터리 - 프로젝트의 다른 것에 레퍼런싱되어 있지 않더라도 항상 쿠킹해야 하는 .uasset 파일이 들어있는 디렉터리입니다. 주: 프로젝트 Content 디렉터리 기준 상대 경로입니다.

Directories to never cook

절대 쿠킹하지 않을 디렉터리 - 절대 쿠킹하지 않을 디렉터리입니다.

Additional Non-Asset Directories to Package.

패키징할 부가 비애셋 디렉터리 - .pak 파일에 항상 추가시킬 파일이 들어있는 디렉터리입니다 (.pak 파일이 아닌 경우 개별 파일로 복사합니다). UFS (언리얼 파일 시스템) 파일 IO API 를 통해 수동 로드할 부가 파일을 스테이징하는 데 사용됩니다. 주: 이 경로는 프로젝트 Content 디렉터리 기준 상대 경로입니다.

Additional Non-Asset Directories to Copy.

복사할 부가 비애셋 디렉터리 - .pak 파일의 일부가 될 것은 아니지만 프로젝트 패키지에 항상 복사할 파일이 들어있는 디렉터리입니다. UFS (언리얼 파일 시스템) 파일 IO API 를 사용하여 수동 로드할 부가 파일을 스테이징하는 데 사용됩니다 (예: 별도의 내부 파일 IO 로 작동되는 서드파티 라이브러리). 주: 이 경로는 프로젝트의 Content 디렉터리 기준 상대 경로입니다.

쿠킹되는 콘텐츠 확인

프로젝트에 관련이 있는 콘텐츠만 APK 에 추가되는지 확인하려면, 프로젝트의 Cooked 폴더에서 프로젝트 APK 에 추가되는 콘텐츠를 검사하면 됩니다. Cooked 폴더를 찾을 수 있는 곳은 (ProjectName)\Saved\Cooked 에서 프로젝트를 쿠킹한 포맷으로 된 폴더를 선택하면 됩니다.

참고로 쿠킹을 처음 완료한 이후에만 Cooked 폴더에 콘텐츠를 확인할 수 있을 것입니다.

클릭하면 이미지 원본을 확인합니다.

클릭하면 이미지 원본을 확인합니다.

아래는 Match 3 샘플 게임에서의 Texture 폴더 그림입니다. 폴더의 콘텐츠가 크기별로 정렬되어 있어서 어느 애셋이 가장 큰지 쉽게 확인할 수 있습니다. 가장 중요한 애셋을 확인했으면 UE4 안에서 애셋을 검사하여 애셋의 완성도를 희생시키지 않고도 실제 크기를 줄일 수 있는지 알아보면 됩니다.

클릭하면 이미지 원본을 확인합니다.

클릭하면 이미지 원본을 확인합니다.

Development vs Shipping 빌드 크기

프로젝트 최종 크기가 얼마나 될지 알아내고자 할 때, 프로젝트 Development 버전 크기는 Shipping 빌드 크기보다 약간 크다는 점을 염두에 두세요. Medieval Match 예제 게임의 Development 빌드와 Shipping 빌드의 크기는 약 14 퍼센트 차이가 났습니다. 하지만 각 프로젝트마다 요구사항이 다르므로, 두 빌드 유형간의 차이는 14 퍼센트 이상 또는 이하가 될 수도 있습니다.

디바이스별 텍스처 LOD

언리얼 엔진 4.8 릴리즈 이후 디바이스별로 사용할 텍스처 크기를 지정할 수 있게 되었습니다. 모바일 플랫폼용 텍스처 지침서 문서에서 자세히 확인하실 수 있습니다.

미사용 콘텐츠 제거

프로젝트를 스토어에 올리기 위한 패키징 준비가 완료되면, 미사용 또는 테스트용 콘텐츠를 콘텐츠 브라우저에서 선택한 뒤 지워줘야 합니다. 콘텐츠 삭제는 먼저 지우고자 하는 콘텐츠를 선택한 다음 Delete 키를 누르거나, 우클릭 메뉴에서 삭제 옵션을 선택하면 됩니다. 프로젝트에서 무언가를 지우려고 할 때, 다음 그림처럼 애셋 삭제 메뉴가 뜹니다.

UE4 에서 오브젝트를 삭제하려면 이렇게 하는 것이 좋으며, 콘텐츠 폴더에서 애셋을 그냥 제거/삭제하는 것은 바람직하지 않습니다.

DeleteAssets_Windows.png

클릭하면 이미지 원본을 확인합니다.

애셋 삭제 메뉴는 지우려고 하는 애셋이 다른 애셋에 레퍼런싱되어있는지 아닌지를 알려줍니다. 레퍼런싱되어있지 않다면 그냥 지우면 되지만, 다른 애셋에 레퍼런싱되어 있다면 레퍼런스 대체 옵션을 사용해서 그 애셋으로의 레퍼런스를 프로젝트 패키지에 들어갈 예정인 다른 애셋으로 바꿔주면 됩니다.

미사용 플러그인 제거

UE4 에디터 안에서 사용되지 않는 플러그인을 비활성화시키는 것도 불필요한 콘텐츠와 코드가 최종 APK 패키지 파일에 들어가지 않도록 하는 또 한가지 방법입니다. 그 이유는, 일부 플러그인은 정상 작동을 위해 일정한 바탕 애셋 및 코드 세트를 필요로 하기 때문입니다. 플러그인이 비활성화만으로 그 작동에 필요한 애셋과 코드가 프로젝트에서 제거되지는 않습니다. 커다란 텍스처 하나를 줄이거나 제거하는 것만큼 프로젝트 크기를 줄여주지는 못하겠지만, 프로젝트를 50MB 제한에 맞추는 데는 아주 약간이라도 도움이 될 수 있습니다. UE4 안에서 플러그인을 비활성화시키는 방법은 다음과 같습니다.

플러그인을 비활성화시켜도 프로젝트의 함수성에 문제가 생기지는 않는지 철저히 테스트하시기 바랍니다.

  1. 먼저 플러그인 매니저를 엽니다. 메인 툴바 에서 - 플러그인 옵션입니다.

    T_Open_Plugins_Browser.png

    T_Open_Plugins_Browser_Mac.png

  2. 플러그인 브라우저에서 여러 섹션을 선택하고 Enabled 옆의 박스 체크를 해제하여 사용하지 않는 플러그인을 비활성화시킵니다. 모든 플러그인을 비활성화시킨 후에는 UE4 에디터를 재시작하고 프로젝트를 다시 패키징해야 합니다.

패키지 블랙 리스트

이제 프로젝트의 Build/Platform/(타깃 플랫폼 폴더) 디렉터리에 텍스트 파일을 넣어서 쿠커에게 프로젝트 패키징시 파일 경로 부분 또는 전체를 제외시킬 수 있습니다. 프로젝트는 Debug, Development, Test, Shipping 빌드별로 다중 블랙 리스트 파일을 가질 수 있어, 프로젝트에 원하는 데이터의 추가 또는 제거 구성이 가능합니다. Android용 하나, 플랫폼용으로 다른 하나 등, 프로젝트가 지원하는 각 플랫폼에 대해 각기 다른 블랙 리스트를 만드는 것도 가능합니다. Android용 태피 치킨에서 블랙 리스트 파일이 어때 보이는지에 대한 예제는 이와 같습니다.

클릭하면 이미지 원본을 확인합니다.

클릭하면 이미지 원본을 확인합니다.

이번에도 태피 치킨을 예제로, 쿠커더러 게임 쿠킹 및 패키징시 다름 파일을 포함시키지 말도록 한 것입니다.

  • 블랙리스트 텍스트 파일 위치 & 이름: TappyChicken/Build/Android/PakBlacklist-Shipping.txt:

    T_Black_List.png

    T_Black_List_Mac.png

처음 세 항목은 어떤 프로젝트에도 안전할 것이나, (프로젝트에 따라) 실행시간에 AssetRegistry.bin 이 필요한 경우도 있습니다. 제거하는 콘텐츠가 악영향을 끼치지는 않는지, 철저히 테스트할 것을 강력 추천합니다. 쉽고 간편한 테스트법이라면, 모든 프로젝트 레벨을 열어 로드하고 오류나 경고가 없으면 됩니다. 문제가 생겼는데 무엇때문인지 모르겠다면 Logcat 에 어떤 오류가 있는지 확인해 보시기 바랍니다.

최대 다이내믹 포인트 라이트

프로젝트 세팅 > 모바일 섹션 > Max Dynamic Point Lights 프로퍼티 옵션은 다이내믹 라이트용으로 생성되는 셰이더 수를 줄이는 데 도움이 됩니다. 다이내믹 라이트를 요하지 않는 모바일 게임에서 특히나 유용합니다.

클릭하면 이미지 원본을 확인합니다.

이 기능을 완전히 끄려면 원래 4Max Dynamic Point Lights 를 0 으로 설정하고 확인창이 뜨면 UE4 에디터를 재시작하면 됩니다.

Max_Dyn_Point_Lights_To_0.png

프로젝트의 크기와 사용되는 머티리얼 수에 따라 절약되는 공간이 몇 MB 에서 수십 MB 까지도 가능합니다. 기본 삼인칭 템플릿을 예로 들어보면, Max Dynamic Point Lights 를 켰을 때와 껐을 때 절약되는 공간이 다른 것을 볼 수 있습니다.

상태

패키징된 게임 크기

절약

54.3 MB

0

53.2 MB

1.1 MB

태그