Dikkatli davranmazsanız resimlerle çalışırken hızlı bir şekilde performans sorunları yaşayabilirsiniz. JPG veya PNG gibi sıkıştırılmış bir biçimdeki küçük bir grafik bile, görüntüleme için kodu çözüldüğünde büyük bir bit eşleme haline gelebilir.Grafikleri kullanma şeklinizde verimli davranmazsanız uygulamanızın ve cihazdaki diğer uygulamaların performansını olumsuz etkileyebilecek bellek sorunlarıyla karşılaşabilirsiniz. Uygulamanızın en iyi performansı göstermesini sağlamak için aşağıdaki en iyi uygulamalardan yararlanın.
Resim yükleme kitaplıklarını kullanma
Coil (Kotlin öncelikli projeler için) veya Glide (Java projeleri için) gibi resim yükleme kitaplıklarını kullanarak uygulamanızın verimliliğini artırabilirsiniz. Bu kitaplıklar, resimleri önbelleğe alma, gerektiğinde grafikleri yeniden boyutlandırma ve grafik nesnelerini geri dönüştürme gibi işlemler yaparak uygulamanızın bellek kullanımını azaltır.
Gerekirse resimleri yeniden boyutlandırın.
İhtiyaçlarınıza uygun resim boyutunu kullandığınızdan emin olun. Örneğin, küçük bir küçük resme asla büyük bir resim yüklememelisiniz. Bunun yerine, görüntünün yeniden örneklenmiş bir sürümünü yüklemek için inSampleSize gibi bir yöntem kullanın.
Coil ve Glide gibi resim yükleme kitaplıkları, bu yeniden örneklemeyi varsayılan olarak sizin için otomatik olarak gerçekleştirir. ImageLoader (Coil için) veya DownsampleStrategy (Glide için) kullanarak alt örnekleme stratejilerini yapılandırabilirsiniz.
Farklı ekran boyutları için alternatif kaynaklar sağlama
Uygulamanızla birlikte resimler gönderiyorsanız farklı cihaz çözünürlükleri için farklı boyutlarda öğeler sağlamayı düşünebilirsiniz. Bu sayede, uygulamanızın cihazlardaki indirme boyutu azaltılabilir ve daha düşük çözünürlüklü bir cihazda daha düşük çözünürlüklü bir resim yükleneceğinden performans artırılabilir. Farklı cihaz boyutları için alternatif bit eşlemler sağlama hakkında daha fazla bilgi edinmek istiyorsanız alternatif bit eşlem dokümanlarına göz atın.
Dolgu doğrudan uygulanmaz
Bazen bir resme dolgu eklemeniz gerekebilir. Örneğin, letterbox için resmin şeffaf bir kenarlıkla çevrilmesini isteyebilirsiniz.
Bu gibi durumlarda, dolguyu doğrudan resme ekleyerek resmin boyutlarını değiştirmeyin. Bunun yerine, resmin boyutlarını olduğu gibi bırakın ve InsetDrawable simgesini kullanarak resmin ekrandaki konumunu ayarlayın.
Alternatif olarak, resmi tutan Composable veya View'a dolgu ekleyebilirsiniz.
Doğru piksel biçimini seçme
Doğru piksel biçimini seçerek bellek ve kalite arasında denge kurun. Şeffaflığa ihtiyacınız olmadığında RGB_565 biçimini kullanın. Bu biçim, varsayılan ARGB_8888 biçiminin yarısı kadar bellek kullanır.
Glide'da DecodeFormat kullanarak, Coil'de ise bitmapConfig özelliğini kullanarak bu ayarı yapılandırabilirsiniz.
Mümkün olduğunda vektörler kullanın
Geometrik şekillerden oluşan resimlerde vektör grafik, bit eşlemden çok daha küçüktür ve herhangi bir ekran yoğunluğunda sorunsuz şekilde ölçeklendirilir. Uygun olduğunda grafikleri temsil etmek için ShapeDrawable gibi öğeler kullanın.
Mümkün olduğunda bit eşlemleri serbest bırakın ve yeniden kullanın
Büyük grafik dosyaları çok fazla bellek kullanabilir. Bu nesnelerin etkisini azaltmak için grafik nesneleri mümkün olduğunca serbest bırakmalı veya yeniden kullanmalısınız.
Resim yükleme kitaplığı kullanıyorsanız artık ihtiyacınız olmadığında kitaplığın yönetilen havuzuna bit eşlemleri yayınladığınızdan emin olun. Kitaplık, gerektiğinde nesneleri yeniden kullanabilir ve gelecekteki ihtiyaçlar için kullanılabilir bir bellek arabelleği tutar.
Grafikleri manuel olarak yönetiyorsanız Bitmap.recycle işlevini çağırarak ve Bitmap referansını hemen atarak, atık toplama işlemine güvenmek yerine bit eşlemleri kullanmayı bırakmalısınız.
Diğer ipuçları ve püf noktaları
Bu bölümde, grafiklerle çalışırken uygulamanızın performansını artırmanın birkaç yolu daha listelenmektedir.
AAB/APK dosyanıza büyük resimler eklemeyin.
Uygulama indirme boyutunun büyük olmasının en önemli nedenlerinden biri, AAB veya APK dosyasına paketlenmiş grafiklerdir. Gerekenden daha büyük resim dosyaları paketlemediğinizden emin olmak için APK analiz aracı'nı kullanın. Boyutları küçültün veya resimleri bir sunucuya yerleştirip yalnızca gerektiğinde indirmeyi düşünün.
Gereksiz bit eşlemleri bulma
Aynı resmin birden fazla kopyası varsa bu, bellek israfına yol açar. Gereksiz grafikleri belirlemek için Android Studio profil aracını kullanabilirsiniz. Yığın dökümü yakalamak için yığın dökümü analizcisini kullanın ve yinelenen bit eşlemler ayarını seçerek sonuçları filtreleyin.
ImageBitmap kullanırken çizim yapmadan önce prepareToDraw işlevini çağırın
ImageBitmap kullanırken dokuyu GPU'ya yükleme sürecini başlatmak için dokuyu gerçekten ç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 aklınızda bulundurmanız gerekir.
Painter yerine parametre olarak composable'ınıza Int DrawableRes veya URL geçirmeyi tercih edin.
Resimlerle çalışmanın karmaşıklığı (ör. Bitmaps için eşittir işlevi yazmak hesaplama açısından maliyetli olur) nedeniyle Painter API, @Stable ek açıklamasıyla açıkça kararlı olarak işaretlenmez. Kararsız sınıflar, derleyici verilerin değişip değişmediğini kolayca çıkaramadığı için gereksiz yeniden oluşturmalara yol açabilir.
Bu nedenle, Painter öğesini parametre olarak iletmek yerine, composable'ınıza parametre olarak bir URL veya çizilebilir kaynak kimliği iletmenizi öneririz.
// Prefer this:
@Composable
fun MyImage(url: String) {
}
// Over this:
@Composable
fun MyImage(painter: Painter) {
}
Sizin için önerilenler
- Not: JavaScript kapalıyken bağlantı metni gösterilir.
- ImageBitmap ve ImageVector karşılaştırması {:#bitmap-vs-vector}
- Compose'da kullanıcı arayüzü durumunu kaydetme
- Jetpack Compose Aşamaları