Profil GPU Oluşturma ile Analiz Et

Profil GPU oluşturma aracı, oluşturma ardışık düzeninin her aşamasının önceki kareyi oluşturmak için harcadığı göreceli süreyi gösterir. Bu bilgi, ardışık düzendeki performans sorunlarını belirlemenize yardımcı olabilir. Böylece, uygulamanızın oluşturma performansını iyileştirmek için neleri optimize etmeniz gerektiğini bilirsiniz.

Bu sayfada, her ardışık düzen aşamasında neler olduğu kısaca açıklanmakta ve burada tıkanıklığa neden olabilecek sorunlar ele alınmaktadır. Bu sayfayı okumadan önce GPU oluşturma profilini inceleyin. Ayrıca, tüm aşamaların nasıl bir araya geldiğini anlamak için kaydetme ardışık düzeninin işleyiş şeklini incelemek faydalı olabilir.

Görsel temsil

Profil GPU oluşturma aracı, aşamaları ve bunların göreceli sürelerini grafik şeklinde (renk kodlu bir histogram) gösterir. Şekil 1'de bu tür bir ekran örneği gösterilmektedir.

Şekil 1. Profil GPU Oluşturma Grafiği

Profil GPU Oluşturma grafiğinde gösterilen her dikey çubuğun her segmenti, ardışık düzenin bir aşamasını temsil eder ve çubuk grafikte belirli bir renkle vurgulanır. Şekil 2'de, görüntülenen her bir rengin anlamı için bir anahtar gösterilmektedir.

Şekil 2. Profil GPU Oluşturma Grafiği Açıklaması

Her rengin ne anlama geldiğini anladıktan sonra, uygulamanızın oluşturma performansını optimize etmek için uygulamanızın belirli yönlerini hedefleyebilirsiniz.

Aşamalar ve anlamları

Bu bölümde, Şekil 2'de bir renge karşılık gelen her aşamada neler olduğu ve dikkat edilmesi gereken tıkanma nedenleri açıklanmaktadır.

Giriş işleme

Ardışık düzenin giriş işleme aşaması, uygulamanın giriş etkinliklerini işlemek için ne kadar süre harcadığını ölçer. Bu metrik, uygulamanın giriş etkinliği geri çağırmalarının sonucunda çağrılan kodu yürütmek için ne kadar süre harcadığını gösterir.

Bu segment büyük olduğunda

Bu alandaki yüksek değerler genellikle giriş işleyicisi etkinlik geri çağırmalarında çok fazla çalışmanın veya çok karmaşık çalışmanın bir sonucudur. Bu geri çağırmalar her zaman ana iş parçacığında gerçekleştiğinden, sorunun çözümleri işi doğrudan optimize etmeye veya işi farklı bir iş parçacığına aktarmaya odaklanır.

Kaydırmanın RecyclerView bu aşamada görünebileceğini de belirtmek isteriz. RecyclerView dokunma etkinliğini tüketince hemen kaydırılır. Sonuç olarak, yeni öğe görüntüleme sayısı artabilir veya doldurulabilir. Bu nedenle, bu işlemi mümkün olduğunca hızlı bir şekilde yapmanız önemlidir. Traceview veya Systrace gibi profil oluşturma araçları, daha ayrıntılı bir inceleme yapmanıza yardımcı olabilir.

Animasyon

Animasyonlar aşaması, o karede çalışan tüm animatörlerin değerlendirilmesinin ne kadar sürdüğünü gösterir. En yaygın animasyonlar ObjectAnimator, ViewPropertyAnimator ve Geçişler'dir.

Bu segment büyük olduğunda

Bu alandaki yüksek değerler genellikle animasyonun bazı özellik değişiklikleri nedeniyle yürütülmekte olan işin bir sonucudur. Örneğin, ListView veya RecyclerView öğenizi kaydıran bir hızlı kaydırma animasyonu, görüntüleme sayısında büyük miktarda artışa ve nüfusa neden olur.

Ölçüm/düzen

Android'in görünüm öğelerinizi ekranda çizebilmesi için görünüm hiyerarşinizdeki düzenler ve görünümler arasında iki belirli işlem gerçekleştirir.

Sistem ilk olarak görüntüleme öğelerini ölçer. Her görünüm ve düzenin, ekrandaki nesnenin boyutunu tanımlayan belirli verileri vardır. Bazı görünümlerin belirli bir boyutu olabilir, bazıları ise üst düzen kapsayıcısının boyutuna uyarlanan bir boyuta sahiptir.

