Otimizar o uso da memória para o mostrador do relógio

Para oferecer a melhor duração possível da bateria dos dispositivos Wear OS, o sistema realiza um cálculo de uso da memória. Como parte das Diretrizes de qualidade de apps para Wear OS, os mostradores de relógio que usam esse formato têm limites na quantidade de memória que podem consumir, dependendo do estado atual do relógio:

  • No modo ambiente, o mostrador do relógio não pode consumir mais de 10 MB de memória.
  • No modo interativo, o mostrador não pode consumir mais de 100 MB de memória.

O sistema calcula o uso da memória do mostrador do relógio

Para calcular o tamanho ocupado por uma imagem ou fonte de bitmap em um mostrador do relógio que usa o Formato do mostrador do relógio, o sistema conclui as seguintes etapas:

  1. Descompacta a imagem ou a fonte do bitmap.
  2. Examina a imagem ou a fonte do bitmap para saber se ela pode ser otimizada de uma das seguintes maneiras:
    • A imagem foi redimensionada para corresponder melhor ao tamanho de exibição.
    • A imagem foi cortada para remover pixels totalmente transparentes.
    • Reduziu a amostragem para RGB565, se isso puder ser feito sem perda de fidelidade.

Com base na caixa delimitadora resultante, o sistema calcula o tamanho da imagem ou da fonte do bitmap, em bytes, como uma das seguintes opções:

  • Para imagens e fontes que usam RGBA8888: \( 4 \times width \times height \)
  • Para imagens e fontes que usam RGB565: \( 2 \times width \times height \)
  • Para imagens e fontes que usam a configuração de bitmap ALPHA_8: \( width \times height \)

Modo interativo

Ao calcular o uso da memória para o modo interativo, o sistema calcula a soma dos seguintes itens:

  1. O tamanho não processado de quaisquer fontes vetoriais.
  2. O uso estimado da fonte padrão do sistema.
  3. O tamanho total das imagens e fontes de bitmap depois que qualquer corte, redimensionamento ou reformatação tenha sido aplicado.

Configurações

Para mostradores de relógio que contêm configurações, o sistema tenta calcular o tamanho total dos recursos usados nas diferentes configurações. Às vezes, quando há um número muito grande de combinações, o sistema superestima um pouco quantos recursos são usados simultaneamente nas diferentes configurações.

Modo ambiente e camadas

No modo ambiente, o sistema supõe que o relógio é renderizado usando até três camadas de tela cheia, duas delas completamente estáticas:

  1. Tudo o que estiver abaixo dos elementos do relógio. A maior parte do corpo do mostrador do relógio é composta nessa camada. Não importa quantas imagens são usadas para desenhar essa camada, o sistema a conta como uma imagem em tela cheia.
  2. Todos os ponteiros do relógio, telas digitais ou complicações com vinculações de plataforma que são renderizadas dinamicamente.
  3. Todos os elementos listados após os ponteiros do relógio e as complicações no arquivo XML de origem.

Normalmente, a maior parte do uso da memória no modo ambiente vem de fontes de bitmap, especialmente as grandes.

Métodos para reduzir o uso da memória

Seguindo as sugestões nestas seções, você terá mais chances de criar um mostrador de relógio com o consumo de memória dentro desses limites.

Cortar e redimensionar fontes de bitmap

Corte e redimensione as imagens e os objetos BitmapFont para que correspondam ao tamanho de exibição.

Quando o Wear OS renderiza um mostrador do relógio, todas as imagens são descompactadas. Uma imagem em tela cheia quase em branco pode consumir 3 KB no disco. Porém, se ela aparecer em uma tela de 450 x 450 pixels, o sistema descompactará a imagem, aumentando o tamanho dela para 750 KB ou mais na memória.

Usar alturas consistentes de fontes de bitmap

Ao usar uma BitmapFont, todas as imagens de um caractere precisam ter a mesma altura. Da mesma forma, todas as imagens de palavras precisam ter a mesma altura.

Usar tamanhos de frame consistentes nas animações

Em vez de mover uma imagem em um mostrador do relógio, atualize os elementos dentro da imagem e mantenha a caixa delimitadora no mesmo local em relação ao mostrador do relógio. Por exemplo, se você quiser animar um círculo no mostrador do relógio, mude a cor dele em vez de rolar o círculo por cima.

Essa técnica reduz o tamanho da caixa delimitadora que o sistema calcula para a animação.

Eliminar a duplicação de imagens

Se o mostrador do relógio mostrar várias cópias da mesma imagem, carregue apenas uma cópia dessa imagem na memória e faça várias referências a ela.

Mostrar progresso usando arcos

Para emular uma barra de progresso que é concluída após um minuto ou após uma hora, não use 60 imagens separadas. Em vez disso, crie um objeto Arc contendo uma expressão que controle o comprimento dele, conforme mostrado no snippet de código abaixo:

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

Para mostrar uma linha não contínua, por exemplo, para criar uma aparência retrô no estilo de relógio digital, use uma propriedade de traço para um objeto Stroke ou uma máscara semitransparente de sobreposição de imagem.

Coloque os ponteiros do relógio e as complicações no final do arquivo de origem

Os nós XML são desenhados na ordem em que estão listados no arquivo XML de origem. Ao colocar os ponteiros do relógio e as complicações no final do arquivo, o sistema elimina uma camada inteira do cálculo de memória do modo ambiente.

Avaliar o uso da memória do mostrador do relógio

Para medir o uso da memória do mostrador do relógio, use o avaliador de consumo de memória, disponível no repositório watchface (link em inglês) no GitHub.