Otimizar o consumo de energia do app

Este documento descreve as práticas recomendadas para otimizar o consumo de energia em um app de navegação para dispositivos móveis criado com o SDK Navigation. Ao mesmo tempo, ele descreve as compensações a serem consideradas ao empregar essas práticas. Especificamente, este documento aborda o seguinte:

  • Fontes de alto consumo de energia, classificadas do maior para o menor.
  • Estratégias para otimizar o consumo de energia, em ordem de importância, começando com o frame rate.
  • Estratégias para usuários finais para ensinar os usuários do app a gerenciar o uso do dispositivo durante a navegação.

Por que otimizar seu app de navegação?

Dependendo da situação, os usuários do app podem usar a orientação de navegação por longos períodos. Por exemplo, motoristas e entregadores podem trabalhar por longas horas, concluindo tarefas em territórios desconhecidos. Nesses casos, eles dependem muito da orientação de navegação guiada no app. Isso resulta em alguns problemas típicos:

  • Consumo elevado da bateria e disponibilidade de carregadores. O uso intenso da navegação pode fazer com que as baterias dos dispositivos descarreguem mais rápido do que o esperado. Embora muitos usuários possam resolver isso carregando o dispositivo no veículo, os motoristas de veículos de duas rodas não podem.
  • Limitação do dispositivo devido ao calor. Mesmo os usuários que carregam o dispositivo continuamente podem ter problemas. O alto consumo de energia por longos períodos pode causar o aquecimento do dispositivo, resultando em limitação térmica e perda de desempenho.

Os apps de navegação guiada dependem de recursos que consomem muita energia, como tela, GPS e comunicação por rádio com torres de celular. Por isso, é recomendável otimizar o uso de energia do seu app para dispositivos móveis. Além disso, considere as necessidades de uso de energia do seu público-alvo para que você possa fazer as compensações adequadas entre desempenho e otimização do consumo de energia.

O que consome mais energia?

Esta seção divide as atividades no app associadas ao alto consumo de energia em duas categorias:

  • Renderização da tela
  • Atualizações de localização

Renderização da tela

A renderização de tela geralmente causa o maior consumo de energia em apps de navegação para dispositivos móveis. Sempre que o dispositivo desenha um mapa e outros elementos da interface na tela, ele depende do processamento da GPU e da CPU. Da mesma forma, quando o usuário deixa essa tela ligada por muito tempo, isso também consome mais energia.

Em certa medida, é esperado um alto consumo de energia de motoristas ou passageiros que dependem de um mapa visível para navegar, principalmente se eles usarem o app continuamente por muitas horas. Nesse cenário, o app também realiza uma taxa maior de renderização na tela porque o mapa é atualizado em tempo real. Em alguns casos, a tela pode ser redesenhada quase continuamente, principalmente quando o usuário dirige de um lugar para outro sem parar.

Atualizações de localização

Além da renderização da tela, duas outras atividades de navegação consomem energia do dispositivo:

  • Uso de torres de celular de rádio e GPS
  • Atualizações do local e compartilhamento, como para fornecer um HEC ou reportar as posições de um veículo em uma frota.

A comunicação por GPS e rádio celular depende de operações de inicialização que consomem muita energia: o GPS precisa encontrar satélites, e os rádios celulares precisam negociar com torres e estabelecer uma conexão. Por esses motivos, eles são executados continuamente durante a navegação, mesmo que os rádios celulares permaneçam ativos por 20 a 30 segundos em uma tentativa de minimizar os custos de inicialização. O sistema operacional controla essas configurações, que não podem ser facilmente definidas no app.

Para atualizações do local, o uso de energia varia de acordo com fatores imprevisíveis. Por exemplo, a distância entre o dispositivo e a estação base celular determina o uso de energia, já que o dispositivo usa o sinal mínimo necessário para continuar a navegação e evitar a troca de torres. Portanto, um dispositivo navegando em uma área com conectividade ruim vai usar mais energia do que um que está perto de uma estação base. Além disso, alguns apps podem compartilhar atualizações de localização com um serviço central de gerenciamento de frota e, portanto, precisam se comunicar com um servidor para fazer isso.

Otimizar o uso de energia do app

O desafio de otimizar o uso de energia em apps de navegação é que eles dependem muito de recursos que consomem muita energia, o que limita suas opções de reduzir o impacto sem fazer concessões, como restringir o uso da tela. Nesta seção, apresentamos uma lista de abordagens que você pode adotar ao otimizar seu app, em ordem de impacto, do maior para o menor.

Mudar a taxa de frames

