Kare İlerleme Hızı Kitaplığı Android Oyun Geliştirme Kiti'nin bir parçasıdır.

Swappy olarak da bilinen Android Frame Pacing kitaplığı AGDK Kitaplıkları'nın bir parçasıdır. OpenGL ve Vulkan oyunlarının sorunsuz bir şekilde oluşturulmasına yardımcı olur ve doğru kare hızını ayarlayın. Bu belgede kare ilerleme hızı tanımlanmaktadır, gerekli olan kare hızının gerekli olduğu durumları gösterir ve kitaplığın nasıl hazırlanabileceğinizi öğreneceksiniz. Doğrudan "Çerçeveleme" düğmesi kullanarak için Sonraki adım bölümüne bakın.

Arka plan

Kare hızı, bir oyunun mantığı ve oluşturma döngüsünü, işletim sisteminin ekran alt sistemi ve temel ekran donanımı. Android görüntülü reklam alt sistemi, görsel yapıları (tearing olarak bilinir) önleyecek şekilde tasarlanmıştır. ekran donanımı yarı yönde yeni bir çerçeveye geçtiğinde meydana gelen güncellemem gerekiyor. Bu yapıları önlemek için görüntülü reklam alt sistemi takip etmek için:

  • Geçmiş kareleri dahili olarak arabelleğe alır
  • Geç kare gönderimlerini algılar
  • Geç kareler algılandığında geçmiş karelerin görüntülenmesini tekrar eder

Bir oyun SurfaceFlinger (SurfaceFlinger) gönderen, tüm çizim seçeneklerini gönderdiğini belirten çağrısı sayısını gösterir (eglSwapBuffers veya vkQueuePresentKHR çağırarak). SurfaceFlinger, bir çerçevenin kullanılabilirliğini mandalı. Ardından, ekran donanımı belirtilen kareyi gösterir. Ekran donanımı 60 Hz gibi sabit bir hızda titrer ve olması durumunda, donanım önceki kareyi tekrar görüntüler.

Tutarsız kare süreleri genellikle bir oyun oluşturma döngüsü oluşturulduğunda daha farklı bir hıza erişebiliyor. 30 FPS'de çalışan bir oyun yerel olarak 60 FPS'yi destekleyen bir cihazda görüntü oluşturmaya çalıştığında, döngü, fazladan 16 kare için ekranda yinelenen bir kare kaldığını fark etmez. milisaniye cinsinden ayarlanır. Bu kopukluk genellikle karede önemli ölçüde kez, örneğin: 49 milisaniye, 16 milisaniye, 33 milisaniye. Aşırı derecede karmaşık sahneler, eksik karelerin eksik olmasına yol açtığından bu sorunu daha da meydana gelir.

Optimum olmayan çözümler

Kare hızı için aşağıdaki çözümler geçmişte oyunlarda kullanıldı Bu durum genellikle tutarsız kare süreleri ve daha yüksek giriş gecikmelerine neden olur.

Kareleri, oluşturma API'sinin izin verdiği hızda gönderme

Bu yaklaşım, bir oyunu farklı SurfaceFlinger etkinliğiyle ilişkilendirir ve yeni bir ekstra gecikme karesi. Görüntü ardışık düzeninde bir dizi çerçeve vardır. boyutu 2'dir. Bu, oyun kareler de göstermeye çalışıyorsa doldurulur. pek çok değişiklik yapabilirsiniz. Sırada yer kalmadığında oyun döngüsü (veya en azından oluşturma iş parçacığı) bir OpenGL veya Vulkan çağrısı tarafından engellenir. Oyun o zaman ekran donanımının bir çerçeve göstermesini beklemeye zorlanır ve bu arka basınç iki bileşeni senkronize eder. Bu durum, arabellek doldurma olarak bilinir. sıra doldurma. Oluşturucu süreci olup bitenin farkına varmadığından kare hızı tutarsızlığı daha da kötüleşir. Öğe kareden önce oyun örnekleri girişi yapılır, giriş gecikmesi kötüleşir.

Tek başına Android Koreograf'ı kullanma

Oyunlarda senkronizasyon için Android Koreografı da kullanılır. Bu bileşen, Java'da API 16’dan ve API 24’ten C++'ta kullanılabilir, görüntüleme alt sistemiyle aynı sıklıkta gösterilir. Proje yönetimi ile ilgili bu onay işareti gerçek donanım VSYNC'e göre sağlandığında ve bu onay işareti cihaza göre değişir. Uzun karelerde arabellek doldurma işlemi devam edebilir.

