Kare ilerleme hızı

Swappy olarak da bilinen Android Frame Pacing kitaplığı, Android Game SDK'nın bir parçasıdır. Bu özellik, OpenGL ve Vulkan oyunlarının Android'de sorunsuz oluşturma ve doğru kare aralığı elde etmesine yardımcı olur.

Kare hızını ayarlama, bir oyunun mantık 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 bozulmaları önlemek için tasarlanmıştır. Ekran alt sistemi, aşağıdakileri yaparak yırtılmayı önler:

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

Tutarsız 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ı için çok yavaş çalıştığında sorunlar ortaya çıkar ve bu durum, tutarsız görüntüleme sürelerine yol açar. Örneğin, 30 FPS'de çalışan bir oyun, 60 FPS'yi doğal olarak destekleyen bir cihazda oluşturulmaya çalışıldığında oyunun oluşturma döngüsü, tekrarlanan bir karenin ekranda 16 ms daha kalmasına neden olur. Bu tür bir bağlantı kesilmesi, kare sürelerinde (ör. 33 ms, 16 ms ve 49 ms) önemli tutarsızlıklara yol açar. Aşırı karmaşık sahneler, karelerin kaçırılmasına neden oldukları için bu sorunu daha da kötüleştirir.

Frame Pacing kitaplığı şu görevleri yerine getirir:

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

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

OpenGL oluşturucu veya Vulkan oluşturucu kullanarak uygulamak için şunlara bakın:

Daha fazla bilgi için Frame Pacing kitaplığı başlıklı makaleyi inceleyin.

Saniyedeki kare sayısı sınırlama müdahalesi

Saniyedeki kare sayısı (FPS) sınırlama müdahalesi, oyunların yalnızca platform tarafındaki değişiklikleri kullanarak ve geliştiricilerin herhangi bir işlem yapmasını gerektirmeden uygun bir FPS'de ilerlemesini sağlar.

FPS sınırlama 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, GameManagerService'te çözünürlük küçültme faktörü gibi diğer müdahale bilgileriyle birlikte her kullanıcı profili için <PACKAGE_NAME, Interventions> eşlemesinde saklanır. FPS bilgisine, oyun modu değiştirildiğinde veya müdahale güncellendiğinde erişilir. Bir UID her PACKAGE_NAME ve kullanıcı için benzersizdir ve SurfaceFlinger'a gönderilecek bir <UID, Frame Rate> çiftine daha da çevrilebilir.

SurfaceFlinger

SurfaceFlinger bileşeni, kare hızı ekran yenileme hızının bir böleni olduğu sürece uygulamanın FPS'sini sınırlamayı zaten desteklemektedir. VSync durumunda SurfaceFlinger, VSync zaman damgasının uygulamanın kare hızıyla uyumlu olup olmadığını doğrulayarak kısıtlanmış uygulama için VSync'nin geçerliliğini kontrol eder. Kare hızı VSync ile aynı aşamada değilse SurfaceFlinger, kare hızının ve VSync'nin aynı aşamada olmasını bekler.

Aşağıdaki şekilde, GameManagerService ile SurfaceFlinger arasındaki etkileşim açıklanmaktadır:

GameManagerService ile SurfaceFlinger arasındaki etkileşim

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

SurfaceFinger, yeni bir kare hızı sınırlama önceliği ayarlamak için <UID, Frame Rate> çift eşlemesini korur. 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ı sınırlamak için SurfaceFlinger'ı çağırarak bir UID'nin kare hızını geçersiz kılar. Bu mekanizma sayesinde SurfaceFlinger, oyun modu her değiştirildiğinde veya müdahale güncellendiğinde eşlemeyi günceller. SurfaceFlinger, arabellekleri buna göre kilitleyerek FPS değişikliğini işler.

FPS sınırlama hakkında daha fazla bilgi edinmek için FPS sınırlama başlıklı makaleyi inceleyin.