Ottimizzare il rendimento delle immagini

Se non fai attenzione, lavorare con le immagini può causare rapidamente problemi di prestazioni. Quando lavori con bitmap di grandi dimensioni, puoi facilmente riscontrare un OutOfMemoryError. Segui queste best practice per assicurarti che la tua app funzioni al meglio.

Carica solo le dimensioni della bitmap di cui hai bisogno

La maggior parte degli smartphone ha 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 conseguente rendering della UI meno performante.

Per gestire le dimensioni delle immagini:

  • Ridimensiona i file immagine in modo che siano il più piccoli 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 diverse risoluzioni dello schermo (vedi suggerimento n. 3).
  • Utilizza una libreria di caricamento delle immagini, che ridimensiona l'immagine in modo che si adatti alle dimensioni della visualizzazione sullo schermo. Ciò può contribuire a migliorare le prestazioni di caricamento della schermata.

Utilizza i vettori anziché le bitmap, se possibile

Quando rappresenti qualcosa visivamente sullo schermo, devi decidere se può essere rappresentato come un vettore o meno. Preferisci le immagini vettoriali alle bitmap, perché non si pixelizzano quando le ridimensioni. 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 spedisci immagini con la tua app, valuta la possibilità di fornire asset di dimensioni diverse per le diverse risoluzioni dei dispositivi. Ciò può contribuire a ridurre le dimensioni del download dell'app sui dispositivi e a migliorare le prestazioni, in quanto caricherà un'immagine a risoluzione inferiore su un dispositivo a risoluzione inferiore. Per saperne di più su come fornire bitmap alternativi per diverse dimensioni dei dispositivi, consulta la documentazione sui bitmap alternativi.

Quando utilizzi 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. In questo modo, la GPU prepara la texture e migliora le prestazioni di visualizzazione di un elemento visivo sullo schermo. La maggior parte delle librerie di caricamento delle immagini esegue già questa ottimizzazione, ma se lavori direttamente con la classe ImageBitmap, è qualcosa da tenere a mente.

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

A causa della complessità della gestione delle immagini (ad esempio, scrivere una funzione equals per Bitmaps sarebbe costoso dal punto di vista computazionale), l'API Painter non è esplicitamente contrassegnata come classe Stable. Le classi instabili possono portare a ricomposizioni non necessarie perché il compilatore non può dedurre facilmente se i dati sono cambiati.

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

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

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

}

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

Più bitmap carichi in memoria, più è probabile che la memoria del dispositivo si esaurisca. Ad esempio, se carichi un lungo elenco di elementi componibili Image sullo schermo, utilizza LazyColumn o LazyRow per assicurarti che la memoria venga liberata quando scorri un lungo elenco.

Non includere immagini di grandi dimensioni nel file AAB/APK

Una delle cause principali delle grandi dimensioni del download dell'app è dovuta alla grafica inclusa nel file AAB o APK. Utilizza lo strumento APK Analyzer per assicurarti di non includere file di immagine più grandi del necessario. Riduci le dimensioni o valuta la possibilità di inserire le immagini su un server e scaricarle solo quando necessario.