Midiendo el Rendimiento con el Perfilador (Profiler) Integrado
Optimizing Physics Performance

Optimizando el Tamaño del Reproductor iOS Construido

Las dos manera principales de reducir el tamaño del reproductor son hacer un adecuado Release build dentro de Xcode y cambiando el Stripping Level dentro de Unity.

Construyendo para distribución

Desde Unity 4.2 se espera que las construcciones finales de release sean hechas utilizando el comando Xcode 4.x/5.x Product -> Archive. Utilizando este comando asegura que la construcción que está siendo hecha la configuración release y todos los símbolos de debug estén stripped (despojados). Después de ejecutar este comando el último Xcode cambia a la ventana Organizer, pestaña Archives (usted puede navegar ahí manualmente vía el menú Window -> Organizer). Usted encontrará ahí dos funciones muy útiles: App Store size estimation y Distribution. La función del tamaño estimado de construcción funciona bastante bien, pero siempre es recomendado tener un margen pequeño extra de error cuando apunte por un limite de descarge 3G (que actualmente es 100MB).

iOS Stripping Level

Las optimizaciones de tamaño activadas por stripping funcionan de la siguiente manera:

  1. Nivel de Strip assemblies: el scripts’bytecode es analizado para que las clases y métodos que no estén referenciados de los scripts sean eliminados del DLLs y por lo tanto excluidos de la fase de compilación AOT. Esta optimización reduce el tamaño del binario principal y DLLs de acompañamiento y es seguro siempre que ninguna reflexión sea utilizada.

  2. Nivel de Strip ByteCode: cualquier .NET DLLs (almacenado en la carpeta Data) son stripped (despejados) a solamente metadata. Esto es posible ya que todo el código está ya pre-compilado durante la fase AOT y vinculada al binario principal.

  3. El nivel de Use micro mscorlib: una versión especial, y más pequeña de mscorlib es utilizada. Algunos componentes son eliminados de esta librería, por ejemplo, Security, Reflection.Emit, Remoting, ningún calendario Gregoriano, etc. También, las interdependencias entre los componentes internos son minimizados. Esta optimización reduce el binario principal y tamaño mscorlib.dll pero no es compatible con alguna clase de assembly System y System.Xml, entonces úselo con cuidado.

Esto niveles son acumulativos, entonces el nivel 3 de optimización implícitamente incluye los niveles 2 y 1, mientras que el nivel 2 de optimización incluye el nivel 1.

Tenga en cuenta que Micro mscorlib es una versión stripped de la librería núcleo. Solamente esos elementos que son requeridos por el tiempo de ejecución de Mono en Unity se mantienen. Las mejores prácticas de utilizar un micro mscrolib es no utilizar cualquiera de las clases o otras características de .NET que no son requeridas por su aplicación. Los GUIDs son un buen ejemplo de algo que usted puede omitir; ellas pueden ser fácilmente remplazadas con un pseudo GUIDs hecho de manera personalizada y haciendo esto va a resultar en un mejor rendimiento y tamaño de app.

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.

Recomendaciones

Cómo lidiar con Stripping cuando utilice Reflection

Stripping depende en su mayoría en un análisis de código estático y a veces esto puede ser realizado efectivamente, especialmente cuando características dinámicas como Reflection son utilizadas. En esos caso, es necesario dar algunas pistas como qué clases no deberían ser tocadas. Unity soporta un stripping personalizado por-proyecto blacklist. Utilizar la blacklist es simplemente crear un archivo link.xml y colocarlo a la carpeta de Assets. Un ejemplo de los contenidos del archivo link.xml sigue. Las clases marcadas para la preservación no serán afectadas por 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>

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

Tenga en cuenta que a veces puede ser difícil determinar qué clases están siendo stripped en error incluso si la aplicación las requiere. A veces usted pueden obtener información útil acerca de esto ejecutando la aplicación stripped en el simulador y revisando la consola de Xcode por mensajes de error.

Una lista de verificación simple para hacer su distribución lo más pequeña posible.

  1. Minimiza sus assets: Activa la compresión PVRTC para texturas y reduce su resolución lo más lejos posible. También, minimiza el número de sonidos no comprimidos. Hay unas recomendaciones adicionales para la reducción del tamaño de archivo aquí.
  2. Establece el nivel de Stripping iOS a Use micro mscorlib.
  3. Establece el nivel de la llamada script de optimización a Fast but no exceptions.
  4. No utilice nada que viva en System.dll o System.Xml.dll en su código. Estas librerías no son compatibles con micro mscorlib.
  5. Quite dependencias de código innecesarias.
  6. Configure el nivel de Compatibilidad de API a .Net 2.0 subset. Tenga en cuenta que el subconjunto.NET 2.0 tiene una compatibilidad limitada con otras librerías.
  7. No utilice Arrays JS.
  8. Evite contenedores genéricos en combinación con tipos de valor, incluyendo structs.

Qué tan pequeña puede ser una app hecha en Unity?

Un proyecto vacío va a tomar menos de 22 MB en la App Store si todas las optimizaciones de tamaño están apagadas. Si usted es dueño de una licencia Avanzada (y por lo tanto tiene acceso a la opción stripping), la escena vacía con solo la cámara puede ser reducida a menos de 12 MB en la App Store (comprimida y DRM adjunto).

Por qué mi app aumento en tamaño después de ser publicada a la App Store?

Cuando publique su aplicación, el servicio de la App Store de Apple primero encripta el archivo binario y luego lo comprime vía zip. La Encriptación aumenta lo ’‘randomness’ del segmento del código y por lo tanto lo hace peor para la compresión. Revise el capítulo “Building for distribution” de arriba para saber cómo estimar el tamaño de la App Store antes de la publicación.

Midiendo el Rendimiento con el Perfilador (Profiler) Integrado
Optimizing Physics Performance