Kare hızı

Swappy olarak da bilinen Android Frame Pacing kitaplığı, Android Oyun SDK'sının bir parçasıdır. OpenGL ve Vulkan oyunlarının Android'de sorunsuz oluşturma ve doğru kare hızına ulaşmasına yardımcı olur.

Kare hızı, bir oyunun mantığının ve oluşturma döngüsünün işletim sisteminin ekran alt sistemi ve temel ekran donanımıyla senkronize edilmesidir. Android ekran alt sistemi, yırtılma gibi belirli görsel kusurları önlemek için tasarlanmıştır. Görüntü alt sistemi, aşağıdakileri yaparak yırtılmayı önler:

  • Geçmiş kareleri dahili olarak arabelleğe alma
  • Geç gönderilen kareleri algılama
  • Geç bir kare algılandığında mevcut kareyi göstermeye devam etme

Tutarlı olmayan kare görüntüleme süreleri, oyunun oluşturma döngüsünün yerel ekran donanımının desteklediğinden farklı bir hızda çalışmasından kaynaklanır. Bir oyunun oluşturma döngüsü, temel ekran donanımına göre çok yavaş çalıştığında tutarsız görüntüleme sürelerine neden olan sorunlar ortaya çıkar. Örneğin, 30 FPS'de çalışan bir oyun, doğal olarak 60 FPS'yi destekleyen bir cihazda oluşturma işlemini denediğinde oyunun oluşturma döngüsü, tekrarlanan bir karenin ekranda 16 ms daha fazla kalmasına neden olur. Bu tür bir bağlantı kesilmesi, kare sürelerinde 33 ms, 16 ms, 49 ms gibi önemli tutarsızlıklara neden olur. Aşırı karmaşık sahneler, kare atlamalarına neden oldukları için bu sorunu daha da artırır.

Kare paketleme kitaplığı aşağıdaki görevleri gerçekleştirir:

  • Kısa oyun kareleri nedeniyle takılmaları telafi eder.
  • Takılma ve gecikmeye neden olan uzun kareler için senkronizasyon çitleri kullanır.
    • Uygulamaya bekleme süreleri ekler. Bu bekleme süreleri, geri basıncın oluşmasına izin vermek yerine ekran ardışık düzeninin yetişmesine olanak tanır.
    • Senkronizasyon çitleri (EGL_KHR_fence_sync ve VkFence) kullanılır.
  • Cihazınız birden fazla yenileme hızını destekliyorsa esneklik ve sorunsuz bir sunum sağlamak için bir yenileme hızı seçer.
  • Çerçeve istatistiklerini kullanarak hata ayıklama ve profil oluşturma istatistikleri sağlar.

Kitaplığı, ihtiyacınıza göre farklı modlarda çalışacak şekilde nasıl yapılandıracağınızı öğrenmek için Desteklenen işletim modları başlıklı makaleyi inceleyin.

OpenGL oluşturucu veya Vulkan oluşturucu kullanarak uygulamak için

Daha fazla bilgi için Doğru kare hızını elde etme başlıklı makaleyi inceleyin.

Saniyedeki kare sayısı azaltma müdahalesi

Saniyedeki kare sayısı (FPS) azaltma müdahalesi, oyunların yalnızca platform tarafında yapılan değişiklikleri kullanarak ve geliştiricilerin herhangi bir işlem yapmasına gerek kalmadan uygun bir FPS hızında çalışmasını sağlar.

FPS azaltma müdahalesinin uygulanmasında aşağıdaki bileşenler kullanılır:

GameManagerService

GameManagerService bileşeni, oyun modu ve oyun müdahalesiyle ilgili tüm kullanıcı ve oyun bilgilerini saklar. FPS bilgileri, her kullanıcı profili için <PACKAGE_NAME, Interventions> eşlemesinde çözünürlük azaltma faktörü gibi diğer müdahale bilgileriyle birlikte GameManagerService'te depolanır. FPS bilgilerine, oyun modu değiştirildiğinde veya müdahale güncellendiğinde erişilir. UID, her PACKAGE_NAME ve kullanıcıya özeldir ve SurfaceFlinger'a gönderilecek bir <UID, Frame Rate> çiftine dönüştürülebilir.

SurfaceFlinger

SurfaceFlinger bileşeni, kare hızı ekran yenileme hızının böleni olduğu sürece bir uygulamanın FPS'sini sınırlamayı zaten desteklemektedir. SurfaceFlinger, vsync durumunda vsync zaman damgasının uygulamanın kare hızıyla senkronize olup olmadığını doğrulayarak vsync'nin, sınırlandırılmış uygulama için geçerli olup olmadığını kontrol eder. Kare hızı, vsync ile senkronize değilse SurfaceFlinger, kare hızı ve vsync senkronize olana kadar kareyi tutar.

Aşağıdaki şekilde, GameManagerService ile SurfaceFlinger arasındaki etkileşim gösterilmektedir:

GameManagerService ile SurfaceFlinger arasındaki etkileşim

Şekil 1. GameServiceManager ile SurfaceFlinger arasındaki etkileşim

SurfaceFinger, yeni bir kare hızı azaltma önceliği ayarlamak için <UID, Frame Rate> çift eşlemesi sağlar. UID, kullanıcılar ve oyunlar arasında benzersizdir. Böylece, tek bir cihazdaki her kullanıcı aynı oyunda farklı kare hızı ayarlarına sahip olabilir. GameServiceManager, bir oyunun kare hızını azaltmak için SurfaceFlinger'ı çağırarak UID'nin kare hızını geçersiz kılar. SurfaceFlinger, bu mekanizmayla oyun modu değiştiğinde veya müdahale güncellendiğinde eşlemeyi günceller. SurfaceFlinger, arabellekleri uygun şekilde kilitleyerek FPS değişikliğini işler.

FPS sınırlama hakkında daha fazla bilgi edinmek için FPS sınırlama girişi bölümüne bakın.