Ottimizza il consumo di energia per la tua app

Questo documento descrive le best practice per ottimizzare il consumo energetico in un'app di navigazione mobile creata utilizzando l'SDK Navigation. Allo stesso tempo, descrive i compromessi da considerare quando si utilizzano queste pratiche. In particolare, questo documento tratta i seguenti argomenti:

  • Fonti di consumo energetico elevato, classificate dalla più alta alla più bassa.
  • Strategie per ottimizzare il consumo energetico, in ordine di importanza, a partire dalla frequenza fotogrammi.
  • Strategie per gli utenti finali per insegnare agli utenti della tua app come gestire l'utilizzo del dispositivo durante la navigazione.

Perché ottimizzare l'app di navigazione?

A seconda della situazione, gli utenti dell'app potrebbero eseguire le indicazioni stradali per lunghi periodi di tempo. Ad esempio, i conducenti e i corrieri possono lavorare per molte ore, completando le consegne in territori sconosciuti. In questi casi, si affidano molto alle indicazioni stradali passo passo in-app. Questo comporta alcuni problemi tipici:

  • Consumo eccessivo della batteria e disponibilità di caricabatterie. L'uso intenso del navigatore può causare un consumo più rapido della batteria del dispositivo rispetto al previsto. Molti utenti possono risolvere il problema caricando il dispositivo nel veicolo, ma i conducenti di veicoli a due ruote non possono.
  • Limitazione delle prestazioni del dispositivo dovuta al calore. Anche gli utenti che ricaricano continuamente il dispositivo possono riscontrare problemi. Un elevato consumo energetico per lunghi periodi di tempo può causare il surriscaldamento del dispositivo, con conseguente throttling termico e successiva perdita di prestazioni.

Le app di navigazione passo passo si basano su funzionalità che consumano molta energia, come lo schermo, il GPS e la comunicazione radio con le torri cellulari, quindi è consigliabile ottimizzare il consumo energetico dell'app mobile. Inoltre, devi considerare le esigenze di consumo energetico del tuo pubblico di destinazione per poter trovare il giusto compromesso tra prestazioni e ottimizzazione del consumo energetico.

Cosa consuma più energia?

Questa sezione divide le attività in-app associate a un elevato consumo di energia in due categorie:

  • Rendering dello schermo
  • Aggiornamenti posizione

Rendering dello schermo

Il rendering dello schermo di solito causa il consumo energetico più elevato nelle app di navigazione mobile. Ogni volta che il dispositivo disegna una mappa e altri elementi UI sullo schermo, si basa sull'elaborazione di GPU e CPU. Analogamente, quando l'utente lascia lo schermo acceso per lunghi periodi, il consumo di energia aumenta.

In una certa misura, puoi aspettarti un elevato consumo energetico da parte di conducenti o passeggeri che si affidano a una mappa visibile per navigare, soprattutto se utilizzano l'app ininterrottamente per molte ore. In questo scenario, l'app esegue anche una frequenza di rendering più elevata sullo schermo, perché la mappa viene aggiornata in tempo reale. In alcuni casi, lo schermo può essere ridisegnato quasi continuamente, soprattutto quando l'utente guida da una posizione all'altra senza fermarsi.

Aggiornamenti posizione

Oltre al rendering dello schermo, altre due attività di navigazione consumano energia del dispositivo:

  • Utilizzo della torre cellulare radio e del GPS
  • Aggiornamenti e condivisione della posizione, ad esempio per fornire un orario di arrivo stimato o per segnalare le posizioni di un veicolo in una flotta.

Sia il GPS che la comunicazione tramite segnale radio cellulare si basano su operazioni di avvio che consumano molta energia: il GPS deve trovare i satelliti e i segnali radio cellulari devono negoziare con le torri e stabilire una connessione. Per questi motivi, vengono eseguite praticamente in modo continuo durante la navigazione, anche se i segnali radio cellulari rimangono attivi per 20-30 secondi nel tentativo di ridurre al minimo i costi di avvio. Il sistema operativo controlla queste impostazioni, che non puoi configurare facilmente nella tua app.

Per gli aggiornamenti della posizione, il consumo energetico varia in base a fattori imprevedibili. Ad esempio, la distanza tra il dispositivo e la stazione base cellulare determina il consumo energetico, poiché il dispositivo utilizzerà il segnale minimo necessario per continuare la navigazione al fine di evitare di cambiare torre. Pertanto, un dispositivo che naviga in un'area con connettività scarsa consumerà più energia di uno vicino a una stazione base. Inoltre, alcune app potrebbero condividere gli aggiornamenti della posizione con un servizio centrale di gestione del parco risorse e, pertanto, dovranno comunicare con un server per farlo.

