Yavaş Oturumlar

Android vitals'da yavaş oturum, karelerin% 25'inden fazlasının yavaş olduğu oturumdur. Önceki kareden sonra 50 ms'den daha kısa sürede (20 FPS'ye karşılık gelir) sunulmayan kareler yavaş sayılır. Android vitals, hedefi 34 ms (30 FPS'ye eşdeğer) olan ikinci bir yavaş oturum metriği de raporlar. Yavaş oturumlar özelliğini kullanarak, oyununuzun sorunsuz ve akıcı çalışması üzerinde büyük etkide bulunan kare hızı performansı hakkında bilgi edinebilirsiniz.

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

Metrik hakkında daha fazla 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ş oturum.

FPS'yi ölçme ve yavaş kareleri tespit etme

Android dumpsys SurfaceFlinger --timestats komutu, oluşturulan tüm katmanlar için ortalama FPS ve sunumdan sunuma zamanlama histogramları sağlar. Bir karenin gösterimden gösterime süresi, geçerli kare ile önceki karenin çizilmesi arasındaki aralıktır. Oyununuzun FPS'sini toplamak için komutu kullanmak üzere aşağıdaki adımları uygulayın:

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

    adb shell dumpsys SurfaceFlinger --timestats -clear -enable
    
  2. Oyun yeterince uzun süre oynandıktan sonra bilgileri dökümlemek için komutu dump işaretiyle 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ını ve presentToPresent histogramını sağlar. layerName ölçütüne göre filtreleyerek oyununuzun bölümünü bulmanız gerekir:

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

    Oturumun yavaş kare hızını her katmanın bilgilerine göre hesaplayabilirsiniz.

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

    totalFrames = 274
    ...
    presentToPresent histogram:
    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'si de dökümde gösterilir:

    ...
    averageFPS = 30.179
    ...
    
  3. Tüm bilgileri topladıktan sonra disable işaretini kullanarak timestats'i devre dışı bırakın:

    adb shell dumpsys SurfaceFlinger --timestats -disable
    

Yavaş kare nedenleri ve çözümleri

Bir karenin ekranda hedefinizden daha uzun süre gösterilmesinin veya oluşturulmasının birçok nedeni olabilir. Oyununuz CPU veya GPU'ya bağlı olabilir, cihaz aşırı ısınabilir ve kısıtlanmış bir termal durumu etkinleştirebilir ya da oyunun kare hızı ile cihazın ekran yenileme hızı arasında uyumsuzluk olabilir.

Bu sorunları gidermek ve oyununuzun performansını artırmak 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 görüntü oluşturma ve doğru kare hızı elde etmesine yardımcı olur.

Kare hızı, bir oyunun mantık ve oluşturma döngüsünün bir işletim sisteminin ekran alt sistemi ve temel ekran donanımıyla senkronizasyonudur. Android ekran alt sistemi, ekran donanımı bir güncellemenin ortasında yeni bir kareye geçtiğinde oluşabilecek görsel kusurları (yırtılma olarak bilinir) önlemek için tasarlanmıştır. Ekran alt sistemi, bu yapaylıkları önlemek için aşağıdakileri yapar:

  • Geçmiş kareleri dahili olarak arabelleğe alır.
  • Geç kare gönderimlerini algılar.
  • Geciken kareler algılandığında geçmiş karelerin gösterimini tekrarlar.

Mir 2'nin, yavaş oturum oranını% 40'tan %10'a düşürmek için Swappy'yi nasıl kullandığını öğrenin.

Yerel projelerde Swappy'yi 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 Frame Pacing'i kendi motoruna entegre etti. Bu özelliği Unity 2019.2 veya sonraki sürümlerde etkinleştirmek için Project Settings > Player > Settings (Proje Ayarları > Oynatıcı > Ayarlar) bölümünde Android > Resolution and Presentation (Android > Çözünürlük ve Sunum) altındaki Optimized Frame Pacing (Optimize Edilmiş Kare Hızı) onay kutusunu işaretleyin:

Unity Proje Ayarları penceresinde Optimize Edilmiş Kare Hızı onay kutusu gösteriliyor.
Şekil 2. Unity Engine'de Kare Hızını etkinleştirin.

Alternatif olarak, mantık kodunuzda Optimize edilmiş kare hızı seçeneğini programatik olarak etkinleştirerek Unity'nin kareleri eşit şekilde dağıtmasını sağlayabilirsiniz. Böylece kare hızındaki varyans azalır ve daha akıcı bir oyun deneyimi elde edilir.

Unreal oyun motorunda Swappy'yi kullanma

Unreal 4.25 ve sonraki sürümler, Android Game Development Kit'in bir parçası olan Android Frame Pacing Library'yi entegre eder. Mobil Kare Hızı makalesinde, Android Kare Hızı Kitaplığı'nın nasıl etkinleştirileceği ve kare hızının C++ kodundan nasıl kontrol edileceği açıklanmaktadır.

Vulkan nedir?

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

Vulkan, OpenGL ES'ye kıyasla aşağıdaki avantajları sunar:

  • Grafik sürücüsünde daha düşük CPU ek yükü olan daha verimli bir mimari
  • CPU performansını artırmak için yeni optimizasyon stratejileri
  • OpenGL ES'de bulunmayan yeni grafik özellikleri (ör. bağlamasız API'ler ve ışın izleme)

