优化内置 iOS 播放器的大小

减少播放器大小的两种主要方式是更改 Xcode 中的活动生成配置 (Active Build Configuration) 以及更改 Unity 的剥离级别 (Stripping Level)

在发布模式下构建

您可以在 Xcode 活动生成配置 (Active Build Configuration) 下拉菜单中选择调试 (Debug)发布 (Release) 之间的一项操作。根据游戏自身的大小,选择发布 (Release) 模式生成的播放器将比调试 (Debug) 小 2-3MB。


活动生成配置 (Active Build Configuration) 下拉菜单

在发布 (Release) 模式下,播放器会去掉任何的调试信息进行构建,所以如果您的游戏崩溃或有其他问题,将没有可用的、可输出的堆栈跟踪信息。这适合部署已完成的游戏,但在开发期间您可能更希望使用调试模式。

iOS 剥离级别 (Stripping Level)(高级版许可功能)

剥离机制可通过以下几种方式激活尺寸优化工作:

  1. 剥离程序集级别:通过分析脚本的字节码,来将这些脚本没有引用的类和类函数从 Dll 中删除,从而使其不进入 AOT 编译阶段。这种优化减少了主要的二进制以及对应 Dll 的大小。在不使用反射的条件下,这种优化安全可靠。
  2. 剥离字节码级别:任何 .NET DLL(储存在数据 (Data) 文件夹中)仅从元数据中被剥离出来。这种可能性主要是因为所有的代码都已经在 AOT 阶段被预编译并链接到主要的二进制文件中。
  3. 使用 micro mscorlib 级别:使用一种特殊的、较小的 mscorlib 版本。某些组件将从库中删除,例如,安全、Reflection.Emit、远程处理、非公历日历等。同时,内部组件之间的相互依赖性也会降至最低。这项优化降低了主要的二进制和 mscorlib.dll 尺寸,但是,它与某些系统及 System.Xml 程序集类不兼容,所以必须谨慎使用。

这些级别可以累积,因此,级别 3 优化隐式地包含了级别 2 和级别 1,级别 2 优化包含级别 1。

请注意: Micro mscorlib 是核心库的最低级版本,它只保留了 Unity Mono 运行时间必要的项目。使用 micro mscorlib 的最佳做法是不要使用应用程序不需要的任何 .NET 类或其他功能。GUID 就是一个应该省略的例子;它们可以轻松地被自定义的伪 GUID 所替代,这样做将产生更好的性能和更小的应用程序。

提示

如何使用反射处理剥离

剥离很大程度上取决于静态代码分析,如果使用反射等动态功能,有时候将不能有效使用剥离。在这些情况下,有必要给出一些提示指出哪些类是不应该触动的。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>
</linker>

请注意: 有时候可能难以确定哪些类会被进行错误的剥离,而应用程序可能需要这些类。您可以在模拟器上运行剥离应用程序,检查 Xcode 控制台中的错误信息,从而获取有用的信息。

下面是如何让发布版本尽可能的小的简单清单。

  1. 最小化资源:启用 PVRTC 纹理压缩,尽可能降低其分辨率。同时,尽量减少未压缩的音频数量。点击此处,查看更多减少文件大小的提示。
  2. 设置 iOS 剥离级别为使用 micro mscorlib
  3. 设置脚本调用优化级别为快速但不支持异常 (Fast but no exceptions)
  4. 切勿让代码与 System.dll 或 System.Xml.dll 产生任何关联,这些库 与 micro mscorlib 兼容。
  5. 删除不必要的代码依赖性。
  6. 设置 API 兼容级别为 .Net 2.0 子集。请注意,.Net 2.0 子集与其他库的兼容性非常有限。
  7. 设置目标平台 (Target Platform) 为 armv6 (OpenGL ES1.1)
  8. 切勿使用 JS 数组。
  9. 避免泛型容器与结构等数值类型相结合。

我可以使用 Unity 构建小于 20Mb 的应用程序吗?

可以,如果所有大小优化被都关掉,一个空项目在 AppStore 中大小大致为 13 MB左右。这为游戏提供 了大约 7MB 的压缩资源预算。如果您拥有高级许可证(并因此可以访问剥离选项),那么只含有主相机的空场景在 AppStore 中可压缩到大约 6 MB(zipped 和 DRM 连接),这样,您就可以有大约 14 MB 的可用空间用于压缩资源。

为什么我的应用程序发布到 AppStore 之后,大小有所增加?

在发布您的应用程序时,Apple 将首先加密二进制文件,然后通过 zip 压缩。大部分情况下,Apple 的 DRM 将增加约 4MB 的二进制大小。一般说来,您应该预计文件最终大小约等于所有文件(可执行文件除外)的 zip 压缩存档,再加上未压缩的可执行文件的大小。

Page last updated: 2013-06-29