Ottimizzare il consumo energetico dell'app

La sfida per l'ottimizzazione del consumo energetico nelle app di navigazione è che queste app dipendono fortemente da risorse che consumano molta energia, il che limita le opzioni per mitigare l'impatto senza scendere a compromessi come la limitazione dell'utilizzo dello schermo. Questa sezione fornisce un elenco di approcci che puoi adottare durante l'ottimizzazione della tua app, in ordine dal più efficace al meno efficace.

Modifica la frequenza fotogrammi

Lo schermo aggiorna ciò che mostra a una frequenza nota come frame rate, solitamente misurata in frame al secondo (FPS). Poiché il rendering dello schermo utilizza una notevole quantità di elaborazione della CPU e della GPU, puoi ridurre la frequenza fotogrammi per risparmiare energia.

Quando riduci la frequenza fotogrammi, il rendering della mappa e i gesti interattivi (come la panoramica, lo zoom o la rotazione) possono apparire meno fluidi. Per bilanciare l'efficienza energetica con un'esperienza utente reattiva, puoi mantenere una frequenza fotogrammi di base bassa e aumentarla dinamicamente durante le interazioni attive degli utenti.

Sui dispositivi iOS, Maps SDK for iOS espone la proprietà preferredFrameRate su GMSMapView per controllare la frequenza fotogrammi. La tabella seguente mostra i valori di GMSFrameRate che puoi modificare:

Valore Swift Valore Objective-C Descrizione
.powerSave kGMSFrameRatePowerSave Utilizza la frequenza fotogrammi minima per ridurre l'utilizzo della batteria.
.conservative kGMSFrameRateConservative Utilizza una frequenza fotogrammi mediana per un rendering più fluido e per risparmiare cicli di elaborazione.
.maximum kGMSFrameRateMaximum Utilizza la frequenza fotogrammi massima per un dispositivo (30 FPS per i dispositivi di fascia bassa, 60 FPS per i dispositivi di fascia alta).

Per riferimento, consulta GMSFrameRate nella documentazione dell'SDK Navigation per iOS.

Per impostare direttamente la frequenza fotogrammi preferita, assegna un valore 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;

Regola la frequenza fotogrammi in modo dinamico durante i gesti

Frequenze fotogrammi più basse possono rendere le interazioni utente (come panoramica, zoom e rotazione) meno fluide. Puoi mantenere le interazioni fluide risparmiando energia aumentando temporaneamente la frequenza fotogrammi al massimo durante i gesti dell'utente, quindi tornando a una frequenza fotogrammi a risparmio energetico al termine del gesto.

Per farlo, adotta il protocollo GMSMapViewDelegate e implementa i seguenti metodi:

  1. In mapView:willMove:, controlla se il movimento della videocamera è stato avviato da un gesto dell'utente. Se gesture è true, imposta preferredFrameRate sul valore massimo.
  2. In mapView:idleAtCameraPosition:, ripristina la modalità a basso consumo di preferredFrameRate quando la videocamera diventa inattiva.

Il seguente esempio di codice mostra come regolare dinamicamente la frequenza fotogrammi durante le attivazioni dall'utente:

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

Anche se non puoi controllare il modo in cui l'utente finale imposta la luminosità dello schermo del dispositivo o per quanto tempo tiene acceso lo schermo, puoi fornire un'opzione per le indicazioni stradali senza mappa. In questo modo, l'utente finale può scegliere questa opzione per risparmiare energia. Ad esempio, se gli autisti lavorano regolarmente nello stesso quartiere, potrebbero non aver bisogno di indicazioni basate sulla mappa così spesso. La navigazione senza mappa può essere abilitata impostando una destinazione e avviando la guida nell'SDK Navigation, ma senza visualizzare una mappa.

Aggiungi una riga di codice per nascondere GMSMapView:

mapView.isHidden = true

L'SDK Navigation continuerà ad aggiornare le posizioni agganciate alla strada, l'orario di arrivo stimato e la distanza rimanente del percorso. Inoltre, la tua app potrà comunque iscriversi a tutti gli eventi generati dall'SDK man mano che il conducente procede. Questo non è appropriato per tutti i casi d'uso e non è un buon consiglio nei casi in cui il conducente deve vedere la mappa e seguire le indicazioni visive. Gli screenshot seguenti mostrano un confronto fianco a fianco dell'attivazione/disattivazione delle visualizzazioni della mappa durante la navigazione attiva.

