Оптимизируйте использование памяти для циферблата

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. Применяется общий размер изображений и растровых шрифтов после обрезки, изменения размера и переформатирования.

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

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

Окружающий режим и слои

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

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

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

Методы снижения использования памяти

Для снижения потребления памяти воспользуйтесь следующими оптимизациями.

Обрезка и изменение размера растровых шрифтов.

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

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

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

При использовании BitmapFont убедитесь, что все изображения для символа имеют одинаковую высоту. Аналогично, убедитесь, что все изображения для слов имеют одинаковую высоту.

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

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

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

Удаление дубликатов изображений

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

Отображение прогресса с помощью дуг

Чтобы имитировать завершение индикатора выполнения через 1 минуту или 1 час, не используйте 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-файле. Размещая стрелки и дополнительные элементы часов в конце, вы позволяете системе исключить целый слой из расчета памяти в режиме окружающего освещения.

Оцените объем памяти, используемый циферблатом ваших часов.

Для измерения объема памяти, используемой вашим циферблатом, воспользуйтесь инструментом оценки объема памяти, доступным в репозитории watchface на GitHub.

{% verbatim %} {% endverbatim %} {% verbatim %} {% endverbatim %}