Yavaş oturumlar (yalnızca oyunlar)

Yavaş Oturumlar, Google Play Console'daki yeni bir Android vitals metriğidir. Yavaş oturum, karelerin% 25'inden fazlasının yavaş olduğu oturumlardır. Bir önceki kareden (20 FPS'ye eşdeğerdir) sonra 50 ms'den kısa bir süre boyunca sunulmayan kareler yavaş olarak kabul edilir. Android vitals, hedefi 34 ms (30 FPS'ye karşılık gelir) olan ikinci bir Yavaş Oturumlar metriği de bildirir. Slow Sessions'ı kullanarak oyununuzun sorunsuz ve akıcı çalışmasını etkileyen kare hızı performansını anlayabilirsiniz.

Play zamanla kullanıcıları telefonlarında 20 FPS'ye ulaşamayan oyunlardan uzaklaştırmaya başlayacaktır. Android vitals'ın kare hızını izlemeye yalnızca oyununuz bir dakika çalıştıktan sonra başladığını unutmayın.

Metrik hakkında daha ayrıntılı bilgi için Yardım Merkezimizi ziyaret edin.

Yavaş karelerin ve yavaş olmayan karelerin sayısını gösteren pasta grafik benzeri grafikler.
Şekil 1. Android vitals'da yavaş bir oturum.

FPS ölçümü ve yavaş kareleri tespit etme

Android dumpsys surfaceflinger timestats komutu, oluşturulmakta olan tüm katmanlar için ortalama FPS ve sunulana kadar zamanlama histogramı sağlar. Bir karenin bugünden bugüne süresi, geçerli kare ile çizilen önceki kare arasındaki aralıktır. Oyununuzun FPS'sini toplamak üzere komutu kullanmak için uygulamanız gereken adımlar:

  1. Bilgi yakalamaya başlamak için enable ve clear işaretleriyle komutu çalıştırın:

    adb shell dumpsys SurfaceFlinger --timestats -clear -enable
    
  2. Oyun yeterince uzun süre oynandığında bilgi dökümü yapmak için dump işaretini kullanarak komutu tekrar çalıştırın:

    adb shell dumpsys SurfaceFlinger --timestats -dump
    

    Döküm bilgileri, SurfaceFlinger tarafından oluşturulan tüm katmanlar için toplam kare sayısı ve comeToServe histogramı sağlar. Oyununuzun bölümünü layerName parametresine göre filtreleyerek bulmanız gerekir:

    layerName = SurfaceView[com.google.test/com.devrel.MainActivity]@0(BLAST)#132833
    

    Oturumun yavaş kare hızı, her bir katmanın bilgilerine göre hesaplanabilir.

    Örneğin, 20 FPS yavaş kare yüzdesi = (54 ms ile 1000 ms arasındaki değerlerin toplamı) / totalFrames x 100

    totalFrames = 274
    ...
    presentToPresent histogram is as below:
    0ms=0 1ms=0 2ms=0 3ms=0 4ms=0 5ms=0 6ms=0 7ms=0 8ms=0 9ms=0 10ms=0 11ms=0 12ms=0
    13ms=0 14ms=0 15ms=0 16ms=1 17ms=0 18ms=0 19ms=0 20ms=0 21ms=0 22ms=0 23ms=0
    24ms=0 25ms=0 26ms=0 27ms=0 28ms=0 29ms=0 30ms=0 31ms=0 32ms=0 33ms=269 34ms=0
    36ms=0 38ms=0 40ms=0 42ms=0 44ms=0 46ms=0 48ms=0 50ms=1 54ms=0 58ms=0 62ms=0
    66ms=0 70ms=1 74ms=0 78ms=0 82ms=0 86ms=0 90ms=0 94ms=0 98ms=0 102ms=0 106ms=0
    110ms=0 114ms=0 118ms=0 122ms=0 126ms=0 130ms=0 134ms=0 138ms=0 142ms=0 146ms=0
    150ms=0 200ms=0 250ms=0 300ms=0 350ms=0 400ms=0 450ms=0 500ms=0 550ms=0 600ms=0
    650ms=0 700ms=0 750ms=0 800ms=0 850ms=0 900ms=0 950ms=0 1000ms=0
    

    Her katmanın ortalama FPS değeri de dökümde gösterilir:

    ...
    averageFPS = 30.179
    ...
    
  3. Tüm bilgileri topladıktan sonra disable işaretini kullanarak zaman istatistiklerini devre dışı bırakmalısınız:

    adb shell dumpsys SurfaceFlinger --timestats -disable
    

Yavaş kare nedenleri ve çözümleri

Bir karenin bulunmasının veya ekranda, geliştiricinin hedefinden daha uzun süre oluşturulmasının birçok nedeni olabilir. Oyun CPU/GPU'ya bağlı olabilir. Cihaz aşırı ısınıyor ve kısıtlanmış bir termal durumu etkinleştiriyor olabilir. Ya da oyunun kare hızı ile cihazın ekran yenileme hızında bir uyumsuzluk vardır.

Bu sorunları gidermek ve oyununuzun performansını iyileştirmek için Android Frame Pacing (Swappy), Vulkan ve ADPF'yi kullanın.

Swappy nedir?

Swappy olarak da bilinen Android Frame Pacing kitaplığı AGDK kitaplıklarının bir parçasıdır. Swappy, OpenGL ve Vulkan oyunlarının Android'de sorunsuz oluşturma ve kare hızında düzeltme sağlamasına yardımcı oluyor.

Kare hızı, bir oyunun mantığı ve oluşturma döngüsünü, işletim sisteminin ekran alt sistemi ve temel ekran donanımıyla senkronizasyonudur. Android ekran alt sistemi, ekran donanımı bir güncelleme biterken yeni bir kareye geçtiğinde ortaya çıkabilecek görsel yapıları (yırtılma olarak bilinir) önleyecek şekilde tasarlanmıştır. Görüntülü reklam alt sistemi, bu yapıları önlemek için şunları yapar:

  • Geçmiş kareleri dahili olarak arabelleğe alır
  • Geç kare gönderimlerini algılar
  • Geç kareler algılandığında geçmiş karelerin görüntülenmesini tekrar eder

Swappy'yi Yerel Projelerde kullanma

Android Frame Pacing kitaplığını oyununuza entegre etmek için aşağıdaki kılavuzlara bakın:

Unity oyun motorunda Swappy'yi kullanma

Unity, Android Çerçeve İlerlemesi'ni motoruna entegre etti. Bu özelliği Unity 2019.2 veya sonraki sürümlerde etkinleştirmek için Android > Çözünürlük ve Sunu bölümünde Proje Ayarları > Oynatıcı > Ayarlar altındaki Optimize Edilmiş Çerçeve İlerlemesi onay kutusunu işaretleyin:

Proje ayarları iletişim kutusu.
Şekil 2. Unity Engine'de Çerçeve Hızı'nı etkinleştirin.

Alternatif olarak, Unity'nin kare hızındaki daha az varyans için kareleri eşit şekilde dağıtmasına olanak tanıyarak daha akıcı bir oyun deneyimi sağlamak için mantık kodunuzda Optimize Edilmiş Kare Hızı seçeneğini programatik olarak etkinleştirin.

Unreal oyun motorunda Swappy'yi kullanma

Unreal 4.25 ve sonraki sürümler, Android Oyun Geliştirme Kiti'nin bir parçası olan Android Çerçeve İlerleme Hızı Kitaplığı'nı entegre eder. Mobil Çerçeve İlerlemesi makalesinde, Android Çerçeve İlerlemesi Kitaplığı'nın nasıl etkinleştirileceği ve kare ilerleme hızını C++ kodundan nasıl kontrol edileceği açıklanmaktadır.

Vulkan nedir?

Vulkan, cihaz grafik donanımı ile oyununuz arasındaki soyutluğu en aza indirmek için tasarlanmış, platformlar arası modern bir 3D grafik API'sidir. Vulkan, Android'deki birincil düşük seviye grafik API'sidir ve OpenGL ES'nin yerini almıştır. OpenGL ES hâlâ Android'de desteklenmektedir ancak artık etkin bir özellik geliştirme aşamasında değildir.

Vulkan, OpenGL ES'ye göre aşağıdaki avantajları sunar:

  • Grafik sürücüsünde daha düşük ek CPU yüküyle daha verimli bir mimari
  • CPU performansını artırmaya yönelik yeni optimizasyon stratejileri
  • Bağlamasız API'ler ve ışın izleme gibi OpenGL ES'de kullanılamayan yeni grafik özellikleri

Vulkan, yerel Android projelerinde nasıl kullanılır?

Android'de Vulkan'ı kullanmaya başlama codelab'i, Vulkan oluşturma ardışık düzeninizi kurma ve ardından ekranda dokulu, dönen bir üçgen oluşturma konusunda size rehberlik edecektir. Oyun grafiklerinizi nasıl oluşturacağınızı öğrenmek için codelab'i kullanın.

Unity oyun motorunda Vulkan'ı kullanma

Unity'de otomatik cihaz seçimini etkinleştirmek için Auto Graphics API'yi yapılandırma adımlarını uygulayın.

Proje ayarları iletişim kutusu.
Şekil 3. Unity Auto Graphics API'sini etkinleştirin.

Alternatif olarak, Auto Graphics API'yi devre dışı bırakarak Vulkan'ı manuel olarak etkinleştirebilir ve Vulkan'ı Grafik API'leri listesindeki en yüksek önceliğe yerleştirebilirsiniz. Unity 2021.1 veya önceki bir sürümü kullanıyorsanız Vulkan'ı kullanmanın tek yolu budur.

Proje ayarları iletişim kutusu.
Şekil 4. Unity'de ana Graphics API'si olarak Vulkan'ı manuel olarak seçin.

Belirli cihazlarda kullanmak üzere oyununuz için başlatma sırasında grafik API'si önerilerini sağlamak için VkQuality Unity motor eklentisini kullanın.

Unreal oyun motorunda Vulkan nasıl kullanılır?

Vulkan grafik API'sini etkinleştirmek için Proje Ayarları > Platformlar > Android > Derleme bölümüne gidin ve Vulkan'ı Destekle seçeneğini belirleyin. Hem Vulkan'ı Destekle hem de Support OpenGL ES3.2'yi seçtiğinizde Unreal varsayılan olarak Vulkan'ı kullanır. Cihaz Vulkan'ı desteklemiyorsa Unreal, OpenGL ES 3.2'ye geri döner.

Proje ayarları iletişim kutusu.
Şekil 5. Unreal Engine'de Vulkan'ı etkinleştirin.

Belirli cihazlarda kötü çalıştığı bilinen belirli Vulkan özelliklerini kullanıyorsanız BaseDeviceProfile.ini dosyanızı bu cihazları hariç tutacak şekilde özelleştirebilirsiniz. BaseDeviceProfile.ini ürününün nasıl özelleştirileceğini öğrenmek için Android için Cihaz Profillerini ve Ölçeklenebilirliği Özelleştirme başlıklı makaleye göz atın. Yeni cihaz sürücüleri daha önce bilinen hatalı cihazları düzeltebildiğinden, tüm optimizasyonları almak için BaseDeviceProfile.ini dosyanızı güncel tutun.

ADPF nedir?

Android Dinamik Performans Çerçevesi (ADPF), oyunları Android'deki dinamik termal, CPU ve GPU yönetim özelliklerine dayanarak optimize eder. Odak noktası oyunlar olsa da bu özellikleri performans odaklı diğer uygulamalar için de kullanabilirsiniz.

ADPF, oyunların ve performans yoğun uygulamaların Android cihazların güç ve termal sistemleriyle daha doğrudan etkileşim kurmasına olanak tanıyan bir API grubudur. Bu API'leri kullanarak Android sistemlerindeki dinamik davranışı izleyebilir ve oyun performansını cihazları aşırı ısınmayan sürdürülebilir bir düzeyde optimize edebilirsiniz.

Temel ADPF özellikleri şunlardır:

  • Termal API: Uygulamanın, sürdürülebilir hale gelmeden iş yükünü proaktif olarak ayarlaması için cihazların termal durumunu izleme.
  • CPU Performans İpucu API'si: Android'in iş yükü için doğru performans ayarlarını (örneğin, CPU çalışma noktası veya çekirdek) seçmesini sağlayan performans ipuçları sağlayın.
  • Oyun Modu API'si ve Oyun Durumu API'si: Kullanıcının ayarlarına ve oyuna özgü yapılandırmalara dayalı olarak performansa veya pil ömrü özelliklerine öncelik vererek oyun optimizasyonunu etkinleştirin.
  • Sabit Performans Modu: Dinamik CPU saatlemesi tarafından değiştirilmeyen ölçümleri almak için karşılaştırma sırasında bir cihazda sabit performans modunu etkinleştirin.
  • Güç Verimliliği Modu: Oturumda, Performans İpucu Oturumu'ndaki ileti dizilerinin, performans yerine güç verimliliğini tercih edecek şekilde güvenli bir şekilde planlanabileceğini bildirir. Android 15'te (API leve 35) kullanılabilir.

Yerel Android projelerinde ADPF kullanma

Integrating Adaptability Features Into Your Native Oyun (Uyarlanabilirlik Özelliklerini Yerel Oyununuza Entegre Etme) codelab'i, ADPF özelliklerini oyununuza entegre etmeniz için size yol gösterir ve bu adımları kendi hızınızda izleyebilirsiniz. Codelab'in sonunda aşağıdaki özellikleri entegre etmiş olacaksınız:

  • Termal API: Cihazın ısı durumunu dinleyin ve cihaz termal kısıtlama durumuna düşmeden önce tepki verin.
  • Oyun Modu API'si: Oyuncuların optimizasyon tercihlerini anlayın (performansı artırma veya pili koruma) ve buna göre ayarlamalar yapın.
  • Oyun Durumu API'si: Sisteme oyununuzun durumunu (yükleme, oynama, kullanıcı arayüzü vb.) bildirin. Böylece sistem, kaynakları uygun şekilde ayarlayabilir (G/Ç veya CPU, GPU vb. yükseltme).
  • Performans İpucu API'si: Sistemin kaynakları uygun şekilde dağıtabilmesi için iş parçacığı modelinizi ve iş yükünüzü sisteme bildirin.

Unity oyun motorunda ADPF kullanma

Unity'nin Uyarlanabilir Performans aracı, özellikle de çeşitlilik barındıran Android ekosistemi için oyunlarını mobil cihazlarda optimize etmek isteyen oyun geliştiricilere yönelik bir araçtır. Uyarlanabilir Performans, oyununuzun cihaz performansına ve termal özelliklere gerçek zamanlı olarak uyum sağlayarak sorunsuz ve verimli bir oyun deneyimi yaşamasını sağlar.

Uyarlanabilir Performans Android sağlayıcısı, Unity'de ADPF'yi uygulama adımlarında size yol gösterir.

Proje ayarları iletişim kutusu.
Şekil 6. ADPF'yi Unity Engine'e entegre edin.

Unreal oyun motorunda ADPF kullanma

Proje ayarları iletişim kutusu.
Şekil 7. ADPF'yi Unreal Engine'e entegre edin.
  1. Eklentiyi indirin.
  2. Eklentiyi proje eklentisi klasörüne kopyalayın
  3. Unreal düzenleyicisinde ADPF Unreal Engine eklentisini etkinleştirin
  4. Unreal düzenleyiciyi yeniden başlat
  5. Oyunu yapıp pişirme

Unreal Engine için Android Dynamic Performance Framework(ADPF) eklentisi, istikrarlı performans sağlar ve termal kısıtlamayı önler. GitHub'dan eklentiyi indirin. Bu eklenti, Unreal konsol değerlerini ayarlayarak özellikleri değiştirir.