Kare Hızı kitaplığının avantajları

Frame Pacing kitaplığı, senkronizasyon ve performans için Android Koreograf'ı işaret iletisindeki değişkenlik ile ilgilenir. Sunumunuzda karelerin doğru zamanda sunulduğundan emin olmak ve sınırları senkronize etmek için zaman damgaları bir şablon kullanmayı deneyin. Kitaplıkta Varsa NDK Koreograf Java Koreografı'na geri dönerse öyle değil.

Kitaplık, cihaz tarafından destekleniyorsa birden fazla yenileme hızını işler. Böylece oyuna kare sunma konusunda daha fazla esneklik sağlanır. Örneğin, 60 Hz yenileme hızını ve 90 Hz'i destekleyen bir cihaz olan Google Play Store'da 60 kare/saniye üretme hızının yüksek olması için 30 FPS yerine 45 FPS'ye düşebilmesi gerekir. Kitaplık, beklenen oyun kare hızını algılar ve kareyi otomatik olarak ayarlar uygun şekilde ayarlayın. Kare İlerleme Hızı kitaplığı da pili iyileştirir ekran güncellemelerini engeller. Örneğin, bir oyun görüntü 60 FPS'de oluşturuluyor, ancak ekran 120 Hz'de güncelleniyorsa, ekran güncellenir. Kare İlerleme Hızı kitaplığı, yenileme hızını, hedefe en yakın cihazın desteklediği değerle değiştirin kare hızı.

İşleyiş şekli

Aşağıdaki bölümlerde, Çerçeve İlerlemesi kitaplığının uzun ve doğru kare hızına ulaşmalarını sağlayın.

Kare ilerleme hızını 30 Hz'de düzelt

60 Hz'lik bir cihazda 30 Hz'de görüntü oluştururken Android'deki ideal durum: Şekil 1'de gösterilmiştir. SurfaceFlinger varsa yeni grafik arabellekleri kilitler (NB diyagramda "arabellek yok" gösterilir ve önceki bildirim tekrarlanır).

60 Hz'lik bir cihazda ideal kare hızı 30 Hz'dir

Şekil 1. 60 Hz'lik bir cihazda ideal kare hızı 30 Hz'dir

Kısa oyun çerçeveleri takılmaya neden oluyor

Modern cihazların çoğunda oyun motorları, platform koreografına güvenir. çerçevelerin gönderilmesini artırmak için değerlendirmeler sunar. Ancak hâlâ geçerli olan olasılığı, Şekil 2'de görüldüğü gibi kısa kareler nedeniyle zayıf kare hızına neden olur. Kısa kareler ve ardından uzun kareler, oynatıcı tarafından titreme olarak algılanır.

Kısa oyun çerçeveleri

Şekil 2. Kısa oyun karesi C, B karesinin yalnızca bir kare göstermesine neden olur. ardından birden fazla C çerçevesi

Kare İlerleme Hızı kitaplığı bu sorunu sunu zaman damgalarını kullanarak çözer. İlgili içeriği oluşturmak için kullanılan kitaplığınız sunu zaman damgası uzantılarını kullanıyor EGL_ANDROID_presentation_time ve VK_GOOGLE_display_timing kareler Şekil 3'te görüldüğü gibi erken sunulmaz.

Sunu zaman damgaları

Şekil 3. Daha düzgün bir görüntü için oyun çerçevesi B iki kez sunulur

Uzun kareler takılmaya ve gecikmeye yol açar

Ekran iş yükü, uygulama iş yükünden daha uzun sürdüğünde fazladan karelerin sıraya eklenmesi. Bu da bir kez daha takılmaya yol açar ve arabellek doldurmadan kaynaklanan fazladan bir gecikme çerçevesine yol açar (bkz. Şekil 4). İlgili içeriği oluşturmak için kullanılan kitaplığın takılmayı ve fazladan gecikme çerçevesini ortadan kaldırır.

Uzun oyun çerçeveleri

4.Şekil Uzun B karesi (A ve B) 2 kare için yanlış ilerleme hızına neden oluyor

Kitaplık bu sorunu senkronize parmaklıkları kullanarak çözer (EGL_KHR_fence_sync ve VkFence) görüntü ardışık düzeninin yakalamasını sağlayan uygulamaya bekleme süresi eklemek bu adımları uygulamanız gerekir. A karesi hâlâ bir ancak Şekil 5'te görüldüğü gibi B karesi artık doğru bir şekilde sunuluyor.

