优化手表表盘的内存使用

为了提供 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位图配置的图像和字体:\( width \times height \)

交互模式

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

  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存储库中找到。