İkinci olarak sistem, görüntüleme öğelerini düzenler. Sistem, çocukların görüntüleme sayılarını hesapladıktan sonra ekrandaki görünümlerin düzenini, boyutlarını ve konumunu belirleyebilir.

Sistem, yalnızca çizilecek görünümler için değil, aynı zamanda bu görünümlerin üst hiyerarşileri için kök görünüme kadar ölçüm ve düzen de gerçekleştirir.

Bu segment büyük olduğunda

Uygulamanız bu alanda kare başına çok fazla zaman harcıyorsa bunun nedeni genellikle, yerleştirilmesi gereken çok sayıda görüntü veya hiyerarşinizde yanlış yerde iki kez vergilendirme gibi sorunlardır. Her iki durumda da performansı ele almak için görünüm hiyerarşilerinizin performansını iyileştirmeniz gerekir.

onLayout(boolean, int, int, int, int) veya onMeasure(int, int) için eklediğiniz kod da performans sorunlarına neden olabilir. Traceview ve Systrace, kodunuzda olabilecek sorunları tespit etmek için çağrı yığınlarını incelemenize yardımcı olabilir.

Çiz

Çizim aşaması, bir görünümün oluşturma işlemlerini (ör. arka plan çizme veya metin çizme) bir dizi yerel çizim komutuna dönüştürür. Sistem bu komutları bir görüntüleme listesine kaydeder.

Çizim çubuğu, bu karede ekranda güncellenmesi gereken tüm görünümler için komutların görüntüleme listesine kaydedilmesinin ne kadar sürdüğünü kaydeder. Ölçülen süre, uygulamanızdaki kullanıcı arayüzü nesnelerine eklediğiniz tüm kodlar için geçerlidir. Bu tür kodlara örnek olarak onDraw(), dispatchDraw() ve Drawable sınıfının alt sınıflarına ait çeşitli draw ()methods kodları verilebilir.

Bu segment büyük olduğunda

Basitleştirilmiş ifadelerle bu metrik, geçersiz kılınan her bir görünüm için tüm onDraw() çağrılarının ne kadar sürede çalıştırıldığını gösterir. Bu ölçüm, mevcut çizim komutlarını alt öğelere ve çekilebilir öğelere göndermek için harcanan süreyi içerir. Bu nedenle, bu çubuktaki ani artış, bir grup görüntülemenin aniden geçersiz kılınmasından kaynaklanabilir. Geçersiz kılma, görünümlerin görüntüleme listelerinin yeniden oluşturulmasını gerektirir. Alternatif olarak uzun bir süre, onDraw() yöntemlerinde son derece karmaşık bir mantık içeren birkaç özel görünümün sonucu da olabilir.

Senkronize etme/yükleme

Senkronizasyon ve Yükleme metriği, mevcut kare sırasında bitmap nesnelerinin CPU belleğinden GPU belleğine aktarılması için geçen süreyi gösterir.

CPU ve GPU, farklı işlemcilerden işleme için farklı RAM alanlarına sahiptir. Android'de bit eşlem çizdiğinizde sistem, bit eşlemi GPU'ya aktarıp GPU belleğine aktarır. Ardından GPU, bit eşlemi önbelleğe alır. Böylece doku, GPU doku önbelleğinden çıkarılmadığı sürece sistemin verileri tekrar aktarmasına gerek kalmaz.

Not: Lollipop cihazlarda bu aşama mor renktedir.

Bu segment büyük olduğunda

Bir kare çizmek için tüm kaynakların GPU belleğinde bulunması gerekir. Bu, bu metrik için yüksek bir değerin çok sayıda küçük kaynak yüklemesi veya çok sayıda çok büyük kaynak anlamına gelebileceği anlamına gelir. Yaygın bir durum, bir uygulamanın ekranın boyutuna yakın tek bir bitmap görüntülemesidir. Başka bir durum da bir uygulamanın çok sayıda küçük resim göstermesidir.

Bu çıtayı küçültmek için, aşağıdaki gibi teknikleri kullanabilirsiniz:

  • Bit eşleme çözünürlüklerinizin, gösterilecekleri boyuttan çok daha büyük olmadığından emin olun. Örneğin, uygulamanız 1024x1024 boyutunda bir resmi 48x48 boyutunda göstermemelidir.
  • Bir sonraki senkronizasyon aşamasından önce bir bitmap'i asenkron olarak önceden yüklemek için prepareToDraw() işlevinden yararlanabilirsiniz.

Sorun komutları

