Как оптимизировать использование памяти для циферблата

Wear OS отслеживает использование памяти, чтобы продлить время работы от батареи. Согласно рекомендациям по обеспечению качества приложений для Wear OS, циферблаты, созданные в формате Watch Face Format, имеют следующие ограничения по памяти:

  • Фоновая подсветка: максимальный объем используемой памяти – 10 МБ.
  • Интерактивный режим: максимальный объем используемой памяти – 100 МБ.

Расчет использования памяти

Чтобы вычислить использование памяти для изображения или битового шрифта на циферблате с помощью Watch Face Format, система выполняет следующие действия:

  1. Распакуйте изображение или шрифт.
  2. Проверьте, применимы ли следующие варианты оптимизации:
    • Изменение размера для лучшего отображения на экране.
    • Как обрезать прозрачные пиксели
    • Понижение дискретизации до RGB565 без потери качества.

Размер вычисляется на основе полученной граничной рамки следующим образом:

  • Для изображений и шрифтов, использующих RGBA8888: 4 x ширина x высота
  • Для изображений и шрифтов, использующих RGB565: 2 x ширина x высота
  • Для изображений и шрифтов, использующих конфигурацию растрового изображения ALPHA_8: ширина x высота.

Интерактивный режим

Чтобы рассчитать использование памяти в интерактивном режиме, система суммирует следующие значения:

  1. Необработанный размер любых векторных шрифтов.
  2. Расчетное использование системного шрифта по умолчанию
  3. Общий размер изображений и растровых шрифтов после кадрирования, изменения размера и переформатирования.

Конфигурации

Для циферблатов с конфигурациями система пытается рассчитать общий размер ресурсов циферблата для разных конфигураций. Если количество комбинаций очень велико, система может переоценить количество ресурсов, используемых одновременно.

Спящий режим и слои

Система предполагает, что в режиме ожидания используется до трех полноэкранных слоев, два из которых статичны. Слои включают:

  1. Фон циферблата. Система воспринимает это как одно изображение, независимо от того, сколько изображений входит в фон.
  2. Подвижные части, например руки, цифровые дисплеи или динамические элементы.
  3. Остальные элементы из исходного XML-файла.

В фоновом режиме больше всего памяти обычно занимают крупные шрифты с битовой картой.

Как уменьшить использование памяти

Чтобы уменьшить использование памяти, примените следующие оптимизации.

Как кадрировать и изменять размер растровых шрифтов

Обрежьте изображения и BitmapFont объекты, чтобы они соответствовали размеру экрана.

Wear OS отрисовывает циферблаты со всеми распакованными изображениями. Почти пустое полноэкранное изображение может занимать на диске 3 КБ, но на экране размером 450 x 450 пикселей – 750 КБ или больше.

Используйте одинаковую высоту растровых шрифтов

Если вы используете тип BitmapFont, убедитесь, что у всех изображений персонажа одинаковая высота. Также убедитесь, что у всех изображений для слов одинаковая высота.

Используйте в анимации кадры одинакового размера

Вместо того чтобы перемещать изображение по циферблату, обновите элементы изображения и сохраните положение ограничительной рамки. Например, чтобы анимировать круг на циферблате часов, измените его цвет, а не прокручивайте его.

Этот метод позволяет уменьшить размер расчетной граничной рамки анимации.

Как дедуплицировать изображения

Чтобы показать изображение несколько раз, добавьте только один ресурс изображения и укажите его несколько раз.

Как показывать прогресс с помощью дуг

Чтобы имитировать завершение выполнения задачи через минуту или час, не используйте 60 изображений. Используйте объект Arc с выражением, определяющим его длину, как показано ниже:

<PartDraw angle="0" width="400" height="400" name="ProgressBar"
    pivotX="0.5" pivotY="0.5" x="25" y="25">
    <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="#654456" thickness="10" />
    </Arc>
</PartDraw>

Чтобы отобразить прерывистую линию, например в стиле ретро-цифровых часов, используйте свойство dash для объекта Stroke или полупрозрачный оверлей маски изображения.

Размещайте стрелки часов и дополнения в конце исходного файла

Узлы XML рисуются в порядке, указанном в исходном XML-файле. Если разместить стрелки и дополнительные функции в конце, система сможет исключить целый слой из расчета памяти для режима Ambient.

Как оценить использование памяти циферблатом

Чтобы измерить использование памяти циферблатом, воспользуйтесь инструментом memory footprint evaluator, доступным в репозитории watchface на GitHub.