优化手表表面的内存使用

为了提供 Wear OS 设备的最佳续航时间,系统会执行内存使用量计算。 作为 Wear OS 应用质量指南 的一部分,使用手表表面格式的手表表面对可以消耗的内存量有限制,具体取决于手表的当前状态

  • 环境模式 下,手表表面不能消耗超过 10 MB 的内存。
  • 在交互模式下,手表表面不能消耗超过 100 MB 的内存。

系统计算手表表面的内存使用量

为了计算使用手表表面格式的手表表面中的图像或位图字体的尺寸,系统将完成以下步骤

  1. 解压缩图像或位图字体。
  2. 检查图像或位图字体,以查看它是否可以通过以下方法之一进行优化
    • 调整大小以更好地匹配其显示尺寸。
    • 裁剪以删除完全透明的像素。
    • 如果可以在不损失保真度的情况下进行降采样,则降采样到 RGB565

根据生成的边界框,系统计算图像或位图字体的尺寸(以字节为单位),如下所示

  • 对于使用 RGBA8888 的图像和字体:\( 4 \times width \times height \)
  • 对于使用 RGB565 的图像和字体:\( 2 \times width \times height \)
  • 对于使用 ALPHA_8 位图配置的图像和字体:\( 宽度 \times 高度 \)

交互模式

在计算交互模式的内存使用量时,系统会计算以下各项的总和:

  1. 任何 矢量字体 的未处理大小。
  2. 系统默认字体的估计使用量。
  3. 应用任何裁剪、调整大小或重新格式化后图像和位图字体的总大小。

配置

对于包含 配置 的表盘,系统会尝试计算不同配置中使用资源的总大小。有时,当组合数量非常多时,系统会稍微高估在不同配置之间同时使用的资源数量。

环境模式和图层

对于环境模式,系统假设手表使用最多三个全屏图层进行渲染,其中两个完全是静态的

  1. 手表元素下方的所有内容。表盘的“主体”大部分都合成到这个图层中。无论使用多少图像来绘制此图层,系统都将其计为一个全屏图像。
  2. 任何带有平台绑定并动态渲染的手表指针、数字显示或复杂功能。
  3. 源 XML 文件中手表指针和复杂功能之后列出的所有元素。

通常,环境模式中的大多数内存使用来自位图字体,尤其是大型位图字体。

减少内存使用的方法

按照本节中的建议操作,您更有可能创建内存消耗在这些限制内的表盘。

裁剪和调整位图字体的尺寸

裁剪图像和 BitmapFont 对象,并将它们调整为与显示尺寸匹配。

当 Wear OS 绘制表盘时,所有图像都会被解压缩。一个大部分为空白的全屏图像在磁盘上可能只占用 3 KB,但如果它在 450 像素 x 450 像素的屏幕上显示,系统会解压缩图像,将图像在内存中的大小增加到 750 KB 或更大。

使用一致的位图字体高度

使用 BitmapFont 时,每个字符的所有图像都应具有相同的高度。同样,所有词语的图像都应具有相同的高度。

在动画中使用一致的帧大小

不要将图像在表盘上移动,而是更新图像内的元素,并将它的边界框保持在相对于表盘的相同位置。例如,如果您想在表盘上为圆形做动画,请考虑更改圆形的颜色,而不是在表盘上滚动圆形。

此技术减少了系统为动画计算的边界框的大小。

对图像进行重复数据删除

如果您的表盘显示同一图像的多个副本,请只将该图像的单个副本包含在资源目录中,并多次引用它。

使用圆弧显示进度

要模拟 1 分钟或 1 小时后完成的进度条,请不要使用 60 张单独的图像。相反,请创建一个 Arc 对象,该对象包含一个表达式来控制它的长度,如下面的代码片段所示

<PartDraw angle="0" width="400" height="400" name="ProgressBar"
          pivotX="0.5" pivotY="0.5 x="40" y="40">
    <Arc centerX="200" centerY="200" width="400" height="400"
         startAngle="0" endAngle="360">
        <!-- Completes a "progress loop" every minute. -->
        <Transform target="endAngle"
                   value="0 + (clamp([SECOND], 0, 60) - 0) * 6" />
        <Stroke cap="ROUND" color="#123456" thickness="10" />
    </Arc>
</PartDraw>

要显示非连续线,例如要实现复古数字手表风格的外观,请使用 Stroke 对象的破折号属性或半透明蒙版图像叠加。

将手表指针和复杂功能放置在源文件的末尾

XML 节点按它们在源 XML 文件中的列出顺序绘制。通过将手表指针和复杂功能放在文件末尾,系统可以从环境模式内存计算中消除整个图层。

评估表盘的内存使用量

要测量表盘的内存使用量,请使用内存占用评估工具,该工具在 GitHub 上的 watchface 存储库中提供。