A tela atualiza o que mostra em uma frequência conhecida como frame rate, geralmente medida em quadros por segundo (QPS). Como a renderização de tela usa um processamento significativo de CPU e GPU, é possível reduzir o frame rate para economizar energia.

Quando você reduz o frame rate, a renderização do mapa e os gestos interativos (como movimento, zoom ou rotação) podem parecer menos suaves. Para equilibrar a eficiência energética com uma experiência do usuário responsiva, mantenha uma taxa de frames básica baixa e aumente dinamicamente durante as interações ativas do usuário.

Em dispositivos iOS, o SDK do Maps para iOS expõe a propriedade preferredFrameRate em GMSMapView para controlar a taxa de frames. A tabela a seguir mostra os valores de GMSFrameRate que podem ser ajustados:

Valor do Swift Valor de Objective-C Descrição
.powerSave kGMSFrameRatePowerSave Use a taxa de frames mínima para economizar bateria.
.conservative kGMSFrameRateConservative Use uma taxa de frames mediana para fornecer uma renderização mais suave e conservar ciclos de processamento.
.maximum kGMSFrameRateMaximum Use a taxa de frames máxima para um dispositivo (30 QPS para dispositivos de baixo custo e 60 QPS para dispositivos de alto custo).

Para referência, consulte GMSFrameRate na documentação do SDK do Navigation para iOS.

Para definir a taxa de frames preferida diretamente, atribua um valor a mapView.preferredFrameRate:

Swift

// Reduce the frame rate to conserve battery:
mapView.preferredFrameRate = .powerSave

Objective-C

// Reduce the frame rate to conserve battery:
mapView.preferredFrameRate = kGMSFrameRatePowerSave;

Ajustar a taxa de frames dinamicamente durante os gestos

Taxas de frames mais baixas podem fazer com que as interações do usuário (como movimentação para panorâmicas, zoom e rotação) pareçam instáveis. Você pode manter as interações fluidas e economizar energia aumentando temporariamente a taxa de frames para o máximo durante os gestos do usuário e voltando para uma taxa de frames de economia de energia quando o gesto termina.

Para fazer isso, adote o protocolo GMSMapViewDelegate e implemente os seguintes métodos:

  1. Em mapView:willMove:, verifique se o movimento da câmera foi iniciado por um gesto do usuário. Se gesture for true, defina preferredFrameRate como o máximo.
  2. Em mapView:idleAtCameraPosition:, restaure o preferredFrameRate para o modo de economia de energia quando a câmera ficar inativa.

O exemplo de código a seguir mostra como ajustar dinamicamente a taxa de frames durante gestos do usuário:

Swift

class YourViewController: UIViewController {

  @IBOutlet weak var mapView: GMSMapView!

  override func viewDidLoad() {
    super.viewDidLoad()
    mapView.delegate = self

    // Set a baseline low frame rate to conserve power:
    mapView.preferredFrameRate = .powerSave
  }
}

// MARK: - GMSMapViewDelegate
extension YourViewController: GMSMapViewDelegate {
  func mapView(_ mapView: GMSMapView, willMove gesture: Bool) {
    // Increase frame rate during user gestures for smooth interaction:
    if gesture {
      mapView.preferredFrameRate = .maximum
    }
  }

  func mapView(_ mapView: GMSMapView, idleAt position: GMSCameraPosition) {
    // Restore the power-saving frame rate when gestures finish:
    mapView.preferredFrameRate = .powerSave
  }
}

Objective-C

@interface YourViewController : UIViewController <GMSMapViewDelegate>
@end

@implementation YourViewController {
  GMSMapView *_mapView;
}

- (void)viewDidLoad {
  [super viewDidLoad];
  _mapView.delegate = self;

  // Set a baseline low frame rate to conserve power:
  _mapView.preferredFrameRate = kGMSFrameRatePowerSave;
}

#pragma mark - GMSMapViewDelegate

- (void)mapView:(GMSMapView *)mapView willMove:(BOOL)gesture {
  // Increase frame rate during user gestures for smooth interaction:
  if (gesture) {
    mapView.preferredFrameRate = kGMSFrameRateMaximum;
  }
}

- (void)mapView:(GMSMapView *)mapView
    idleAtCameraPosition:(GMSCameraPosition *)position {
  // Restore the power-saving frame rate when gestures finish:
  mapView.preferredFrameRate = kGMSFrameRatePowerSave;
}

@end

Embora não seja possível controlar como o usuário final define o brilho da tela do dispositivo ou por quanto tempo ele mantém a tela ligada, você pode oferecer uma opção de orientação de navegação sem um mapa. Isso permitiria que o usuário final escolhesse essa opção para economizar energia. Por exemplo, se os motoristas trabalham regularmente no mesmo bairro, talvez não precisem de orientação baseada em mapas com tanta frequência. A navegação sem um mapa pode ser ativada definindo um destino e iniciando a orientação no SDK de navegação, mas sem mostrar um mapa.