Komut Gönderme segmenti, ekranda görüntü listelerini çizmek için gereken tüm komutların gönderilmesinin ne kadar sürdüğünü gösterir.

Sistemin ekran listelerini ekrana çizmesi için gerekli komutları GPU'ya gönderir. Bu işlemi genellikle OpenGL ES API aracılığıyla gerçekleştirir.

Bu işlem biraz zaman alır çünkü sistem, komutu GPU'ya göndermeden önce her komut için son dönüşümü ve kırpma işlemini gerçekleştirir. Ardından, nihai komutları hesaplayan GPU tarafında ek yükü ortaya çıkar. Bu komutlar nihai dönüşümleri ve ek kırpma işlemlerini içerir.

Bu segment büyük olduğunda

Bu aşamada harcanan süre, sistemin belirli bir karede oluşturacağı görüntü listesi karmaşıklığının ve miktarının doğrudan bir ölçümüdür. Örneğin, özellikle her çizim ilkelinin küçük bir maliyetinin olduğu durumlarda çok sayıda çizim işleminin olması bu süreyi uzatabilir. Örnek:

Kotlin

for (i in 0 until 1000) {
    canvas.drawPoint()
}

Java

for (int i = 0; i < 1000; i++) {
    canvas.drawPoint()
}

şuna göre çok daha pahalıdır:

Kotlin

canvas.drawPoints(thousandPointArray)

Java

canvas.drawPoints(thousandPointArray);

Komut verme ile görüntü listelerini gerçekten çizme arasında her zaman bire bir ilişki yoktur. GPU'ya çizim komutlarının gönderilmesi için gereken süreyi yakalayan Sorun Komutları'nın aksine Çizim metriği, verilen komutları görüntüleme listesine kaydetmek için geçen süreyi temsil eder.

Bu farkın nedeni, görüntüleme listelerinin mümkün olduğunda sistem tarafından önbelleğe alınmasıdır. Sonuç olarak, kaydırma, dönüştürme veya animasyon için sistemin bir görüntüleme listesini yeniden göndermesini gerektirdiği, ancak gerçekte yeniden oluşturmak zorunda olmadığı, yani çizim komutlarını sıfırdan aldığı durumlar ortaya çıkar. Bu nedenle, yüksek bir Çizim komutları çubuğu görmeden yüksek bir "Sorun komutları" çubuğu görebilirsiniz.

Süreç/değiştirme tamponları

Android, tüm ekran listesini GPU'ya göndermeyi bitirdikten sonra, sistem, grafik sürücüsüne geçerli kareyle işin bittiğini bildirmek için son bir komut gönderir. Bu noktada, sürücü nihayet güncellenmiş resmi ekrana sunabilir.

Bu segment büyük olduğunda

GPU'nun, CPU ile paralel olarak çalıştığını anlamak önemlidir. Android sistem sorunları GPU'ya komutları çizer ve ardından bir sonraki göreve geçer. GPU, bu çizim komutlarını bir kuyruktan okur ve işler.

CPU'nun, GPU'nun bunları tüketmesinden daha hızlı komut verdiği durumlarda, işlemciler arasındaki iletişim kuyruğu dolu olabilir. Bu durumda CPU kilitlenir ve bir sonraki komutu yerleştirmek için sırada yer açılana kadar bekler. Bu tam sıra durumu, genellikle Değiştirme Arabellekleri aşamasında ortaya çıkar. Çünkü bu noktada, karenin tamamındaki komut değeri gönderilmiş olur.

Bu sorunu azaltmanın anahtarı, "Komut Verme" aşamasında yaptığınıza benzer şekilde GPU'da gerçekleşen işin karmaşıklığını azaltmaktır.

Çeşitli

Oluşturma sisteminin, çalışmasını tamamlaması için gereken süreye ek olarak ana iş parçacığında gerçekleşen ve oluşturma ile hiçbir ilgisi olmayan ek bir çalışma grubu vardır. Bu çalışmanın tükettiği zaman, misc süre olarak raporlanır. Çeşitli süre, genellikle iki ardışık oluşturma karesi arasında kullanıcı arayüzü iş parçacığında gerçekleşebilecek işleri temsil eder.

Bu segment büyük olduğunda

Bu değer yüksekse uygulamanızda başka bir iş parçacığında yapılması gereken geri çağırmalar, intent'ler veya başka işler olabilir. Yöntem izleme veya Systrace gibi araçlar, ana iş parçacığında çalışan görevlerin görünürlüğünü sağlayabilir. Bu bilgiler, performans iyileştirmelerini hedeflemenize yardımcı olabilir.