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 görüntü oluşturma ve doğru kare ilerleme hızı elde etmesine yardımcı olur.

Çerçeve ilerleme hızı, bir oyunun mantığının ve işleme döngüsünün bir işletim sisteminin ekran alt sistemi ve temeldeki ekran donanımıyla senkronizasyonudur. Android ekran alt sistemi, yırtılma gibi belirli görsel bozulmaları önleyecek şekilde tasarlanmıştır. Ekran alt sistemi aşağıdakileri yaparak yırtılmayı önler:

  • Geçmiş kareleri dahili olarak ara belleğe alma
  • Geç çerçeve gönderimlerini algılama
  • Geç bir kare algılandığında geçerli karenin görüntülenmeye devam edilmesi

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ü, temeldeki ekran donanımı için çok yavaş çalıştığında sorunlar ortaya çıkar ve bu da tutarsız görüntüleme sürelerine yol açar. Örneğin, 30 fps hızında çalışan bir oyun, doğal olarak 60 fps'yi destekleyen bir cihazda görüntü oluşturmaya çalıştığında, oyunun oluşturma döngüsü, tekrarlanan bir karenin fazladan 16 ms daha ekranda kalmasına neden olur. Bu tür bir bağlantı kesilmesi, çerçeve sürelerinde 33 ms, 16 ms, 49 ms vb. gibi önemli tutarsızlıklar yaratır. Aşırı karmaşık sahneler, kaçırılan karelerin oluşmasına neden olduğundan bu sorunu daha da artırır.

Çerçeve Hızı kitaplığı şu görevleri gerçekleştirir:

  • Kısa oyun karelerinden kaynaklanan kekemeliği telafi eder.
  • Kekemeliğe ve gecikmeye yol açan uzun kareler için senkronizasyon çitleri kullanır.
    • Enjeksiyonlar uygulamaya bekler. Bunlar, karşı basıncın oluşmasına izin vermek yerine ekran hattının yetişmesine olanak tanır.
    • Senkronizasyon çitlerini kullanır ( EGL_KHR_fence_sync ve VkFence ).
  • 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şturmaya yönelik istatistikler sağlar.

Kitaplığı ihtiyacınıza göre farklı modlarda çalışacak şekilde nasıl yapılandıracağınızı öğrenmek için bkz . Desteklenen çalışma modları .

OpenGL oluşturucuyu veya Vulkan oluşturucuyu kullanarak uygulamak için bkz.

Daha fazlasını okumak için bkz. Uygun kare ilerleme hızına ulaşma .

Saniyedeki kare sayısı azaltma müdahalesi

Saniye başına kare sayısı (FPS) azaltma müdahalesi, oyunların yalnızca platform tarafındaki değişiklikleri kullanarak ve geliştiricilerin herhangi bir işlem yapmasına gerek kalmadan uygun bir FPS'de ilerlemesine olanak tanır.

FPS azaltma müdahalesinin uygulanması aşağıdaki bileşenleri kullanır:

Oyun Yöneticisi Hizmeti

GameManagerService bileşeni, oyun modu ve oyun müdahalesine ilişkin tüm kullanıcı başına ve oyun başına bilgileri korur. FPS bilgileri GameManagerService'de çözünürlük küçültme faktörü gibi diğer müdahale bilgileriyle birlikte her kullanıcı profili için bir <PACKAGE_NAME, Interventions> eşlemesinde saklanır. Oyun modu değiştirildiğinde veya müdahale güncellendiğinde FPS bilgisine erişilir. Bir UID her PACKAGE_NAME ve kullanıcı için benzersizdir ve ayrıca SurfaceFlinger'a gönderilmek üzere bir <UID, Frame Rate> çiftine çevrilebilir.

SurfaceFlinger

SurfaceFlinger bileşeni, kare hızı ekran yenileme hızının bir böleni olduğu sürece bir uygulamanın FPS'sinin azaltılmasını zaten desteklemektedir. Bir vsync durumunda SurfaceFlinger, vsync zaman damgasının uygulamanın kare hızıyla aynı fazda olup olmadığını doğrulayarak kısılan uygulama için vsync'in geçerliliğini kontrol eder. Kare hızı vsync ile aynı fazda değilse SurfaceFlinger, kare hızı ve vsync aynı fazda olana kadar kareyi tutar.

Aşağıdaki şekil GameManagerService ve SurfaceFlinger arasındaki etkileşimi açıklamaktadır:

GameManagerService ve SurfaceFlinger arasındaki etkileşim

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

SurfaceFinger, yeni bir kare hızı azaltma önceliği ayarlamak için bir <UID, Frame Rate> çifti 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. Bir oyunun kare hızını kısmak için GameServiceManager, UID'nin kare hızını geçersiz kılmak üzere SurfaceFlinger'ı çağırır. Bu mekanizma sayesinde SurfaceFlinger, oyun modu değiştiğinde veya müdahale güncellendiğinde haritalamayı günceller. SurfaceFlinger, arabellekleri uygun şekilde kilitleyerek FPS değişimini yönetir.

FPS azaltma hakkında daha fazla bilgi edinmek için bkz. FPS kısıtlamaya giriş .