내장 프로파일러에서의 퍼포먼스 측정
Optimizing Physics Performance

빌드된 iOS 플레이어의 크기 최적화

플레이어의 크기를 줄이는 두 가지 주요 방법은 Xcode의 Active Build Configuration과 Unity의 Stripping Level을 변경하는 것입니다.

Building for distribution

It is expected that final release builds are made using Xcode 4.x/5.x command Product -> Archive. Using this command ensures that build is made with release configuration and all the debug symbols are stripped. After issuing this command latest Xcode switches to Organizer window Archives tab (you can navigate there manually via Window -> Organizer menu). You will find there two very useful functions there: App Store size estimation and Distribution. Build size estimation function works pretty well, but it is always recommended to have some small extra margin for error when aiming for 3G download limit (which currently is 100MB).

iOS Stripping Level

스트리핑 작업에 의한 크기의 최적화는 다음과 같이 활성화합니다.

  1. Strip assemblies 레벨: 스크립트의 바이트 코드는 분석이 이루어지고, 스크립트에서 참조되지 않는 클래스나 메소드는 DLL에서 해제할 수 있으며, AOT 컴파일 단계에서는 제외할 수 있습니다. 이 최적화에 의해 메인 바이너리 크기와 관련된 DLL의 크기를 줄이고 reflection이 사용되지 않는 한 안전합니다.

  2. Strip ByteCode 레벨: .NET DLL은 스트립된 메타 데이터뿐입니다. 이것이 가능한 것은 모든 코드가 AOT 단계에서 미리 컴파일되어 메인 바이너리에 연결되어 있기 때문입니다.

  3. Use micro mscorlib 레벨: 특별하고 작은 버전의 mscorlib이 사용됩니다. 일부 컴포넌트, 예를 들면, Security, Reflection.Emit, Remoting, non Gregorian calendars, 그 외는 이 라이브러리에서 제외됩니다. 또한 내부 컴포넌트 간의 상호 의존성이 최소화됩니다. 이 최적화에 의해 주 바이너리 및 mscorlib.dll 크기를 줄일 수 있지만 일부 System 및 System.Xml 어셈블리 클래스와 호환되지 않기 때문에 신중하게 사용하십시오.

이러한 레벨은 누적되기에 레벨 3의 최적화는 명시적으로 레벨 1, 2를 포함하며, 레벨 2는 명시적으로 레벨 1을 포함합니다.

Micro mscorlib은 코어 라이브러리가 크게 스트리핑 된 버전입니다. Unity에서 Mono 런타임에서 필요한 항목만 남습니다. micro mscorlib을 사용하는 모범 사례는 응용 프로그램에서 필요없는 클래스 또는 다른 기능을 사용하지 않는 것입니다. GUID는 생략할 수 있는 좋은 예입니다. 간단하게 사용자 정의 작성된 가짜 GUID로 쉽게 대체할 수 있으며, 이를 통해 더 나은 퍼포먼스 및 응용 프로그램 크기로 연결됩니다.

Stripping with IL2CPP

The equivalent of Strip ByteCode is always enabled when the IL2CPP scripting backend is used. In this case, the Stripping Level option is replaced with an Boolean option named Strip Engine Code. If this option is enabled, unused modules and classes in the Unity Engine code will be removed, if it is disabled, all of the modules and classes in the Unity Engine code will be preserved.

The link.xml file (described below) can be used to effectively disable byte code stripping by preserving both types and full assemblies. For example, to prevent the System assembly from being stripped, the following link.xml file can be used:

<linker>
       <assembly fullname="System" preserve="all"/>
</linker>

Note: The ability to preserve an entire assembly applies only to the IL2CPP scripting backend.

Reflection을 사용할 때 스트리핑의 대응 방법

스트립은 정적 코드 분석에 의존하고 있어 효율적으로 수행하기 어려운 경우가 있으며, 특히 reflection처럼 동적 기능이 사용되는 경우 그렇습니다. 그런 상황에서 어떤 클래스를 제외하거나 정보를 팁으로 전달해야 합니다. Unity는 블랙리스트 를 프로젝트 단위로 지원합니다. 블랙리스트를 사용하려면link.xml 파일을 만들어 Assets 폴더에 넣으면 됩니다. link.xml의 기재 방법의 예제는 다음과 같습니다 : -