Yerel Android projelerinde Vulkan'ı kullanma

Android'de Vulkan'ı kullanmaya başlama codelab'i, Vulkan oluşturma ardışık düzeninizi oluşturma ve ardından ekranda dokulu, dönen bir üçgen oluşturma konusunda size yol gösterir. 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.

Auto Graphics API'nin etkin olduğu Unity Proje Ayarları penceresi.
Şekil 3. Unity Auto Graphics API'yi etkinleştirin.

Alternatif olarak, Auto Graphics API'yi devre dışı bırakarak Vulkan'ı manuel olarak etkinleştirebilir ve Graphics APIs listesinde Vulkan'ı 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.

Grafik API'leri listesinde Vulkan'ın öncelikli olduğu Unity Proje Ayarları penceresi.
Şekil 4. Unity'de ana Graphics API olarak Vulkan'ı manuel olarak seçin.

Oyununuzun belirli cihazlarda kullanması için grafik API'sinin başlatma zamanı önerilerini sağlamak üzere VkQuality Unity motoru eklentisini kullanın.

Unreal oyun motorunda Vulkan'ı kullanma

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

Unreal Engine Proje Ayarları penceresinde Vulkan'ı Destekle seçeneği gösteriliyor.
Şekil 5. Unreal Engine'de Vulkan'ı etkinleştirin.

Belirli cihazlarda kötü performans gösterdiği bilinen belirli Vulkan özelliklerini kullanıyorsanız BaseDeviceProfile.ini dosyanızı bu cihazları hariç tutacak şekilde özelleştirebilirsiniz. BaseDeviceProfile.ini uygulamasını nasıl özelleştireceğinizi öğrenmek için Android için Cihaz Profillerini ve Ölçeklenebilirliği Özelleştirme başlıklı makaleyi inceleyin. Yeni cihaz sürücüleri, daha önce hatalı olduğu bilinen cihazları düzeltebileceğinden tüm optimizasyonlardan yararlanmak için BaseDeviceProfile.ini dosyanızı güncel tutun.

ADPF nedir?

Android Dynamic Performance Framework (ADPF), oyunları Android'deki dinamik termal, CPU ve GPU yönetim özelliklerine göre optimize eder. Oyunlara odaklanılsa da bu özellikleri performans açısından yoğun diğer uygulamalar için de kullanabilirsiniz.

ADPF, oyunların ve performans açısından 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'lerle Android sistemlerindeki dinamik davranışı izleyebilir ve oyun performansını, cihazların aşırı ısınmasını önleyecek sürdürülebilir bir düzeyde optimize edebilirsiniz.