Beklemeler uygulama katmanına eklendi

5. Şekil. C ve D kareleri sunulmak için bekler

Desteklenen çalışma modları

Çerçeve Hızı kitaplığını, aşağıdaki üç ayardan birinde çalışacak şekilde yapılandırabilirsiniz: şu modlar:

  • Otomatik mod kapalı + Ardışık düzen
  • Otomatik mod açık + Ardışık düzen
  • Otomatik mod açık + Otomatik ardışık düzen modu (Ardışık düzen/Ardışık düzen dışı)

Otomatik mod ve ardışık düzen modlarını deneyebilirsiniz ancak ve Swappy başlatıldıktan sonra şunları dahil edin:

  swappyAutoSwapInterval(false);
  swappyAutoPipelineMode(false);
  swappyEnableStats(false);
  swappySwapIntervalNS(1000000000L/yourPreferredFrameRateInHz);

Ardışık düzen modu

Motor iş yüklerini koordine etmek için kitaplık genellikle bir ardışık düzen modeli kullanır VSYNC sınırları arasındaki CPU ve GPU iş yüklerini ayırır.

Ardışık düzen modu

6. Şekil. Ardışık düzen modu

Ardışık düzen olmayan mod

Genel olarak bu yaklaşım, daha düşük ve daha tahmin edilebilir giriş ekranı sağlar. Bir oyunun kare süresinin çok düşük olduğu durumlarda hem CPU hem de GPU tek bir değiştirme aralığına sığabilir. Bu örnekte, ardışık düzensiz bir daha düşük bir giriş ekranı gecikmesi sağlar.

Ardışık düzen olmayan mod

7.Şekil Ardışık düzen olmayan mod

Otomatik mod

Çoğu oyun, değiştirme aralığının (değişim aralığının) nasıl seçileceğini her bir karenin gösterildiği değer (örneğin, 30 Hz için 33,3 ms). Bazı cihazlarda Bir oyun 60 FPS'de oluşturulabilirken diğerinde daha düşük bir hıza düşmesi gerekebilir. değer. Otomatik mod, aşağıdakileri yapmak için CPU ve GPU sürelerini ölçer:

  • Değişim aralıklarını otomatik olarak seç: Bazı cihazlarda 30 Hz yayın yapan oyunlar sahneler ve diğerlerinde 60 Hz, kitaplığın bu aralığı ayarlamasına olanak tanıyabilir ekleyebilirsiniz.
  • Çok hızlı kareler için ardışık düzeni devre dışı bırakın: Optimum hız sunar her durumda giriş ekranı gecikmesi.

Birden fazla yenileme hızı

Birden fazla yenileme hızını destekleyen cihazlar aşağıdaki işlemlerde daha fazla esneklik sağlar: Düzgün görünen bir değiştirme aralığı seçmek:

  • 60 Hz cihazlarda: 60 FPS / 30 FPS / 20 FPS
  • 60 Hz ve 90 Hz cihazlarda: 90 FPS / 60 FPS / 45 FPS / 30 FPS
  • 60 Hz + 90 Hz + 120 Hz cihazlarda: 120 FPS / 90 FPS / 60 FPS / 45 FPS / 40 FPS / 30 FPS

Kitaplık, gerçek oluşturmaya en uygun yenileme hızını seçer kare süresini kısaltarak daha iyi bir görsel deneyim sunar.

Çoklu yenileme hızı kare ilerleme hızı hakkında daha fazla bilgi için Android'de yüksek yenileme hızında oluşturma blog yayınımıza göz atın.

Kare istatistikleri

Çerçeve İlerleme Hızı kitaplığı hata ayıklama için aşağıdaki istatistikleri sunar ve profil çıkarma amaçları:

  • Bir sonraki ekranda bekleyen bir karenin yenilenme sayısını gösteren histogram oluşturucu sırası.
  • İstenen ekran yenilemelerinin sayısına ilişkin histogram gerçek zamanlı saatinizi ifade eder.
  • İki ardışık iki ekran yenilemesi arasında geçen ekran yenilemelerinin histogramı çerçeveler.
  • Bu kare ve gerçek zaman için CPU çalışır.

Sonraki adım

Android Frame Pacing kitaplığını entegre etmek için aşağıdaki kılavuzlardan birine bakın. oyununuza ekleyin:

ziyaret edin.