Bit eşlem resimleri optimize etme

Dikkatli olmazsanız resimlerle çalışmak hızlı bir şekilde performans sorunlarına yol açabilir. 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 ö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 alt örnekleme 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 kodunu çö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ı, örnekleme azaltma 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 yerinizi 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ırlanmamış düzen boyutlarından kaçının

Resim yükleyicilerin etkili bir şekilde örnek küçültme (istemci tarafı veya sunucu tarafı) yapabilmesi 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, 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 bir bellek arabelleği kullanılabilir durumda 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 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ı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, parametre olarak Painter geçirmek yerine composable'ınıza parametre olarak bir URL veya drawable kaynak kimliği geçirmenizi öneririz.

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

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

}