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.
- Karelerin zamanında gösterilmesi için sunum zaman damgaları ekler.
- Sunum zaman damgası uzantılarını
EGL_ANDROID_presentation_time
veVK_GOOGLE_display_timing
kullanır.
- 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
veVkFence
) 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:
- Android Frame Pacing'i OpenGL oluşturucunuza entegre etme
- Android Frame Pacing'i Vulkan oluşturucunuza entegre etme
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:

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.