Bit eşlem resimleri optimize etme

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ü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östermesini sağlamak için aşağıdaki en iyi uygulamalardan yararlanın.

Resim yükleme kitaplıklarını kullanma

Coil (Kotlin'in öncelikli olduğu 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 grafiklerin alt örneklemesini yapma ve grafik nesnelerini geri dönüştürme gibi işlemler yaparak uygulamanızın bellek kullanımını azaltır.

Resimleri alt örnekleme

İ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 ve yüksek çözünürlüklü bir resim yüklemekten kaçınmalısınız. Bunun yerine, görüntüyü belleğe çözmeden önce ölçeğini küçültmek için alt örnekleme kullanın.

İstemci tarafında örnekleme azaltma

Coil ve Glide gibi resim yükleme kitaplıkları, alt örnekleme işlemini sizin için otomatik olarak gerçekleştirir. ImageLoader (Coil için) veya DownsampleStrategy (Glide için) kullanarak bunların örnekleme azaltma 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 görüntü boyutlarını bellek ayırmadan okumalı, örnek boyutunu hesaplamalı, inSampleSize değerini bu değere ayarlamalı, inJustDecodeBounds değerini false olarak ayarlamalı ve ardından görüntünün kodunu çözmelisiniz.

Sunucu tarafında yeniden boyutlandırmayı tercih etme

Mümkün olduğunda, ihtiyacınız olan tam resim boyutlarını doğrudan arka uç sunucunuzdan isteyin. Bu özellik, ağ kullanımını ve disk önbelleği alanınızı azaltırken cihazdaki görüntüleri yeniden boyutlandırmanın bellek yükünü önleyerek daha az bellek kullanımına olanak tanır.

Kitaplıkları, hedef görünüm boyutunu resim URL'sine dinamik olarak ekleyecek şekilde yapılandırabilirsiniz. Örneğin, Coil, özel araya girenler kullanarak buna izin verir ve Glide, özel model yükleyiciler (ör. BaseGlideUrlLoader) kullanarak bunu destekler.

Sınırsız düzen boyutlarından kaçının

Resim yükleyicilerin etkili bir şekilde örnekleme yapabilmesi (istemci tarafında veya sunucu tarafında) için isteği yürütmeden önce hedef boyutu bilmesi gerekir.

Uzak resimleri yükleyen composable'larda wrapContentSize kullanmaktan veya boyutları sınırlamadan bırakmaktan kaçının. Bu kitaplıklar hedef sınırları çıkaramıyorsa orijinal tam boyutlu görüntüyü yüklemeye geri döner. Bu durum, gerekenden çok daha büyük bir resmin yüklenmesine, bellek kullanımının ve gecikmenin artmasına neden olabilir.

Bunun yerine, resim composable'ınızda açık boyutlar ayarlayın (örneğin, Modifier.size kullanarak) veya bir en-boy oranı tanımlayın. Bu sayede düzen motoru, tam piksel hedefini önceden hesaplayabilir. Görüntü yükleyici daha sonra doğru boyutlandırılmış öğ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üşü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 bu ayarı yapılandırabilirsiniz. Coil'de bitmapConfig özelliğini kullanabilirsiniz.

Mümkün olduğunda vektör kullanın

Geometrik şekillerden oluşan görüntülerde vektör grafik, bit eşlemden çok daha küçüktür ve herhangi bir ekran yoğunluğu için 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 olmayan bit eşlemleri kitaplığın yönetilen havuzuna bıraktığınızdan emin olun. Kitaplık, gerektiğinde nesneleri yeniden kullanabilir ve gelecekteki ihtiyaçlar için bir bellek arabelleği bulundurur.

Grafikleri manuel olarak yönetiyorsanız Bitmap.recycle işlevini çağırarak ve atık toplama işlemine güvenmek yerine Bitmap referansını hemen atarak bit eşlemleri serbest bırakmanız gerekir.

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ı içinde 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ştirmeyi ve 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ü analiz aracını 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'si, @Stable ek açıklamasıyla açıkça kararlı olarak işaretlenmemiştir. Kararsız sınıflar, derleyici verilerin değişip değişmediğini kolayca çıkaramadığından 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) {

}