iOS Player 빌드 사이즈 최적화 하기
출처 - http://docs.unity3d.com/Documentation/Manual/iphone-playerSizeOptimization.html -
iOS 플레이어 빌드 사이즈 최적화 하기.
빌드 사이즈를 줄이는 방법은 크게 두 가지가 있습니다. Xcode에서 Active Build Configuration을 조절하는 방법과 Unity에서 Stripping Level을 조절하는 방법입니다.
Relese Mode로 빌드 하기.
Xcode에서 빌드 할 때Active Build Configuration 드롭다운 메뉴에서 Debug 와 Release 옵션을 선택할 수 있습니다. Debug Mode 대신 Release Mode로 빌드를 하면 게임에 따라서 2-3MB 정도의 빌드 크기가 줄어듭니다.
- The Active Build Configuration drop-down -
Release Mode로 빌드를 하게 되면 Debug 정보 없이 빌드를 하기 때문에, 게임이 크래쉬가 발생하거나 다른 문제가 생겼을 때 Stack Trace 등의 정보를Output으로 확인할 수가 없습니다.
제작이 완료돼서 배포를 하는 게임의 경우에는 문제가 되지 않겠지만, 개발 중에는 Debug Mode가 유용합니다.
iOS Stripping Level (Advanced License feature)
Stripping Level 을 조절해서 빌드 크기를 최적화 하는 방법은 아래와 같은 방법으로 진행이 됩니다.
1. Strip assemblies level: 스크립트의 Bytecode를 분석해서, 해당 클래스와 메소드가 참조가 되는지 여부를 확인하고, 참조되지 않는 부분은 DLL에서 제거되고, AOT 컴파일 단계에서 제외 됩니다. 이 최적화 방법은 Main binary의 크기와 수반되는 DLL을 줄이는 방법으로, 리플렉션을 사용하지 않는 한 안전한 방법입니다.
2. Strip ByteCode level: (Data 폴더에 저장되는)모든 .Net DLL은metadata로 strip되어 크기가 줄어듭니다. 모든 코드가 AOT 단계에서 미리 전처리(precompiled)가 되고, main binary에 링크가 되기 때문에 이 방법이 가능하게 됩니다.
3. Use micro mscorlib: 특별한 경우로, mscorlib의 smaller 버전을 사용하는 방법입니다.
이 라이브러리에서는 일부 컴포넌트가 제외된 버전입니다.
예를 들어, Security, Reflection.Emit, Remoting, non Gregorian calendars 등이 제외됩니다.
또한 내부 컴포넌트간의 상호의존성이 줄어들게 됩니다. 이 방법은 main binary와 mscorlib.dll의 크기를 줄이는 방법이지만 일부 System 및 System.Xml 어셈블리 클래스에서는 호환이 되지 않으니 주의를 해야 합니다.
이 Level들은 축적이 됩니다, 다시 말해서, Level 3 최적화 방법은 Level 2 와 Level 1을 내포하고, Level 2 최적화 방법은 Level 1을 포함합니다.
주의: Micro mscorlib 는 core 라이브러리의 크기를 많이 줄인 버전입니다. micro mscorlib 를 사용할 때 가장 좋은 방법은 제작중인 어플리케이션에서 사용하지 않는 .Net 클래스와 기능들을 사용하지 않는 것입니다. 제외할 예로 GUID가 가장 좋은 예시가 될 것 같습니다. GUID를 직접 만들어서 대체 사용이 쉽고, 직접 제작해서 사용하는 경우 성능 면에서 앱 사이즈를 줄이는 면에서도 모두 좋은 결과를 낼 수 있습니다.
Tips
리플렉션을 사용할 때 Stripping 조절하는 방법
Stripping은 static code analysis에 많이 의존하는 방법이기 때문에, 효율적으로 진행이 되지 않는 경우가 종종 발생합니다.
한 예로 리플렉션과 같은 dynamic 기능이 사용되는 경우입니다. 이런 경우, 사용하거나 참조해야 하지 않는 클래스 등을 명시 하는 것이 필수적입니다.
유니티는 프로젝트 별로 따로 custom stripping blacklist를 지원합니다. blacklist를 사용하면 link.xml 파일을 생성하고 Assets 폴더에 두어야 합니다. link.xml 파일의 예제를 아래에서 확인할 수 있습니다. 보존(preservation)되어야 한다고 명시된 클래스들은 stripping에 영향을 받지 않게 됩니다.
<linker> <assembly fullname="System.Web.Services"> <type fullname="System.Web.Services.Protocols.SoapTypeStubInfo" preserve="all"/> <type fullname="System.Web.Services.Configuration.WebServicesConfigurationSectionHandler" preserve="all"/> </assembly>
<assembly fullname="System"> <type fullname="System.Net.Configuration.WebRequestModuleHandler" preserve="all"/> <type fullname="System.Net.HttpRequestCreator" preserve="all"/> <type fullname="System.Net.FileWebRequestCreator" preserve="all"/> </assembly> </linker> |
주의: 하지만 어떤 클래스가stripping 되어야 하고 어떤 클래스가 사용이 되어야 하는지를 판별하는 방법이 어려울 수 있기 때문에, Xcode 콘솔의 에러 메시지를 확인하고, 시뮬레이터에서 앱을 실행시켜서 그런 정보들을 확인하는 것이 필요할 수 있습니다.
최적화된 크기의 앱 배포를 위한 체크리스트
1. 에셋 줄이기: 텍스처에 PVRTC 압축 옵션을 활성화 하고 가능한 범위 내에서 해상도를 줄입니다. 또한, 압축되지 않은 사운드 에셋의 수를 줄입니다. 이 방법에 대한 추가 팁을 아래 링크에서 확인할 수 있습니다. (링크 - http://docs.unity3d.com/Documentation/Manual/ReducingFilesize.html)
2. iOS Stripping Level을 Use Micro mscorlib로 설정합니다.
3. 스크립트 호출 최적화Level을 Fast but no exceptions로 설정합니다.
(Script call optimization level)
4. System.dll 과System.Xml.dll 에 있는 기능들은 사용하지 않습니다.
이 라이브러리들은 micro mscorlib에 호환되지 않는 것 들입니다.
5. 불필요한 code dependencies를 제거합니다.
6. API Compatibility Level을 .Net 2.0 subset으로 설정합니다.
하지만 .Net 2.0 subset은 다른 라이브러리들과의 호화성에 제한적인 부분이 있다는 점을 주의해야 합니다
7. Target platform을arm6로 설정합니다. (OpenGL ES 1.1)
8. JS Arrays를 사용하지 않습니다.
9. 구조체를 포함해서 Value 타입과 조합해서 generic container를 사용 하는 것을 자제합니다.
'Unity3D > Tips' 카테고리의 다른 글
유니티가 당신에게 알려주지 않는 진실 (0) | 2013.11.03 |
---|---|
하이어라키(Hierarchy)에서 GameObject Active/InActive HotKey for NGUI (2) | 2013.10.28 |
디바이스에서 Debug.Log 메시지 출력하지 않도록 하기 (0) | 2013.08.19 |
유니티 안드로이드 플러그인 만들기 (0) | 2013.07.24 |
Unity3d Texture 레퍼런스정리 (0) | 2013.07.03 |