精通Apple平台上的按需加载资源功能
按需加载资源是从iOS、tvOS 9.0开始引入的一项新特性。开发者能够将主程序Bundle中的特定资源分离出来,存放在App Store infrastructure上,实现按需下载,进而减小主程序Bundle的大小。
新的Apple TV平台规定,主程序Bundle的大小不得超过200MB。因此,开发者必须采用各种方式动态加载资源。为了减轻开发者的负担,Unity从5.2.0 patch 1版本起,提供了一个按需加载资源的API包装类。
按需加载资源具有显著优势,它不仅能减少应用的初始下载大小,还能通过删除无用资产来节省设备空间。通常情况下,App启动时并非必须加载的资源,都可以作为按需加载或卸载的对象。以关卡制游戏为例,当用户处于第3关时,程序无需加载第10关的资源;反之,当用户玩第16关时,程序可以安全地卸载第1关的内容。
Asset Bundle是实现按需加载资源的最便捷方式。它能够解决动态资产加载过程中的诸多问题,例如提高内存与CPU使用效率、进行依赖跟踪以及针对目标平台进行优化。Asset Bundle配置完成后,无需过多额外操作即可使用按需加载资源。以下是一段简单示例代码(注:本文不详细介绍Asset Bundle相关内容,若你是首次接触,可访问相关资源深入了解):
若要使用按需加载资源,开发者需要在资源生成时为每个资源指定tag标识,然后在运行时通过tag请求相应资源。在iOS应用开发中,可先在Xcode里为资源指定tag,再使用NSBundleResourceRequest API进行访问。在Unity中,tag指定与资源获取工作均通过代码完成,涉及的API有早前的UnityEditor.iOS.BuildPipeline.collectResources事件API以及随后的UnityEngine.iOS.OnDemandResources.PreloadAsync API。
虽然当前的按需加载资源API没有对tag的命名规则进行限制,但有几条指导建议有助于简化开发过程:最灵活且简单的方法是为每个Asset Bundle指定一个由该Asset Bundle名衍生出来的唯一tag。这样,开发者可以为单个下载设定优先级,并获取各自的下载进度。同时,Apple建议所有具有相同tag的资源累计大小不超过64MB,以在下载速度和存储空间有效性之间取得最佳平衡。
以下是两段展示“按需加载资源”的代码示例:
- 对资源进行标识赋值的编辑器脚本
- 运行时获取资源的代码
BitBucket上的Asset Bundle Manager示例项目是你开始了解和使用Asset Bundle与按需加载资源的最简单途径。该项目页面有关于如何使用和调整这个示例项目的详细说明。目前,已有若干使用了按需加载资源的Unity游戏登陆Apple TV,如《Breakneck》和《Bruce Lee: Enter the Game – Unchained Edition》。