App demo in esecuzione con la visualizzazione mappa visibile.
Figura 1.App demo iOS di Navigation SDK che mostra la demo Data Back
App demo in esecuzione senza visualizzazione mappa visibile.
Figura 2. App demo in esecuzione senza visualizzazione della mappa visibile. Tieni presente che il tempo e la distanza rimanenti, nonché la posizione agganciata alla strada, continuano ad aggiornarsi.

Usa uno stile di mappa scuro

Valuta la possibilità di personalizzare lo stile della mappa in modo da utilizzare un tema scuro per ridurre la quantità di energia necessaria per visualizzare la mappa sullo schermo.

L'SDK Navigation esegue il rendering delle mappe utilizzando Maps SDK for iOS, che contiene opzioni per lo stile di qualsiasi visualizzazione di mappa non di navigazione nella tua app. La visualizzazione di navigazione supporta anche l'attivazione forzata della modalità Buio. A causa delle differenze nel tipo di schermo, questa impostazione potrebbe non influire su tutti i dispositivi allo stesso modo, ma consente un potenziale risparmio energetico in alcuni casi. Un recente studio ha rilevato che la quantità di energia risparmiata dalla modalità Buio su alcuni schermi dipende dalla luminosità iniziale dello schermo. Ad esempio, la modalità Buio consente di risparmiare più energia sugli schermi impostati sulla luminosità massima rispetto agli schermi la cui luminosità è già regolata al 30-50% del massimo. È importante tenerne conto quando utilizzi la modalità Buio per le tue app, perché il risparmio energetico sarà relativo alla luminosità dello schermo impostata dall'utente finale.

Per scoprire di più sulla modifica della UI di navigazione, consulta Modificare la UI di navigazione.

SDK Navigation in esecuzione su un iPhone 15 Pro con uno stile di mappa scuro.
Figura 3. SDK Navigation configurato con uno stile di mappa scuro
Configura GMSMapView con un mapID che rappresenta uno stile di mappa basato su cloud definito nel tuo progetto.

La personalizzazione delle mappe basata su cloud richiede un ID mappa che rappresenti una configurazione della mappa lato server creata nel progetto della console Google. Per ulteriori informazioni sulla creazione di un ID mappa, consulta la documentazione per gli sviluppatori sull'ID mappa. Per ulteriori dettagli sulla progettazione e sul deployment di uno stile di mappa basato sul cloud, consulta la documentazione per gli sviluppatori sulla creazione e gestione di stili di mappa basati sul cloud.

Modificare la frequenza di aggiornamento della posizione GPS

Quando valuti il consumo di energia degli aggiornamenti della posizione inviati dal dispositivo, concentrati maggiormente sulla frequenza degli aggiornamenti della posizione piuttosto che sulla quantità di dati inviati nella trasmissione.

Non puoi controllare direttamente questo aspetto nell'SDK Navigation. Lo stesso consiglio vale per l'utilizzo di fonti di localizzazione non GPS (cellulare e Wi-Fi).

Tieni informati i tuoi utenti

Gli utenti della tua app potrebbero voler sapere come ottimizzare il consumo di energia. Per aiutarli a ridurre il consumo energetico delle loro app, consiglia ai tuoi utenti di procedere nel seguente modo:

  • Blocca lo smartphone
  • Metti l'app di navigazione in background
  • Se possibile, utilizza la navigazione senza una mappa
  • Riduci la luminosità dello schermo utilizzando la modalità Buio per gli schermi OLED e AMOLED o attivando la luminosità adattiva.
  • Mantieni il dispositivo fresco
  • Connettiti al Wi-Fi del veicolo, se disponibile

Misurare il consumo energetico

Puoi utilizzare strumenti di livello professionale per misurare il consumo energetico, ma spesso è difficile o costoso ottenerli. Gli strumenti di profilazione delle app e degli IDE, come Power Profiler in Android Studio e il riquadro Utilizzo della batteria in XCode Organizer, misurano il consumo energetico, ma può essere difficile rimuovere l'effetto dei processi in background o impostare una base di riferimento delle prestazioni rispetto alla quale eseguire la misurazione. In alcuni casi, le limitazioni del dispositivo potrebbero impedire l'accesso ai dati necessari.

Puoi utilizzare hardware di monitoraggio dell'alimentazione per scopi speciali e modificare la configurazione della connessione della batteria. Esistono prodotti e servizi commerciali che ti aiutano a farlo. Tieni presente che la modifica dei dispositivi in questo modo potrebbe invalidare la garanzia del dispositivo.