Dikkatli olmazsanız resimlerle çalışmak performans sorunlarına yol açabilir. JPG veya PNG gibi sıkıştırılmış biçimdeki küçük bir grafik bile görüntülenmek üzere kodu çözüldüğünde büyük bir bit eşleme haline gelebilir. Grafikleri verimli bir şekilde kullanmazsanı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östermesi için aşağıdaki en iyi uygulamaları izleyin.
Resim yükleme kitaplıklarını kullanma
Coil (öncelikli olarak Kotlin kullanılan 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 alt örnekleme ve grafik nesnelerini geri dönüştürme gibi işlemler yaparak uygulamanızın bellek kullanımını azaltır.
Resimlerin çözünürlüğünü düşürme
İhtiyaçlarınıza uygun resim boyutunu kullandığınızdan emin olun. Küçük bir kapsayıcıya (ör. küçük resim) büyük, yüksek çözünürlüklü bir resim yüklemekten kaçınmalısınız. Bunun yerine, bellekte kodunu çözmeden önce resmi küçültmek için alt örnekleme kullanın.
İstemci tarafı alt örnekleme
Coil ve Glide gibi resim yükleme kitaplıkları, alt örnekleme işlemini sizin adınıza otomatik olarak yapar. ImageLoader (Coil için) veya DownsampleStrategy (Glide için) kullanarak alt örnekleme stratejilerini yapılandırabilirsiniz. Bit eşlemleri manuel olarak yönetiyorsanız daha küçük bir sürümün kodunu çözmek için inSampleSize kullanabilirsiniz. Bunu güvenli bir şekilde yapmak için önce inJustDecodeBounds değerini true olarak ayarlayarak bellek ayırmadan resim boyutlarını okumanız, örnek boyutunu hesaplamanız, inSampleSize değerini bu değere ayarlamanız, inJustDecodeBounds değerini false olarak ayarlamanız ve ardından resmin kodunu çözmeniz gerekir.
Sunucu tarafında yeniden boyutlandırmayı tercih edin
Mümkün olduğunda, ihtiyacınız olan tam resim boyutlarını doğrudan arka uç sunucunuzdan isteyin. Bu sayede ağ kullanımı ve disk önbelleği ayak iziniz azalır. Ayrıca, cihazda resimlerin yeniden boyutlandırılmasından kaynaklanan bellek yükü önlenerek daha az bellek kullanılır.
Kitaplıkları, hedef görüntüleme boyutunu resim URL'sine dinamik olarak ekleyecek şekilde yapılandırabilirsiniz. Örneğin, Coil bunu özel kesiciler kullanarak yapmanıza olanak tanır. Glide ise özel model yükleyiciler (ör. BaseGlideUrlLoader) kullanarak destekler.
Sınırlanmamış düzen boyutlarından kaçının
Resim yükleyicilerin etkili bir şekilde alt örnekleme yapabilmesi (istemci tarafında veya sunucu tarafında) için isteği yürütmeden önce hedef boyutu bilmeleri gerekir.
Uzak resimleri yükleyen composable'larda wrapContentSize kullanmaktan veya boyutları kısıtlamadan bırakmaktan kaçının. Bu kitaplıklar hedef sınırları tahmin edemezse orijinal tam boyutlu resmi yüklemeye geri döner.
Bu durum, gerekenden çok daha büyük bir resmin yüklenmesine neden olarak bellek kullanımını ve gecikmeyi artırabilir.
Bunun yerine, resim bileşeninizde açık boyutlar ayarlayın (ör. Modifier.size kullanarak) veya bir en-boy oranı tanımlayın. Bu sayede düzen motoru, tam piksel hedefini önceden hesaplayabilir. Resim yükleyici, doğru boyuttaki öğeyi istemek ve kodunu çözmek için bu hedefi kullanabilir.
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üşünün. Bu sayede uygulamanızın cihazlardaki indirme boyutunu azaltabilir ve daha düşük çözünürlüklü bir cihazda daha düşük çözünürlüklü bir resim yükleyeceği için performansı artırabilirsiniz. Farklı cihaz boyutları için alternatif bit eşlemler sağlama hakkında daha fazla bilgi edinmek isterseniz alternatif bit eşlem belgelerine göz atın.
Doğrudan dolgu uygulamayın
Bazen bir resme dolgu eklemeniz gerekebilir. Örneğin, sinemaskop için resmin şeffaf bir kenarlıkla çevrelenmesini 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 kullanarak resmin ekrandaki konumunu ayarlayın.
Alternatif olarak, resmi barındıran 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 kullanın. Bu biçim, varsayılan ARGB_8888 biçiminin yarısı kadar bellek kullanır.
Glide'da bunu DecodeFormat kullanarak yapılandırabilirsiniz. Coil'de bitmapConfig özelliğini kullanabilirsiniz.
Mümkün olduğunda vektörleri kullanın
Geometrik şekillerden oluşan resimler için vektör grafik, bit eşlemden çok daha küçüktür ve her ekran yoğunluğuna göre sorunsuz bir şekilde ölçeklenir. 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 alanı kaplayabilir. Bu etkiyi 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 kalmadığında bitmap'leri kitaplığın yönetilen havuzuna bırakın. Kitaplık, gerektiğinde nesneleri yeniden kullanabilir ve gelecekteki ihtiyaçlar için bir bellek arabelleği bulundurur.
Grafikleri manuel olarak yönetiyorsanız çöp toplamaya güvenmek yerine, işiniz bittiğinde Bitmap.recycle yöntemini çağırarak bit eşlemleri serbest bırakmanız ve Bitmap referansını hemen silmeniz gerekir.
Diğer ipuçları ve püf noktaları
Bu bölümde, grafiklerle çalışırken uygulamanızın performansını artırmanın diğer birkaç yolu listelenmiştir.
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ında paketlenmiş grafiklerdir. Gereğinden büyük resim dosyalarını paketlemediğinizden emin olmak için APK Analyzer 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 bellek boşa harcanır. Gereksiz grafikleri belirlemek için Android Studio profil aracını kullanabilirsiniz. Yığın dökümü yakalamak için yığın dökümü analiz aracını kullanın ve sonuçları yinelenen bit eşlemler ayarını seçerek filtreleyin.
ImageBitmap kullanırken çizim yapmadan önce prepareToDraw yöntemini çağırın
ImageBitmap kullanırken dokuyu GPU'ya yükleme işlemini başlatmak için dokuyu ç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.
Oluşturulabilir öğenize parametre olarak Painter yerine Int DrawableRes veya URL iletmeyi tercih edin.
Resimlerle çalışmanın karmaşıklığı nedeniyle (örneğin, Bitmaps için bir eşittir işlevi yazmak hesaplama açısından maliyetli olur), Painter API'si @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 anlayamadığı için gereksiz yeniden oluşturmalara neden olabilir.
Bu nedenle, parametre olarak Painter 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ı