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

Para proporcionar la mejor duración de batería posible a los dispositivos Wear OS, el sistema realiza un cálculo del uso de la 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 a 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 imagen o una fuente de mapa de bits dentro de 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 imagen o la fuente de 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 visualización.
    • Se recortó para quitar píxeles completamente transparentes.
    • Se redujo el muestreo a RGB565, si se puede hacer sin pérdida de fidelidad.

En función del cuadro de límite resultante, el sistema calcula el tamaño de la imagen o 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 lo siguiente:

  1. El tamaño sin procesar de cualquier fuente vectorial.
  2. Es 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 cualquier recorte, cambio de tamaño o reformateo.

Configuraciones

En el caso de las caras de reloj que contienen parámetros de configuración, el sistema intenta calcular el tamaño total de los recursos que se usan en las diferentes configuraciones. En ocasiones, cuando hay una cantidad muy grande de combinaciones, el sistema sobreestima ligeramente la cantidad de recursos que se usan de forma simultánea en las diferentes configuraciones.

Modo ambiente y capas

Para el modo ambiente, el sistema supone que el reloj se renderiza usando 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 se compone en esta capa. No importa cuántas imágenes se usen para dibujar esta capa; el sistema la cuenta como una imagen de pantalla completa.
  2. Cualquier manecillas de reloj, pantalla digital o complicación con vinculaciones de plataforma que se rendericen 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 las fuentes de mapa de bits, en especial las grandes.

Métodos para reducir el uso de memoria

Si sigues las sugerencias de estas secciones, es más 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.

Usa tamaños de fotogramas coherentes en las animaciones

En lugar de mover una imagen en una cara de reloj, actualiza los elementos dentro de ella y mantén su cuadro delimitador 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, considera cambiar el color del círculo en lugar de hacer que se desplace por 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, incluye solo una copia de esa imagen en el directorio de recursos y haz referencia a ella varias veces.

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 aparecen en el archivo en formato XML de origen. Cuando colocas 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.

  • Nota: El texto del vínculo se muestra cuando JavaScript está desactivado
  • Arc
  • Line
  • Rectangle