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.
- Çerçevelerin erken değil zamanında sunulması için sunum zaman damgaları ekler.
-
EGL_ANDROID_presentation_time
veVK_GOOGLE_display_timing
sunum zaman damgası uzantılarını kullanır.
- 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
veVkFence
).
- 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.
- Android Frame Pacing'i OpenGL oluşturucunuza entegre edin
- Android Frame Pacing'i Vulkan oluşturucunuza entegre edin
Daha fazlasını okumak için bkz. Uygun kare ilerleme hızına ulaşma .
Saniyedeki kare sayısı azaltma müdahalesi
Saniyedeki 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:

Ş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ş .