0?wx_fmt=jpeg.jpg

按需加载资源是从iOS、tvOS 9.0开始引入的一个新特性。开发者可通过将主程序Bundle中的特定资源分离并存放于App Store infrastructure上进行按需下载,从而减少主程序Bundle的大小。

0?wx_fmt=jpeg.jpg

新的AppleTV平台规定主程序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指定与资源获取工作都由代码完成:
早前的
UnityEditor.iOS.BuildPipeline.collectResources事件API
以及随后的
UnityEngine.iOS.OnDemandResources.PreloadAsync API
虽然当前的按需加载资源API没有对tag的命名规则进行限定,但仍有几条指导建议可帮助简化开发过程:最灵活也是最简单的方法是为每个Asset Bundle指定一个由该Asset Bundle名衍生出来的唯一性tag。如此一来,开发者可以为单个下载设定优先级,并获取它们各自的进度。同时还要记得,Apple建议所有具备相同tag的资源,其累计大小不超过64MB,以取得下载速度与存储空间有效性之间的最佳平衡。
以下是两段展示“按需加载资源”的代码示例:1,对资源进行标识赋值的编辑器脚本

0?wx_fmt=jpeg.jpg

2,运行时获取资源的代码

0?wx_fmt=jpeg.jpg

BitBucket 上的Asset Bundle Manager 示例项目是你开始了解及使用Asset Bun-dle与按需加载资源的最简单方式。该项目页面上有关于如何使用与调整这个示例项目的详尽描述。若干个使用了按需加载资源的Unity游戏已登陆Apple TV,如:《Breakneck》和 《Bruce Lee: Enter the Game – Unchained Edition》。