Cómo optimizar el uso de memoria para tu cara de reloj

Para proporcionar la mejor duración de batería posible de los dispositivos Wear OS, el sistema realiza un cálculo de uso de memoria. Como parte de los lineamientos de calidad de apps para Wear OS, las caras de reloj que usan el Formato de Caras de Relojes tienen límites respecto de la cantidad de memoria que pueden consumir, según el estado actual del reloj:

  • En el modo ambiente, la cara de reloj no puede consumir más de 10 MB de memoria.
  • En el modo interactivo, la cara de reloj no puede consumir más de 100 MB de memoria.

El sistema calcula el uso de memoria de una cara de reloj

Para calcular el tamaño que ocupa una fuente de imagen o de mapa de bits en una cara de reloj que usa el Formato de Caras de Relojes, el sistema completa los siguientes pasos:

  1. Descomprime la imagen o la fuente de mapa de bits.
  2. Examina la fuente de la imagen o del mapa de bits para ver si se puede optimizar de una de las siguientes maneras:
    • Se cambió el tamaño para que coincida mejor con el tamaño de la pantalla.
    • Se recortó para quitar los píxeles completamente transparentes.
    • Se redujo el muestreo a RGB565 si se puede hacer sin pérdida de fidelidad.

Sobre la base del cuadro de límite resultante, el sistema calcula el tamaño de la imagen o de la fuente de mapa de bits, en bytes, como una de las siguientes opciones:

  • Para imágenes y fuentes que usan RGBA8888: \( 4 \times width \times height \)
  • Para imágenes y fuentes que usan RGB565: \( 2 \times width \times height \)
  • Para imágenes y fuentes que usan la configuración de mapa de bits ALPHA_8:\( width \times height \)

Modo interactivo

Cuando se calcula el uso de memoria para el modo interactivo, el sistema calcula la suma de los siguientes elementos:

  1. Tamaño sin procesar de cualquier fuente vectorial.
  2. El uso estimado de la fuente predeterminada del sistema.
  3. Es el tamaño total de las imágenes y las fuentes del mapa de bits después de aplicar recortes, cambios de tamaño o reformateos.

Configuraciones

En el caso de las caras de reloj que contienen configuraciones, el sistema intenta calcular el tamaño total de los recursos usados en las diferentes configuraciones. En ocasiones, cuando hay un gran número de combinaciones, el sistema sobreestima un poco la cantidad de recursos que se usan de forma simultánea en las diferentes configuraciones.

Capas y modo ambiente

Para el modo ambiente, el sistema supone que el reloj se renderiza con hasta tres capas de pantalla completa, dos de las cuales son completamente estáticas:

  1. Todo lo que está debajo de los elementos del reloj. La mayor parte del "cuerpo" de la cara de reloj está compuesto en esta capa. No importa cuántas imágenes se usen para dibujar esta capa; el sistema la cuenta como una imagen en pantalla completa.
  2. Cualquier manecilla de reloj, pantalla digital o complicación con vinculaciones de plataforma que se renderizan de forma dinámica
  3. Todos los elementos que se enumeran después de las manecillas del reloj y las complicaciones en el archivo en formato XML de origen.

Por lo general, la mayor parte del uso de memoria en el modo ambiente proviene de fuentes de mapas de bits, en especial las grandes.

Métodos para reducir el uso de la memoria

Si sigues las sugerencias de esta sección, es probable que crees una cara de reloj cuyo consumo de memoria se mantenga dentro de estos límites.

Recorta y cambia el tamaño de las fuentes del mapa de bits

Recorta tus imágenes y objetos BitmapFont, y cambia su tamaño para que coincidan con el tamaño de visualización.

Cuando Wear OS dibuja una cara de reloj, todas las imágenes se descomprimen. Una imagen de pantalla completa que está mayormente en blanco es posible que consuma 3 KB en disco, pero si se muestra en una pantalla de 450 x 450 píxeles, el sistema descomprime la imagen y aumenta su tamaño en la memoria a 750 KB o más.

Usa alturas de fuente de mapa de bits coherentes

Cuando se usa una BitmapFont, todas las imágenes de un carácter deben tener la misma altura. Del mismo modo, todas las imágenes de palabras deben tener la misma altura.

Cómo usar tamaños de fotogramas coherentes en las animaciones

En lugar de mover una imagen a través de una cara de reloj, actualiza los elementos dentro de la imagen y mantén su cuadro de límite en la misma ubicación en relación con la cara de reloj. Por ejemplo, si quieres animar un círculo en la cara de reloj, puedes cambiar el color del círculo en lugar de hacer rodar el círculo sobre la cara de reloj.

Esta técnica reduce el tamaño del cuadro de límite que el sistema calcula para la animación.

Anula el duplicado de imágenes

Si la cara de reloj muestra varias copias de la misma imagen, carga solo una copia de esa imagen en la memoria y haz varias referencias a esa imagen.

Muestra el progreso con objetos Arcs

Para emular una barra de progreso que se completa después de 1 minuto o después de 1 hora, no uses 60 imágenes distintas. En su lugar, crea un objeto Arc que contenga una expresión que controle su longitud, como se muestra en el siguiente fragmento de código:

<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>

Si quieres mostrar una línea no continua, por ejemplo, para lograr un estilo de reloj digital retro, usa una propiedad de guión para un objeto Stroke o una máscara semitransparente que funcione como una superposición de imágenes.

Coloca las manecillas del reloj y las complicaciones al final del archivo fuente

Los nodos XML se dibujan en el orden en que se enumeran en el archivo en formato XML de origen. Cuando se colocan las manecillas del reloj y las complicaciones al final del archivo, el sistema elimina una capa completa del cálculo de la memoria del modo ambiente.

Cómo evaluar el uso de memoria de tu cara de reloj

Para medir el uso de memoria de tu cara de reloj, usa la herramienta de evaluación de espacio en memoria, disponible en el repositorio watchface de GitHub.