ADPF'nin temel özellikleri şunlardır:

  • Thermal API: Uygulamanın, iş yükünü sürdürülemez hale gelmeden önce proaktif olarak ayarlayabilmesi için cihazın termal durumunu izler.
  • CPU Performance Hint API: Android'in iş yükü için doğru performans ayarlarını (ör. CPU çalışma noktası veya çekirdek) seçmesine olanak tanıyan performans ipuçları sağlar.
  • Game Mode API ve Game State API: Kullanıcının ayarlarına ve oyuna özel yapılandırmalara göre performans veya pil ömrü özelliklerine öncelik vererek oyun optimizasyonunu etkinleştirin.
  • Sabit performans modu: Dinamik CPU saat hızından etkilenmeyen ölçümler elde etmek için karşılaştırma sırasında cihazda sabit performans modunu etkinleştirin.
  • Güç Verimliliği Modu: Performans İpucu Oturumu'ndaki iş parçacıklarının, performans yerine güç verimliliğini tercih edecek şekilde güvenle planlanabileceğini oturuma bildirir. Android 15'te (API düzeyi 35) kullanılabilir.

Yerel Android projelerinde ADPF'yi kullanma

Uyarlanabilirlik Özelliklerini Yerel Oyununuza Entegre Etme codelab'i, ADPF özelliklerini kendi hızınızda uygulayabileceğiniz adımlarla oyununuza entegre etmenize yardımcı olur. Codelab'in sonunda aşağıdaki özellikleri entegre etmiş olacaksınız:

  • Thermal API: Cihazın sıcaklık durumunu dinleyin ve cihaz, sıcaklık kısıtlama durumuna girmeden önce tepki verin.
  • Game Mode API: Oyuncuların optimizasyon tercihlerini (performansı artırma veya pil tasarrufu) anlayıp buna göre ayarlama yapın.
  • Game State API: Sisteme oyununuzun durumunu (yükleme, oynama, kullanıcı arayüzü vb.) bildirin. Sistem, kaynakları buna göre ayarlayabilir (G/Ç, CPU, GPU vb. artırabilir).
  • Performance Hint API: Sistemin kaynakları buna göre tahsis edebilmesi için sistemin iş parçacığı modelinizi ve iş yükünüzü bilmesini sağlayın.

Unity oyun motorunda ADPF'yi kullanma

Unity'nin Adaptive Performance özelliği, oyunlarını mobil cihazlarda, özellikle de çeşitli Android ekosisteminde optimize etmek isteyen oyun geliştiriciler için bir araçtır. Adaptive Performance, oyununuzun cihazın performansına ve sıcaklık özelliklerine anlık olarak uyum sağlamasına olanak tanıyarak sorunsuz ve verimli bir oyun deneyimi sunar.

Adaptive Performance Android sağlayıcısı, Unity'de ADPF'yi uygulama adımlarında size yol gösterir. Ayrıca ADPF Unity Adaptive Performance ve Android sağlayıcısı başlıklı makaleyi inceleyin.

Unity Proje Ayarları penceresinde Adaptive Performance Android sağlayıcı ayarları gösteriliyor.
Şekil 6. ADPF'yi Unity Engine'e entegre edin.

Unreal oyun motorunda ADPF'yi kullanma

Android Dynamic Performance Framework eklentisini gösteren Unreal Engine Plugins penceresi.
Şekil 7. Unreal Engine'de ADPF'yi entegre etme
  1. Eklentiyi indirin.
  2. Eklentiyi proje eklenti klasörüne kopyalayın.
  3. Unreal Editor'da ADPF Unreal Engine eklentisini etkinleştirin.
  4. Unreal düzenleyiciyi yeniden başlatın.
  5. Oyunu derleyin ve hazırlayın.

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. Daha fazla bilgi için ADPF Unreal Engine eklentisi başlıklı makaleyi inceleyin.