Adicione uma linha de código para ocultar o GMSMapView:

mapView.isHidden = true

O SDK Navigation vai continuar atualizando os locais ajustados à via, a ETA e a distância restante da viagem, e seu app ainda poderá se inscrever em todos os eventos gerados pelo SDK à medida que o motorista avança. Isso não é adequado para todos os casos de uso e não é uma boa dica quando o motorista precisa ver o mapa e seguir orientações visuais. As capturas de tela a seguir ilustram uma comparação lado a lado da alternância de visualizações do mapa durante a navegação ativa.

App de demonstração em execução com a visualização de mapa visível.
Figura 1.App de demonstração para iOS do SDK de navegação mostrando a demonstração de retorno de dados
App de demonstração em execução sem uma visualização de mapa visível.
Figura 2.App de demonstração em execução sem uma visualização de mapa visível. Observe que o tempo e a distância restantes, bem como o local ajustado à via, ainda estão sendo atualizados.

Usar um estilo de mapa escuro

Considere estilizar o mapa para usar um tema escuro e reduzir a quantidade de energia necessária para renderizar o mapa na tela.

O SDK Navigation renderiza os mapas usando o SDK do Maps para iOS, que contém opções para estilizar qualquer visualização de mapa que não seja de navegação no seu app. A visualização de navegação também permite forçar o modo escuro. Isso pode não afetar todos os dispositivos da mesma forma devido a diferenças no tipo de tela, mas permite uma possível economia de energia em alguns casos. Um estudo recente descobriu que a quantidade de energia economizada pelo modo escuro em algumas telas depende do brilho inicial da tela. Por exemplo, o modo escuro economiza mais energia em telas definidas com brilho total do que em telas com brilho já ajustado para 30 a 50% do máximo. Isso é importante ao usar o modo escuro nos apps, porque a economia de energia vai depender de como o usuário final define o brilho da tela.

Para saber mais sobre como modificar a interface de navegação, consulte Modificar a interface de navegação.

SDK de navegação em execução em um iPhone 15 Pro com um estilo de mapa escuro.
Figura 3: SDK Navigation configurado com um estilo de mapa escuro
Configure seu GMSMapView com um mapID que represente um estilo de mapa baseado na nuvem definido no seu projeto.

A Estilização de mapas baseada na nuvem requer um ID que represente uma configuração de mapa do lado do servidor criada no seu projeto do console do Google. Para mais informações sobre como criar um ID do mapa, consulte a documentação para desenvolvedores sobre o ID do mapa. Para mais detalhes sobre como criar e implantar um estilo de mapa baseado na nuvem, consulte a documentação do desenvolvedor sobre como criar e gerenciar estilos de mapa baseados na nuvem.

Mudar a frequência de atualização do local do GPS

Ao considerar o uso de energia das atualizações de local enviadas pelo dispositivo, concentre-se mais na frequência das atualizações do que na quantidade de dados enviados na transmissão.

Não é possível controlar isso diretamente no SDK Navigation. A mesma recomendação se aplica ao uso de fontes de localização que não são de GPS (celular e Wi-Fi).

Eduque os usuários

Os usuários do seu app podem querer saber como otimizar o consumo de energia. Para ajudar a reduzir o consumo de energia nos apps, aconselhe seus usuários a fazer o seguinte:

  • Bloquear o smartphone
  • Coloque o app de navegação em segundo plano
  • Usar a navegação sem um mapa, se possível
  • Reduza o brilho da tela usando o modo escuro para telas OLED e AMOLED ou ativando o brilho adaptável.
  • Mantenha o dispositivo resfriado
  • Conecte-se ao Wi-Fi do veículo, se disponível

Medir o consumo de energia

É possível usar ferramentas de nível profissional para medir o consumo de energia, mas geralmente é difícil ou caro adquiri-las. Apps e ferramentas de criação de perfil de ambiente de desenvolvimento integrado, como o Power Profiler no Android Studio e o painel de uso da bateria no XCode Organizer, medem o consumo de energia, mas pode ser difícil remover o efeito de processos em segundo plano ou definir um valor de referência de desempenho para medição. Em alguns casos, as restrições do dispositivo podem impedir o acesso aos dados necessários.

É possível usar hardware de monitoramento de energia para fins especiais e modificar a configuração da conexão da bateria. Há produtos e serviços comerciais que podem ajudar você a fazer isso. Modificar dispositivos dessa forma pode anular a garantia.