大多数浏览器和
Developer App 均支持流媒体播放。
-
优化 App 素材
了解如何借助 iOS 12 中推出的新功能来使用素材,为您的 app 引入兼顾视觉效果和数据效率的图案。深入了解如何最大限度地利用素材目录来组织、优化和制作图案素材。学习相关技巧,进一步简化设计师和开发者之间的工作流程。确保 app 交付品质更高、占用空间更少,同时通过图案素材的高保真度来为 app 吸引尽可能多的目标受众。
资源
相关视频
WWDC21
WWDC17
-
下载
(优化app资源 演讲227)
下午好 欢迎来到“优化app资源” 我叫Will Cocoa框架团队的工程师 今天我和我的同事Patrick 会介绍一些优化你app中资源的 好办法
在当今这个时代 很多app和游戏会通过 在app中使用高保真度的插图 和其他资源 来获得好的用户体验 而通过这样做 它们可以吸引更多的用户 还具有互动性 我想让你们所有的app都像这样 这就是为什么我们今天来到这里 我们要展示一些 关于资源目录的最佳实践 更重要的是 你要更好地将app中的资源部署给 你的用户 以及如何将其转换到整个用户体验上
在这个演讲中 我们会涉及到几个不同的方面 包括传统、设计、开发和部署工作流 但首先我想花点时间 来谈一下图像压缩
(压缩) 图像压缩是资源目录编辑器的 核心内容
也是资源目录编译管道的最后一步 而且还跟管道中出现的 其他优化有关
资源目录会 会提供一些默认压缩类型 而且默认会选择优化最好的压缩类型 来获取所给的图像或纹理
这可能对绝大多数的项目来说足够了 不过了解一下 其中一些选项还是有用处的 更重要的是 要了解它们的取舍 以及对你项目所做的实现 (图像压缩) (自动图像打包) 在我深入介绍图像压缩的内容之前 我想介绍一些 资源目录中的其他优化内容 它对于我们所有要进行的 压缩有非常多的实现 它叫做自动化图像打包
通常在注入资源目录前 将资源部署到你app中的一种方法 将一些图像文件丢到 你项目的app捆绑里
你需要注意的是 这样做有很多的缺点 还有取舍 有两个缺点是你需要注意的 首先是伴随而来的 额外存储空间
传统的图像容器格式 会使用额外的空间 来存储元数据 还有跟图像对应的其他属性
如果你的app有很多的资源 而且它们有相似的元数据 那么相同的信息 就会无意义地在磁盘上反复复制
另外 如果你的绝大多数资源很小 你也不能最大程度 发挥图像压缩的优势
另一个缺点主要是你要花费的 组织上的开销 处理如此多零散的图像文件 是很困难的
而且将它们跟NSImage 和UIImage类的API 进行交互就更困难了
最后还有一点就是 你还需要处理图像格式的不一致性 还有其他的图像属性 例如 在你的插图集合中 你可能有一些图像 但其中有些图像支持透明化 而另一些则不支持
同样的问题也会出现在 像是色域和颜色范围这些属性上
由于目录可以通过 识别共享相似色域配置的图像 来解决这些问题 并且将其分成一组 来生成更大的图像地图集 这样你就不需要为你所有的图像插图 重复存储相同的元数据了 重复存储相同的元数据了 你还可以从所有的图像压缩中 获得更多的收益
让我们来看个现实世界的例子吧
在屏幕的左边有一些图像插图 你可能看起来很熟悉 因为它们是直接从 我们的一个平台取出来的
这些图像插图都非常小 但加起来的总大小 还是超过了50KB
通过这个自动化图像打包 资源目录可以识别出这些图像插图 是不是共享了相类似的色域 如果是的话 它就会集合这些图像 生成单个更大的图像地图集
这样的话…
总的文件大小 可以减少到原来的20% 这样节省了80%的文件大小 是很客观的
还有需要注意的是 这些优化的比例要得当 你app中的资源数量越多 你通过这个优化得到的收益就越多
这就是关于自动化图像打包的内容
(有损压缩) 现在让我们介绍下有损压缩
有损压缩就是要损失少量视觉保真度 从而在压缩时省出更多的空间 所以知道你app 有损压缩最多的场景 很重要
我通常可以推荐你 在短时间在屏幕显示的图像上 使用有损压缩
例如 就是出现在 你app启动画面中的图像 或是过场动画和特效
我不想只是站在这 介绍有损压缩 我想介绍资源目录中的 一种新的有损压缩 所以我非常高兴地宣布 我们今年拓展了 资源目录中 高效图像文件格式的支持 (高效图像文件格式) 如果你了解过我们去年发布的内容 就会知道我们在所有平台上 还有资源目录编辑器中 引入了高效文件图像格式
今年我们会更进一步 我们会将高效图像文件格式 与资源目录的 默认有损压缩整合在一起
谢谢你们
让我们来看看高效图像文件格式 会给我们带来哪些收益吧
很重要的一点就是 它可以提供 更好的压缩比 对比我们已经提供的 其他有损压缩来说 其中你可能很熟悉的一种格式 就是JPEG
该高效图像文件格式 有很多优点 像是对于框外透明度的支持
还有更重要的是 资源目录 可以自动地将其他格式 转换为高效图像文件格式 这就意味着 只要你的图像资源是被标为 这种有损压缩格式的 你这边就不需要再做额外的操作了 这一切都会在资源目录 编译管道中自动进行
有关高效图像文件格式的 更多深入内容 我建议你们去参考下去年的演讲
(无损压缩) 现在让我们把目光转移到无损压缩上
无损压缩是默认的压缩类型 它被用于绝大多数的app资源上
因此 知道你应该如何 充分利用有损压缩
通常 图像插图可以根据其色域配置 分成两大类
并且它们从无损压缩中 所获得的收益是不同的 让我们来看一下
第一类图像通常指的是简单插图
它们被这么叫 是因为它们有相对较窄的色域 以及相对少的离散颜色值
这是由于其简单化的设计 它们最好的代表就是app图标
另一方面 另一种图像插图 被称为复杂插图
两种图像资源从无损压缩中 获得的收益是不同的 通常来说 所有的无损压缩 在这两种图像上表现得都很好 因为已经针对其优化过了
我们意识到这两种图像 对于很多项目来说都很重要 而且我想要你们所有的资源 都尽可能地通过无损压缩进行部署
我非常高兴地宣布今年 我们会在资源目录中 引入一种全新的无损压缩
它叫做Apple深度像素图像压缩
再次感谢大家
Apple深度像素图像压缩是一种 适应于图像色域的灵活压缩格式 这就意味着 它可以根据图像插图 色域特征来选择 最优的压缩算法
今年 我们不仅将这个 新的压缩格式带给了你们 还会使其在我们所有的平台上 还有原生app上可用
通过这种压缩格式 我们观察到 我们所有的项目 减少了平均20%的大小
这是相当可观的
现在 让我们看看一些数字
这是一张图表 它显示了我们部分平台的 所有资源目录的总体规模
很明显 我们能够在所有平台上看到 最多20%的尺寸缩减
说到无损压缩 压缩比只是其中的一部分
由于你app中的大部分插图 用的都是无损压缩 所以解码时间也很重要
Apple深度像素图像压缩 也能够缩减20%的解码时间
(部署目标与app精简) 这就是关于无损压缩的内容
现在我想换个话题 谈谈两个独立但很相关的主题 它们对我刚才谈到 所有的优化和压缩 有很大的影响
这就是部署和app精简
下面是有关app精简的介绍 app精简是发生在 App Store中的过程 它会根据所有设备模型 生成项目的所有变量 还有部署目标的版本
app精简的好处之一就是 可以让你app的部署目标版本 低于你目标平台 的最新版本 这样你可以吸引更多用户
app精简可以 生成你项目的所有变量 并且在你所有的用户群中 部署一个最优变量
如果你今年使用Xcode 10 和iOS 12系列的 SDK构建项目的话 你的项目会自动得益于 我刚才谈到的 所有的优化和新的压缩方式
然而 如果你将你的app部署回较早版本
新的优化将不会被保留
这是由于app精简 必须生成与目标平台的 早期版本更兼容的版本
这不是很理想 更重要的是 我们真的希望你所有的资源 都以最优化的方式进行部署
我很高兴地宣布今年 我们将要推出新版本的app精简 它叫做操作系统变量精简
通过操作系统变量精简
你的app仍然可以 面向你的目标平台上 早期版本的app 在这里就是 从iOS 9一直到iOS 11
对于那些运行 在最新版本iOS的app 操作系统变量精简能够在你的项目里 生成一个特殊变量 这个变量具有所有的 最新优化和压缩类型
这样 每个人都可以 得到你的项目的最有效的版本 每个人就都满意了
(app精简的输出) 这就是app精简 与向后部署的内容
现在我想通过一个例子 说明该如何在Xcode本地环境中 运用相同的app精简 专家工作流
这是个很简单的过程 你只需要点击Xcode的归档按钮
这样就会告诉Xcode 生成你项目中的所有变量
在这些完成之后 你只需要点击组织者按钮 就可以打开一个 显示了你项目中生成的 所有变量的窗口
这个是乐队项目的窗口 我们可以用它来演练一下
首先Xcode会让你 选择一种分发的方法 你可以用这个方法 分发刚刚生成的所有变量
为了达到这个演练的目的 你需要选择Ad Hoc分发
在接下来出现窗口的 app精简字段中
选择
所有可兼容的设备变量
这会告诉Xcode输出所有 指向所有支持设备类型的变量
在完成之后 Xcode可以同步一个 总结了所有刚刚生成的变量的报告
你可以从报告中 提取出几个关键的数据点 来帮助你更好地理解项目的部署 并且帮助回答一些关键问题 比如“我的报告生成了 多少个变量?” “它们的大小如何呢?” “对于某个变量还有没有优化 和调整的空间呢?”
其实车库项目生成的半数变量 是其刚输出的 让我们来看一下
在这个表中
你们可以看到 所有为一个选定设备模型集 所生成的变量大小
这是为iOS11 以及更早版本的变量所生成的大小
因为乐队是个很大的项目 它有着数以千计的图像插图 所生成变量的大小 从90MB到超过100MB
这些是iOS 12中 变量的数字
从这个图标中 可以立竿见影地看到 我们节省了10%到20%的 文件大小
你可能现在看这个数字 会感到有些熟悉 所有这些优化 都是我刚才介绍过的优化和压缩方法
这就是关于图像压缩的内容
我想让我的同事Patrick 来介绍下有关你app资源的 设计和生产的内容
谢谢 Will
这很棒 你刚刚了解到一些很不错的方法 你可以用这些方法在Xcode的 资源目录中改进你的资源 我要介绍一些 你可以通过资源目录 来优化你app中资源的方法 我想从设计和生产开始说 因为这是项目开始的地方 (设计和生产) 正如你所知 资源是来自于很多工具 很多不同的工作流 以及很多不同的资源的 但它们有一个共同点 它们终究在某种程度上是来自于人的 而且它组织良好 以便理解那些资源 进入你软件工作流的过程 而且要留意那些 在你app的整体效率中 占很大比重的细节
首先我想介绍的主题就是色彩管理 它总是被忽略 但是却十分重要
图像资源在磁盘上就是 一堆无聊的字节 对吧? 在你加上颜色之前 它什么意义都没有 那么它是如何有颜色的呢? 系统是怎么知道 那些字节上的数字是什么意思? 答案就是色彩配置文件 该文件会给每种颜色一个值 还有一个绝对比色分析值 它会告诉系统 它应该看起来是什么样的 我想要强调的是 维护你资源中的色彩配置文件 真的很重要 它们是保证资源如设计者 原本所想那样被送达 的元数据的重要组成部分 不要因为你觉得 它们只是额外的元数据 就将那些配置文件丢掉 就当是占去一堆负载 这些是进入你项目中的资源 让工具来操心 关于部署中的优化问题吧
为什么这个色彩配置文件很重要呢? 因为我们的设备有不同特征 不同大小的显示屏 所以就要有某些东西 保证你资源的实际颜色 会匹配合适 在这些不同的显示屏上 看起来及缩放时比较得当 这就是色彩管理的职责 这是个计算的过程 它可以由CPU完成 有时候是在GPU上 不过它的计算量不小
现在… 资源目录就会发挥作用了 因为在编译过程 的构建时间 它们会为你进行颜色匹配 这真的很棒 因为计算根本 不必在设备上进行 而且你的资源在设备上已经准备好了 准备好加载 准备好被显示 不会有任何的麻烦 还有意外收获就是 这个多出来的在构造时间 对色彩管理进行的处理 消除了你原来 可能要去掉的配置文件负载 并且将它替换成 一种非常高效的方法来注解 我们所拥有的颜色空间 以及磁盘上的像素
这就是色彩管理的内容 我想介绍一个相关的主题 就是工作空间 (工作空间) 这里的工作空间 我指的是 这些资源最开始起源的环境 这可能是设计者 或是工程师 在完成这些素材 你在设计工具中进行工作 你在创造内容 在这些场景中对你项目中 所有的设计文件 使用一致的色彩设定非常重要 这是个不错的实践方法 也有着技术层面的好处 因为它可以保证你app 管理的一致性 有两种被谈得最多 也是最推荐用来创建 工作设计文件的格式 8位sRGB 是目前最常见 最受欢迎的选择 它对于我们所有的设备 和你的内容类型有着最广泛的适用性 但是如果你在制作重要的资源 比如像是这个很棒的鲜花图标 一样的鲜活的设计 你可能要用到 我们某些设备上的广色域特性 并且使用广色域 使用生成的广色域资源吧 我推荐你们将Display P3 作为你们的工作配置文件 每个信道16位可以保证 你执行该设计时 不丢失任何内容 现在Xcode 以及运行时间平台 就有了更广的处理范围以及管理选项 来处理这个广色域资源 我不会太过深入介绍 但是我建议你们去参考一下 我两年前讲过的 “广色域处理”的演讲 我详细介绍了这些主题 并且会给你更多的背景知识 从去年开始 在developer.apple.com网站上的 iOS设计资源区有了 处理P3资源的好方法 (可拉伸图像) 现在让我们介绍一些
实际的软件资源 可能你的
用户界面要调整很多不同的 表现方式和布局 它通常会调用需要拉伸和变大的插图 以适应这些布局的变化 你要如何实现这些变化呢? 最常见的方法就是 识别出图像中可拉伸的部分 与不可拉伸的部分 为什么要有所区别呢? 幻灯片上有个简单的例子 假设我们的资源中有个漂亮的形状 像圆角这样 你想以所有可能的尺寸 保留的内容 就像是相框一样 你要保证不会拉伸 幻灯片中蓝色的这些部分 但是你可以拉伸黄色的部分 通常情况下 利用先进设计工具来实现的话 就是要将这些项分开 识别出所有的区域 并将它们当做独立的资源进行分发 比方说 程序员可以使用 draw three或是nine-part API 将其重新组装成最终的设计尺寸 这样做是可以的 而且已经被实践和使用了多年 不过它有一个不足之处 将这些图像重组成最终尺寸 是一个CPU负载很高的任务 它可能会有点复杂而且低效 这对于像是 Core Animation这样的 现代GPU UI管道来说并不合适
更好的方法是什么呢? 更好的办法就是 对于单个图像 就提供表明其拉伸部分的 拉伸元数据
这会带来对于可变尺寸图像来说 最优的、流畅的GPU动画
而且我很高兴地告诉你们资源目录 可以轻松使其实现
它叫做展示分割编辑器
它真的很容易用 你只需要点击开始分割按钮 然后你就会开始分割行 这可以让你识别出图像的可拉伸部分 与不可拉伸部分 在本例中 左侧和右侧检查完了 而中间部分是橙色的 也就是可拉伸的部分 现在 你可能注意到了 这个图像上面大部分 地方都有白色阴影 这是怎么回事呢? 这其实是一个很有意思的事 这部分的资源其实是不再被需要了 因为我们用剩下的三个部分 来表示所有可能的大小 为什么这很重要呢? 好处就是现在Xcode 可以在构造时间就知道这件事了 我们可以只取需要的部分 然后留下剩下的部分 所以我们就不要 将这一大块部分保存在磁盘字节上 这些字节会被用到你的app中的 这很棒 它还有另一个好处 这个更加隐晦一点 不过我很喜欢 这意味着你可以告诉你的设计师 可以以原始尺寸 送达资源 且不用为了有效部署 而对它们进行预处理 以使其尽可能地小 这不应该是设计师所考虑的 长远来说 把一眼就能看出来是什么的内容 放到源代码中 更有意义 让工具来考虑部署的细节问题 (资源目录展示分割) 除了图形化的检查器 以及图形化识别可拉伸部分的方法 当然了还有展示分割检查器 你可以更好地控制边缘插图 还可以控制中心部分 拉伸或覆盖的行为
所有这些内容 结合起来就是为了 让拉伸元数据接近于插图 这会让后面产生很大的收益 设计师会不可避免地 更新你的设计 现在你就可以在一个地方 更新所有内容 而不用记住代码中的五六个地方 这些地方你可能 有之前边缘插图的放置代码 现在它都集中到一个地方了
谢谢
接下来我想介绍一下矢量资源 (矢量资源) 由于我们所有产品的显示屏 都有不同的分辨率 你可能已经习惯于根据目标平台 使用1倍、2倍、3倍大的图像 不同的资源 这用起来并没有问题 但每次对于一个设计 都要用两三个资源 挺麻烦的 就是因为分辨率 没有别的什么原因
如果你可以避免使用这个方法 只用一个资源就可以? 你确实可以这么做 我们在资源目录中以PDF格式 支持矢量资源已经有些年头了 通过使用Xcode资源目录 你可以提供一个PDF Xcode就可以根据平台 生成、栅格化 那个PDF文件 为所有可应用范围内的 你app正指向的因素
这很棒 因为这意味着 你不要担心需要支付任何开销 在运行时间的设备上 渲染一个可能挺复杂的 PDF矢量资源
这让你对使用矢量有了些概念 有时候你可能 想在某种情况下将你的资源 以对比其最常用的设计尺寸不同 的尺寸或范围来显示 从去年的iOS 11 和Xcode 9开始 我们现在可以让你保留矢量数据 以便在图像被放入比该资源的 实际尺寸大的图像视图时 它可以找到原始的PDF矢量数据 另外我们已经去除链接 并清除了无关的元数据 和配置文件 所以它很棒很紧凑 还是尽可能小的
让我们在运行时间重新栅格化 但是除非你超出了原始尺寸 否则我们就用优化过的预渲染位图 这样做很棒 因为这意味着你的app 可以更灵活得响应动态类型 并且在你改变UIImage 视图大小的时候 自动地让你的图像看着更干脆
这就是矢量资源的内容
接下来我想介绍一点 关于2倍图像设计的内容 (2倍图像设计) 2倍图像 通常以视网膜为人所知 它是你的app用到的 最受欢迎 以及最常见的显示密度 这很棒 不是吗? 这是很大的进步 然而还是有时候 你在设计的时候
一道笔画或边 可能会在像素的边缘部分 从而导致边缘很模糊 它还没有那么高的分辨率 以至于你根本分辨不出 是锐利的还是模糊的边缘 有时候这仍然是设计资源的挑战
可以用什么技术来解决这个问题呢?
一个常见的设计手段 就是打开你矢量设计工具的 点边缘修整功能 设置一个点间隔的网格 打开修整功能 在你调整形状 或控制点的时候 你就知道它们是可以修整的 在它们修到边的时候 你就可以知道这是个像素边 这很不错 还有时候 你可能有个设计 的某些边或许是介于
1倍和2倍之间 但是你并不确定 你想知道 特别是在2倍视网膜设备上 会是什么样的 我可以对实际的显示密度 做进一步优化吗? 你其实可以用一个两倍的网格 在你的矢量设计工具中 将你的资源变成两倍大 并且把该网格变为一个像素的网格 也就是每两个点 每两个单元 会变为视网膜显示的一个点 然后调整你的资源 并使用点修整 来调整你的笔画和边缘来适应这里
真很不错 那现在该怎么做呢? 它太大了不是吗 难道不能用吗? 是可以用的! 你只需要把它放到 资源目录缩放桶里的2倍那一格 这就可以让Xcode 自动处理这个插图 知道它其实是插图的两倍部分 它有点太大了 一点并不等于视网膜显示的两个像素 而是刚好相反 我们来计算一下 我们要为所有其他范围因素渲染 右边所有的栅格化位图 并为你处理它 将设计师解放出来使用两倍网格 是非常有帮助的
(有提示的资源) 当然了 如果自动缩放还不够 或是在某些地方出问题的话 你对结果是有最终控制权的 你可以将有提示的位图 投放到合适的缩放因素桶中 接下来我们会使用它 来替代生成的PDF栅格化
这就是关于设计与生产的最后内容 现在让我们介绍下在Xcode中 收录和整理方面的内容 (很多选项) 对于你们当中使用过 Xcode资源目录的人来说 看到你面前有这么多东西 可能会感觉有些应付不过来 你们应该用什么呢 选择有很多 我要告诉你们
你应该只用有意义的那些选项 对你的项目来说有意义的 对于你要处理的内容有意义 有很多的选项 我们有一个非常强大的引擎 以及功能非常多的组织方案 不过你应该按需使用 从最简单的开始 然后一点点深入 (只用有意义的选项) 我想介绍两种可以在这个领域帮助 进行组织的方法 第一种是捆绑 我为什么要在介绍资源的 演讲上说捆绑呢? 这好像有点不太搭调 我想解决的是
大项目可能遇到的问题 如果你有一个大项目 可能有多个框架参与其中 你甚至可能会和多个团队一起协作 如果你要把所有的资源 都放到主app捆绑中 有时候会很困难 你要在那管理所有这些资源 并且保证名字没有冲突 而且… 被恰当地导入你app中的对应位置 你能解决这个问题的一个办法就是 把这些资源构建到多个捆绑中 因为Xcode会为每个捆绑或目标 生成一个唯一的资源目录部署 例如 考虑下创建一个 只有插图的捆绑 这会是个不错的重用策略 用一个统一的组件 来包含你所有的插图 这个组件有一致的命名空间
可以为你app的 其他组件提供图像
你要如何得到这些内容呢?很简单! 你只需要使用像是 UIImage这样的图像构造器 以与特征集合兼容的捆绑命名 从而可以给捆绑参数 当然了 在macOS端 有一个资源NS捆绑类图像 (捆绑) 你要记住的是 每个捆绑都会提供一个 唯一的命名空间 因此在这些空间中 名字必须是唯一的 但是在捆绑间 你可以使用 你喜欢的任何命名规则
说到命名空间 我想介绍另一个特性 以及大项目中所遇到的另一个挑战 在本例中 我所解决的问题是 大的集合 它们之中可能会有一些结构 (命名空间) 对吗? 想象下 你可能在某个app中 要处理50个不同的房间 每个房间里有一张桌子和一把椅子 它们每个都有资源 在你的代码中 你可以将它们指代为桌子和椅子 这看起来似乎很自然 但不幸的是有50个这样的东西 你要怎么做呢? 一种替代方案就是 生成某种形式的命名规则 看看在你的代码中如何多路分配 这不是最理想的方法 资源目录可以提供一个解决方案 就是使用所提供的命名空间选项
在将你的插图整理到 一个文件夹中之后 通过勾选这个框 我们就可以自动地将文件名
记录到每个图像 所对应的资源目录记录中 你后面可以用来得到相关数据 这是组织庞大结构的资源集合 的好方法
好了 那么 我们已经介绍了目录 现在让我们介绍一些 关于部署的令人兴奋的内容 这里真的很令人兴奋
(app精简) Will已介绍了 app精简的内容 我想大体上介绍下 我们对资源目录的 app精简所做的努力 总的来说你要做的就是 提供你app所有的变量内容 你要根据在不同设备上 运行app的需要 来调整你的内容 最常见的实现方法就是 划分产品组 iPad或是iPhone TV或是Watch或不同的分辨率 3倍和2倍图像 你要提供所有内容变量 来有效地调整你的内容 然后app精简要保证 我们选择了该内容的正确子集 这个子集的内容 适合于用户运行app 所使用的设备
我想介绍另一种 你可以实现同种内容调整的方式 那就是性能类 只是看待相同问题的一种不同方式 如果这个产品混合了 你的app看待连贯性的方式 由性能来划分 而不是其他特征呢? 你可以通过资源目录来实现这个目的 我们所支持的设备 有着很大范围的硬件变化 即使你回退了几个iOS版本 我是说从iPhone 5 一直到最新的iPhone 10 这是很大范围的性能变化 如果我们可以利用这点 可以不必限制你的app 来满足对最低性能设备 的支持不是很好吗? 这就是我们的目标 为了鱼和熊掌可以兼得 你可以通过适应性资源来解决 我会给你们介绍下如何解决 (内存类) 我们要划分性能连贯性的话 有两种主要的方法 第一种是内存类 这可能是最重要的一个 我们有4个内存层级 1GB到4GB 这对应了不同设备上 已经安装好的内存 这跨越了我们的整个产品线 是什么都没关系 它是这些桶的其中一个
第二个集合访问就是图形类 这其实反映了两件事 第一个就是 它们对应了Metal特征族集 若你是Metal程序员 你可能会对它熟悉 这个是GPU家族的概念 但它们实际上也与 你设备的处理器版本有关 Metal 1对应的是 Apple A7 而Metal 4对应的是 Apple A11处理器 我们允许你编类以及传送这些资源 到这些特定图形中的每一个类 (图形类) 对它们中的每个来说 本身就非常强大 有趣的是 你可以将这两个特征组合在一起 来形成一个完整的性能矩阵 你可以对如何 针对硬件环境调整你的资源 进行最后的校准 (完整性能矩阵) 这是如何实现的呢?
我想通过一个简单的例子 来向你们解释一下 这对于我们理解所做的事情来说 很关键 它可以帮助你理解应该如何使用它 在本例中 我们提供了三种特殊的资源 一个是供低性能设备所用的资源 然后我们提供了两种优化的资源 一个支持使用Metal 3的 3GB内存以上的设备 一个支持使用Metal 4的 2GB内存的设备 假设我是从 iPhone 8 Plus 选择的资源 我是以Metal 4的 4GB内存开始的 我找了一下 在4GB内存 层级什么都没有找到 接下来我就会降一个内存层级 并且在3GB内存层级进行查找
我在这找到了这个资源
我要选择它 重要的是 我已经在3GB的Metal 3 设备上选择了这个资源 尽管有一个资源 刚好匹配我的GPU类 但是因为在我们做图形类之前 我们更喜欢并以内存优先顺序 扫描事物 所以我们将首先选择它 这非常重要 因为我们确定内存是表现 设备整体性能的 最重要方式 所以 当我们在通过选择矩阵选择时 我们更倾向于选择它
这就是它的工作原理 你觉得怎么使用它呢? 内存实际上代表了 你的设备的总体空间 而且是性能的最佳聚合指标 这是一个非常好的选择 通过使用更大或更丰富的资源 更详细的资料 比磁盘空间更大的资料 以及占有更多储存空间 当它们在内存中拓展用于渲染时 丰富的用户体验通常 需要更高的内存 更高质量的图形 需要更精细的要求 因为它记录设备的原始处理能力 包括CPU和GPU 因此它适合处理更复杂的资源 也许 你使用了着色器 该着色器利用了 某些仅在特定GPU上 可用的某些功能 或者你放置的资源需要 比其他处理更多的运算 我想举两个简单的例子 作为思考的重点 以及它如何起作用 (使用性能类) 我想举例介绍下 NSDataAsset NSDataAsset是资产目录 中的一个简单部分 但是它非常强大 它主要是提供一个 灵活的容器的方法 你可以在资源目录中的任何文件中 放置内容变量 这不一定是一个图像 不一定是一个非常具体的格式 这可以是任何东西 但是你可以将其在app精简中 与资源目录一起使用 将任意的数据发送到 不同的性能类中 例如游戏中的剪切场景视频
你可能会提供一个很好的视频 你可以把它放在 性能范围的中间层级 然后你就有了一个 非常棒的高分辨率 它甚至可能是HDR 谁知道呢? 你可以将视频放在性能范围 的合适象限内 然后在低端 你可以放置静态图像 或是简单的图像序列 这些图像序列 不会占用设备上的任何时间 或过多的资源 你可以为仍然使用旧设备的用户 提供良好且响应迅速的用户体验
这是其中一个例子 另一个更有趣的例子是plist 为何我把plist放入资源目录? 似乎有比资源目录 更好的方式来部署plist 比如说 当你将它与 NSDataAsset结合使用时 你可以考虑使用plist来 调整你的app 并在你的NSDataAsset中 使用不同的配置参数 这些参数根据你编入plist的 性能等级进行调整 例如 如果你有
一个渲染人群的app 你可以根据底层硬件的性能 设置人群的大小 你的代码将根据当时运行的设备 自动进行自我调整 这就是有关如何使用 性能类的方法
接下来我想介绍下精灵地图集 精灵地图集是在几年前推出的 用来支持SpriteKit 游戏中的SpriteKit (精灵地图集) 那么… 我不打算在SpriteKit 游戏的背景下讨论它们 我将在常规app的环境中讨论它们
它们有一些属性 跟Will介绍过的 自动化图像打包很相似 你要采集精灵地图集中的 所有相关图像 并将它们打包成一个单元 它们会立即被加载 然后包含在该地图集中的 所有引用的图像 都只是轻量级引用地图集中的位置
这很棒
但关键问题所在就是 你并不需要 使用SpriteKit来访问它们 你可以就将其作为分组机制使用 因为Sprite地图集与 自动化图像打包的不同是 你可以控制分组 并且可以为其分配名称 你可以处理它 你可以控制它们 并以某种方式进行管理 不过你还是可以通过使用标准化的 UIImage和NSImage API 来访问里面的图像 还有它里面的名称 另外 还有一种使用SpriteKit 框架的有趣方式 即使你构建的不是 SpriteKit app 但是通过利用 SKTextureAtlas 名叫预加载栅格化地图集的API 如果你需要载入大量的图片 需要很快的加载 并且需要立即使用 那么这个API 会预先加载或从磁盘加载并解码 在内存中做好准备 并为一个已命名的地图集 异步回调一个 已完成处理的回调完成句柄 这很棒 但我要提醒你 不要随意使用这个API 因为它会完全按照它所说的去做 这意味着它可能会消耗大量的 I/O和内存来加载所有这些图像 所以请确保你会马上使用它们 这就是正确的选择 否则就会有没用的东西
精灵地图集的另一个强大之处在于 其中的任何图像都具有所有 在代码资源目录中 任何其他常规图像集的所有功能 包括所有的目录功能 所有压缩设置 以及所有的app精简功能 我们会注意自动 分割和整理你提供的 所有图像 按照像素格式 不同的设备特征 和不同的压缩类型分割它们 并确保所有内容都得到热处理 然后适当地进行精简 以便数据以正确的方式 传送到正确的设备
这些是关于部署的一些有趣的细节 我们在这项工作中的最后阶段 因此 我想提醒你 优化app资产的重要事项 首先 我认为Xcode资源目录 确实是管理你的app中 图像资源的最佳选择 今年你只需使用我们新的压缩算法 就可以使占用的 磁盘空间减少10%到20% 无论你采用何种部署目标 你在iOS 12平台上的用户 都会获得这些优势 这要归功于app精简的改进 现在可以优化最新的操作系统 而且 我们拥有大量的目录功能 你可以使用这些功能 来调整app的资源 来适应用户使用的设备
要了解相关的更多信息 请看看这个链接 (更多内容) 希望你们今天过得愉快 谢谢大家
-
-
正在查找特定内容?在上方输入一个主题,就能直接跳转到相应的精彩内容。
提交你查询的内容时出现错误。请检查互联网连接,然后再试一次。