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).
Ş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.
Ş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.
Ş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.
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.
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ışı)
Önerilen mod
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.
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.
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:
- Android Çerçeve İlerleme Hızı'nı OpenGL oluşturucunuza entegre etme
- Android Frame Pacing'i Vulkan oluşturucunuza entegre etme