Ottimizzare il rendimento delle immagini

Se non presta attenzione, l'utilizzo delle immagini può introdurre rapidamente dei problemi di prestazioni. Quando lavori con bitmap di grandi dimensioni, è facile imbatterti in un OutOfMemoryError. Segui queste best practice per assicurarti che la tua app funzioni al meglio.

Carica solo le dimensioni della bitmap necessarie

La maggior parte degli smartphone dispone di fotocamere ad alta risoluzione che producono file immagine di grandi dimensioni. Se mostri un'immagine sullo schermo, devi ridurre la risoluzione dell'immagine o caricare l'immagine solo fino alle dimensioni del contenitore dell'immagine. Il caricamento costante di immagini più grandi del necessario può esaurire le cache della GPU, con un rendering dell'interfaccia utente meno efficiente.

Per gestire le dimensioni delle immagini:

  • Fare lo scale down dei file immagine per ridurle il più possibile (senza influire sull'immagine di output).
  • Valuta la possibilità di convertire le immagini in formato WEBP anziché JPEG o PNG.
  • Fornisci immagini più piccole per risoluzioni dello schermo diverse (vedi il Suggerimento n. 3),
  • Utilizza una libreria di caricamento delle immagini, che riduce l'immagine per adattarsi alle dimensioni della visualizzazione sullo schermo. Ciò può contribuire a migliorare le prestazioni di caricamento dello schermo.

Se possibile, utilizza i vettori sopra le bitmap

Per rappresentare qualcosa visivamente sullo schermo, devi decidere se può essere rappresentato come un vettore o meno. Preferisci le immagini vettoriali alle immagini bitmap, in quanto non si sgranano quando vengono ridimensionate. Tuttavia, non tutto può essere rappresentato come vettore: le immagini scattate con una fotocamera non possono essere convertite in un vettore.

Fornire risorse alternative per schermi di dimensioni diverse

Se invii immagini con la tua app, valuta la possibilità di fornire asset di dimensioni diverse per risoluzioni del dispositivo diverse. In questo modo puoi ridurre le dimensioni di download dell'app sui dispositivi e migliorare le prestazioni perché un'immagine con risoluzione inferiore verrà caricata su un dispositivo con risoluzione inferiore. Per ulteriori informazioni su come fornire bitmap alternativi per le diverse dimensioni dei dispositivi, consulta la documentazione sulle bitmap alternativa.

Quando usi ImageBitmap, chiama prepareToDraw prima di disegnare

Quando utilizzi ImageBitmap, per avviare il processo di caricamento della texture sulla GPU, chiama ImageBitmap#prepareToDraw() prima di disegnarla effettivamente. Ciò aiuta la GPU a preparare la texture e a migliorare le prestazioni della visualizzazione di immagini sullo schermo. La maggior parte delle librerie per il caricamento delle immagini esegue già questa ottimizzazione, ma devi tenere a mente se stai lavorando alla classe ImageBitmap autonomamente.

Preferisci trasferire un DrawableRes o un URL Int come parametri nel tuo componibile anziché Painter

A causa delle complessità del trattamento delle immagini (ad esempio, scrivere una funzione uguale per Bitmaps sarebbe costoso dal punto di vista del calcolo), l'API Painter non è esplicitamente contrassegnata come stabile. Le classi instabili possono portare a ricomposizioni non necessarie, perché il compilatore non può dedurre facilmente se i dati sono stati modificati.

Di conseguenza, è preferibile passare un URL o un ID risorsa disegnabile come parametri al componibile, anziché passare un Painter come parametro.

// Prefer this:
@Composable
fun MyImage(url: String) {

}
// Over this:
@Composable
fun MyImage(painter: Painter) {

}

Non archiviare una bitmap in memoria più a lungo del necessario

Più bitmap carichi in memoria, più è probabile che tu possa esaurire la memoria sul dispositivo. Ad esempio, se carichi un lungo elenco di immagini componibili sullo schermo, usa LazyColumn o LazyRow per assicurarti che venga liberata memoria quando scorri un elenco di grandi dimensioni.

Non pacchettizzare immagini di grandi dimensioni con il file AAB/APK

Una delle cause principali delle dimensioni di download di un'app di grandi dimensioni è dovuta alla presenza di immagini pacchettizzate all'interno del file AAB o APK. Utilizza lo strumento di analisi APK per assicurarti di non pacchettizzare file immagine di dimensioni superiori a quelli richiesti. Riduci le dimensioni o valuta la possibilità di posizionare le immagini su un server e di scaricarle solo quando necessario.