Performansı resimler için optimize etme

Dikkatli olmazsanız resimlerle çalışırken kısa sürede performans sorunlarıyla karşılaşabilirsiniz. Büyük bitmap'lerle çalışırken OutOfMemoryError ile karşılaşmanız oldukça olasıdır. Uygulamanızın en iyi performansı göstermesini sağlamak için aşağıdaki en iyi uygulamaları izleyin.

Yalnızca ihtiyacınız olan bitmap boyutunu yükleyin

Çoğu akıllı telefonda büyük resim dosyaları oluşturan yüksek çözünürlüklü kameralar bulunur. Ekranda bir resim gösteriyorsanız resmin çözünürlüğünü düşürmeniz veya resmi yalnızca resim kapsayıcınızın boyutuna kadar yüklemeniz gerekir. Gerekli olandan daha büyük resimlerin sürekli yüklenmesi GPU önbelleğini tüketebilir ve kullanıcı arayüzünün daha düşük performansla oluşturulmasına neden olabilir.

Resim boyutlarını yönetmek için:

  • Resim dosyalarınızı mümkün olduğunca küçük olacak şekilde ölçeklendirin (çıktı resmini etkilemeden).
  • JPEG veya PNG yerine resimlerinizi WEBP biçimine dönüştürmeyi deneyin.
  • Farklı ekran çözünürlükleri için daha küçük resimler sağlayın (3. İpucu'na bakın),
  • Resminizi ekrandaki görünümünüzün boyutuna sığacak şekilde küçülten bir resim yükleme kitaplığı kullanın. Bu, ekranınızın yükleme performansını artırmanıza yardımcı olabilir.

Mümkün olduğunda bitmap yerine vektörleri kullanın

Bir nesneyi ekranda görsel olarak temsil ederken nesnenin vektör olarak temsil edilip edilemeyeceğine karar vermeniz gerekir. Farklı boyutlara ölçeklendirdiğinizde pikselleşmediği için bitmap yerine vektör resimleri tercih edin. Ancak her şey vektör olarak temsil edilemez. Kamerayla çekilen resimler vektöre dönüştürülemez.

Farklı ekran boyutları için alternatif kaynaklar sağlama

Uygulamanızla birlikte resim gönderiyorsanız farklı cihaz çözünürlükleri için farklı boyutlarda öğeler sağlayabilirsiniz. Bu, cihazlardaki uygulamanızın indirme boyutunu azaltmaya yardımcı olabilir ve daha düşük çözünürlüklü bir cihazda daha düşük çözünürlüklü bir resim yükleyeceğinden performansı artırabilir. Farklı cihaz boyutları için alternatif bitmapler sağlama hakkında daha fazla bilgi için alternatif bitmap dokümanlarına göz atın.

ImageBitmap'ü kullanırken çizim yapmadan önce prepareToDraw'ü arayın

ImageBitmap kullanırken, dokuları GPU'ya yükleme işlemini başlatmak için dokuları çizmeden önce ImageBitmap#prepareToDraw() işlevini çağırın. Bu, GPU'nun dokuyu hazırlamasına ve ekranda görsel gösterme performansını artırmasına yardımcı olur. Çoğu resim yükleme kitaplığı bu optimizasyonu zaten yapar ancak ImageBitmap sınıfıyla kendiniz çalışıyorsanız bunu göz önünde bulundurmanız gerekir.

Painter yerine, Int DrawableRes veya URL'yi parametre olarak kompozisyonunuza göndermeyi tercih edin.

Resimlerle çalışmanın karmaşıklığı nedeniyle (örneğin, Bitmaps için bir eşittir işlevi yazmak hesaplama açısından pahalı olur), Painter API'si açıkça Kararlı sınıfı olarak işaretlenmemiştir. Derleyici, verilerin değişip değişmediğini kolayca anlayamadığından kararsız sınıflar gereksiz yeniden derlemelere neden olabilir.

Bu nedenle, parametre olarak Painter yerine URL veya çizilebilir kaynak kimliği iletmeniz önerilir.

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

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

}

Bir bitmap'i, ihtiyacınız olandan daha uzun süre bellekte saklamayın

Belleğe ne kadar fazla bitmap yüklerseniz cihazda bellek tükenme olasılığı o kadar artar. Örneğin, ekrana büyük bir resim bileşimi listesi yüklüyorsanız büyük bir listede gezinirken belleğin boşaltılmasını sağlamak için LazyColumn veya LazyRow tuşlarını kullanın.

Büyük resimleri AAB/APK dosyanızla birlikte paketlemeyin

Uygulama indirme boyutunun büyük olmasının en önemli nedenlerinden biri, AAB veya APK dosyasına paketlenmiş grafiklerdir. Gerekli olandan daha büyük resim dosyaları paketlemediğinizden emin olmak için APK analiz aracını kullanın. Boyutları azaltın veya resimleri bir sunucuya yerleştirip yalnızca gerektiğinde indirmeyi düşünün.