Ottimizzare il rendimento delle immagini

Se non presti attenzione, lavorare con le immagini può causare rapidamente problemi di prestazioni. Quando lavori con bitmap di grandi dimensioni, puoi facilmente riscontrare un errore 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 di immagini 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 dell'interfaccia utente meno performante.

Per gestire le dimensioni delle immagini:

  • Riduci le dimensioni dei file di 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 risoluzioni dello schermo diverse (vedi il suggerimento n. 3).
  • Utilizza una libreria di caricamento delle immagini che riduce le dimensioni dell'immagine per adattarla alle dimensioni della visualizzazione sullo schermo. Questo può contribuire a migliorare le prestazioni di caricamento dello schermo.

Se possibile, utilizza immagini vettoriali anziché bitmap

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 a dimensioni diverse. Tuttavia, non tutto può essere rappresentato come un vettore: le immagini scattate con una fotocamera non possono essere convertite in un vettore.

Fornisci risorse alternative per diverse dimensioni dello schermo

Se distribuisci immagini con la tua app, valuta la possibilità di fornire asset di dimensioni diverse per risoluzioni dei dispositivi diverse. Questo 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 ulteriori informazioni su come fornire bitmap alternative per diverse dimensioni dei dispositivi, consulta la documentazione sulle bitmap alternative.

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 può preparare la texture e migliorare le prestazioni della visualizzazione di un'immagine 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 presente.

È preferibile passare un Int DrawableRes o un URL come parametri al componente 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 è contrassegnata esplicitamente 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 componente 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, maggiore è la probabilità che la memoria del dispositivo si esaurisca. Ad esempio, se carichi un elenco di grandi dimensioni di componenti componibili Image sullo schermo, utilizza LazyColumn o LazyRow per assicurarti che la memoria venga liberata quando scorri un elenco di grandi dimensioni.

Non comprimere immagini di grandi dimensioni nel file AAB/APK

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