<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>

       <assembly fullname="mscorlib">
               <type fullname="System.AppDomain" preserve="fields"/>
               <type fullname="System.InvalidOperationException" preserve="fields">
                       <method signature="System.Void .ctor()"/>
               </type>
               <type fullname="System.Object" preserve="nothing">
                      <method name="Finalize"/>
               </type>
       </assembly>
</linker>

A project can include multiple link.xml files. Each link.xml file can specify a number of different options.

  • The assembly element indicates the managed assembly where the nested directives should apply.
  • The type element is used to indicate how a specific type should be handled. It must be a child of the assembly element. The fullname attribute can accept the ‘*’ wild card to match one or more characters.
  • The preserve attribute can take on one of three values:
    • all: Keep everything from the given type (or assembly, for IL2CPP only).
    • fields: Keep only the fields of the given type.
    • nothing: Keep only the given type, bug none of its contents.
  • The method element is used to indicate that a specific method should be preserved. It must be a child of the type element. The method can be specified by name or by signature.

The stripped assemblies are output to a directory below the Temp directory in the project (the exact location varies depending on the target platform). The original, unstripped assemblies are available in the not-stripped directory in the same location as the stripped assemblies. A tool like ILSpy can be used to inspect the stripped and unstripped assemblies to determine what parts of the code were removed.

참고: 어떤 클래스가 실수로 응용 프로그램에 필요로 되고 있는데 스트리핑되었는지 판단하는 것이 어려울 수 있습니다. 시뮬레이터상에서 스트리핑 된 응용 프로그램을 실행하고 Xcode 콘솔 메시지를 확인하면 유용한 정보를 얻을 수 있는 경우가 종종 있습니다.

Distribution을 가능한 한 최소화하는 간단한 체크리스트

  1. 에셋을 최소화합니다 : 텍스처에서 PVRTC 압축을 활성화하고 해상도를 최대한 줄입니다. 또한 비 압축 음성의 수도 최소화합니다. 파일 크기 팁은 여기를 참조하십시오.
  2. iOS 스트리핑 레벨을 Use micro mscorlib으로 설정합니다.
  3. 스크립트 호출 최적화를Fast but no exceptions으로 설정합니다.
  4. 코드에서 System.dll 또는 System.Xml.dll에 존재하는 것은 일절 사용하지 마십시오. 이 라이브러리는 micro mscorlib와 호환성이 없습니다.
  5. 불필요한 코드를 제거
  6. API Compatibility Level에 .Net 2.0 subset를 설정합니다. .Net 2.0 subset은 다른 라이브러리와 제한된 호환성 밖에 없는 점에 유의하십시오.
  7. JS 배열은 사용하지 마십시오.
  8. 값 형식, 구조체 포함과 제네릭 컨테이너의 조합을 피하십시오.

Unity에서 응용 프로그램은 얼마나 작게 줄일 수 있습니까?

빈 프로젝트는 사이즈 최적화 옵션을 모두 껐을 경우 AppStore 에서 22MB이내가 될 것입니다. 코드 스트리핑 옵션을 활성화했을 경우, 메인 카메라만을 가진 씬은 AppStore에서 대략 12MB이내로 줄일 수 있습니다. (압축되고 DRM 포함).

AppStore에 릴리스한 후에 응용 프로그램 크기가 증가한 이유는 무엇입니까?

응용 프로그램을 제작할 때 Apple은 먼저 바이너리 파일을 암호화하여 zip으로 압축합니다. 대개의 경우 Apple의 DRM은 4MB 정도 늘어납니다. 원칙적으로 최종적인 크기 모든 파일(실행 파일 제외)을 zip 압축한 아카이브 용량에 압축하지 않은 실행 파일을 추가한 용량입니다.

내장 프로파일러에서의 퍼포먼스 측정
Optimizing Physics Performance