Birden fazla yenileme hızı

Android 11, birden fazla yenileme hızına sahip cihazlar için destek ekler. Bu özellik üç ana bileşenden oluşur:

  • [email protected] sürümünde yeni HAL API'leri kullanıma sunuldu.
  • Farklı yenileme hızları için cihaz yapılandırmalarını ayrıştıracak ve istenen yenileme hızını ayarlayacak platform kodu
  • Uygulamaların istediği kare hızını ayarlamasına olanak tanıyan yeni SDK ve NDK API'leri

Uygulama

Yenileme hızı değiştirme için özel destek eklendi. …composer HAL'in önceki sürümleri, yenileme hızı değiştirme için sınırlı destek sunduğundan bu sürümü kullanmanızı önemle tavsiye ederiz.

Yapılandırma grupları

CONFIG_GROUP adlı yeni bir özellik, getDisplayAttribute_2_4 API kullanılarak sorgulanabilen IComposerClient::Attribute'ye eklendi. Bu özellik, satıcıların ekran yapılandırmalarını gruplandırmasına olanak tanır. Aynı gruptaki yapılandırmalar çoğu durumda bunlar arasında sorunsuz geçiş yapmanızı sağlar. Platform, hangi yapılandırmalar arasında geçiş yapılabileceğini ayırt etmek için yapılandırma grubunu kullanır. Böylece, bir yapılandırmanın yenileme hızı değiştirilir ancak diğer özellikler değiştirilmez.

Dört ekran yapılandırmasını destekleyen bir cihazda yapılandırma gruplarını kullanmanın avantajlarını gösteren aşağıdaki örneği inceleyin:

  • 1080p@60Hz
  • 1080p@90Hz
  • 1080i@72Hz
  • 1080i@48Hz

Cihaz 48 Hz, 60 Hz, 72 Hz ve 90 Hz yenileme hızlarını desteklese de ekran farklı bir modda çalışır. 60 Hz'den 72 Hz'ye geçiş, ekran yapılandırmasını 1080p'den 1080i'ye değiştirir. Bu durum istenen davranış olmayabilir. Yapılandırma grupları bu sorunu çözer. 60 Hz ve 90 Hz'i tek bir yapılandırma grubunda, 48 Hz ve 72 Hz'i ise başka bir yapılandırma grubunda toplayarak platform, 60 Hz ile 90 Hz arasında ve 48 Hz ile 72 Hz arasında geçiş yapabileceğini ancak 60 Hz ile 72 Hz arasında geçiş yapamayacağını anlar. Bunun nedeni, bu durumda yenileme hızının değiştirilmesinden ziyade yapılandırmada değişiklik yapılmasıdır.

Composer API güncellemeleri

getDisplayVsyncPeriod
Yenileme hızlarını değiştirirken daha iyi kontrol ve öngörülebilirlik için getDisplayVsyncPeriod eklendi. getDisplayVsyncPeriod, ekranın çalıştığı mevcut yenileme hızını (dikey senkronizasyon dönemi açısından) döndürür. Bu özellik, özellikle yenileme hızı arasında geçiş yaparken yararlıdır. Platformun bir sonraki kareye ne zaman başlayacağına karar vermek için mevcut yenileme hızına ihtiyacı vardır.
setActiveConfigWithConstraints
setActiveConfigWithConstraints yöntemi, mevcut setActiveConfig yönteminin yeni bir uzantısıdır ve yapılandırma değişikliği hakkında daha fazla bilgi sağlar. Kısıtlamalar, vsyncPeriodChangeConstraints parametrelerinin bir parçası olarak verilir ve aşağıdaki parametreleri içerir.
    desiredTimeNanos
    Dikey senkronizasyon döneminin değişebileceği CLOCK_MONOTONIC zaman (yani dikey senkronizasyon dönemi bu zamandan önce değişmemelidir). Bu, platformun yenileme hızı değişikliği için önceden plan yapmak istediği ancak kuyrukta sunulacak bazı arabelleklerin olduğu durumlarda kullanışlıdır. Platform, bu aralıkları hesaba katmak ve yenileme hızı geçişinin olabildiğince sorunsuz olmasını sağlamak için bu süreyi buna göre ayarlar.
    seamlessRequired
    Doğruysa vsync dönemi değişikliğinin fark edilebilir görsel öğe olmadan sorunsuz bir şekilde gerçekleşmesi gerekir. Platform, içerik değişikliği sonucunda (ör. cihaz boşta ve animasyon başlıyor) yenileme hızı değişikliği gerektiğinde bu işareti kullanır. Bu sayede, satıcılar belirli yapılandırma değişikliklerinin belirgin görsel hatalara yol açabileceği durumlarda bu değişikliklere izin vermeyebilir. Yapılandırmalar sorunsuz bir şekilde değiştirilemiyorsa ve seamlessRequired, true olarak ayarlanmışsa uygulamanın dönüş kodu olarak SEAMLESS_NOT_POSSIBLE değerini döndürmesi ve aynı yapılandırma değişikliği sorunsuz bir şekilde yapılabildiğinde yeni onSeamlessPossible geri çağırma işlevini çağırması beklenir.

İşlem başarılı olduğunda, platforma yenileme hızı değişikliğinin ne zaman gerçekleşeceğini bildiren bir VsyncPeriodChangeTimeline döndürülür. newVsyncAppliedTimeNanos parametreleri, yeni ekranın yeni dikey senkronizasyon döneminde yenilenmeye başlayacağı CLOCK_MONOTONIC saatine ayarlanmalıdır. Bu, desiredTimeNanos ile birlikte platformun yenileme hızı geçişini önceden planlamasına ve yeni yenileme hızı için uygulamaları önceden işaretlemeye başlamasına olanak tanır. Bu sayede yenileme hızı sorunsuz bir şekilde değiştirilebilir.

Bazı uygulamalarda yenileme hızının gönderilebilmesi için yenileme karesinin gönderilmesi gerekir. Bunun için HAL, yenileme karesinin gerekli olduğunu belirtmek üzere refreshRequired, yenileme karesinin gönderilmesi gereken ilk dikey senkronizasyonu belirtmek üzere refreshTimeNanos parametresine sahiptir.

onVsyncPeriodTimingChanged [callback]
HAL'ın, zaman çizelgesinin bazı parametrelerinin değiştiğini ve platformun zaman çizelgesini ayarlaması gerektiğini belirtmek için çağırabileceği yeni bir geri çağırma. Bu geri çağırma, HAL'deki uzun işleme süresi veya geç yenileme çerçevesi nedeniyle eski zaman çizelgesi kaçırılırsa çağrılır.

Platform, yenileme hızını değiştirmeye nasıl karar veriyor?

Yenileme hızı seçimi aşağıdaki iki sistem hizmetinde gerçekleşir:

DisplayManager
, yenileme hızıyla ilgili DisplayManager üst düzey politikasını belirler. Varsayılan bir ekran yapılandırması ayarlar. Bu yapılandırma, Composer HAL yapılandırmasıyla aynıdır. Ayrıca, yenileme hızı olarak seçilecek SurfaceFlinger için minimum ve maksimum değer aralığı belirler.
SurfaceFlinger
Varsayılan yapılandırmayla aynı yapılandırma grubunda olan ve minimum/maksimum aralığında bir yenileme hızına sahip bir yapılandırma ayarlayarak yenileme hızını belirler.

Görüntüleme Yöneticisi, politikayı belirlemek için aşağıdaki adımları uygular:

  • Etkin yapılandırmayı SurfaceFlinger adresinden sorgulayarak varsayılan yapılandırma kimliğini bulur.
  • Sistem koşulları üzerinde yineleme yaparak minimum ve maksimum değer aralığını kısıtlama
    • Varsayılan yenileme hızı ayarı: Varsayılan yenileme hızı değeri, R.integer.config_defaultRefreshRate yapılandırma katmanında ayarlanır. Bu değer, animasyonlar ve dokunma etkileşimleri için standart cihaz yenileme hızını belirlemek üzere kullanılır.
    • Yoğun yenileme hızı ayarı: Yoğun yenileme hızı değeri Settings.System.PEAK_REFRESH_RATE'dan okunur. Bu değer, çalışma zamanında mevcut cihaz ayarını (ör. bir menü seçeneğinden) yansıtacak şekilde değiştirilir. Varsayılan değer, R.integer.config_defaultPeakRefreshRate yapılandırma katmanında ayarlanır.
    • Minimum yenileme hızı ayarı: Minimum yenileme hızı değeri Settings.System.MIN_REFRESH_RATE'den okunur. Bu değer, mevcut cihaz ayarını yansıtacak şekilde çalışma zamanında (ör. bir menü seçeneğinden) değiştirilebilir. Varsayılan değer 0 olduğundan varsayılan minimum değer yoktur.
    • Uygulama tarafından istenen ModeId: Uygulamalar, ekranın çalışması gereken tercih edilen yapılandırmayı yansıtmak için WindowManager.LayoutParams.preferredDisplayModeId değerini ayarlayabilir. Çoğu durumda, DisplayManager, varsayılan yapılandırma kimliğini buna göre ayarlar ve minimum ile maksimum yenileme hızını yapılandırmanın yenileme hızıyla eşleşecek şekilde belirler.
    • Pil Tasarrufu: Cihaz düşük güç modundayken yenileme hızı 60 Hz veya daha düşük bir değerle sınırlandırılır. Bu durum Settings.Global.LOW_POWER_MODE. simgesiyle gösterilir.

DisplayManager politikayı ayarladıktan sonra, SurfaceFlinger yenileme hızını etkin katmanlara (kare güncellemelerini sıraya alan katmanlar) göre ayarlar. Katmanın sahibi bir kare hızı belirlerse SurfaceFlinger, yenileme hızını bu hızın katı olan bir değere ayarlamaya çalışır. Örneğin, iki etkin katman kare hızını 24 ve 60 olarak ayarlarsa SurfaceFlinger, 120 Hz kullanılabilirse bu hızı seçer. SurfaceFlinger için böyle bir yenileme hızı mevcut değilse kare hızı için en az hataya sahip yenileme hızını seçmeye çalışır. Daha fazla bilgi için developer.android.com adresindeki geliştirici belgelerine bakın.

SurfaceFlinger, yenileme hızının nasıl belirleneceğini kontrol etmek için aşağıdaki işaretleri kullanır:

  • ro.surface_flinger.use_content_detection_for_refresh_rate: Ayarlanırsa kare hızı ayarlanmamış olsa bile yenileme hızı etkin katmanlara göre belirlenir. SurfaceFlinger, katmanın arabellekleri yayınladığı ortalama FPS'yi, arabelleğe eklenen sunum zaman damgasına bakarak bulduğu bir sezgisel yöntem kullanır.
  • ro.surface_flinger.set_touch_timer_ms: > 0 ise kullanıcı, yapılandırılan zaman aşımı süresince ekrana dokunduğunda varsayılan yenileme hızı kullanılır. Bu sezgisel yöntem, animasyonlar için varsayılan yenileme hızına hazır olmak amacıyla uygulanır.
  • ro.surface_flinger.set_idle_timer_ms: > 0 ise yapılandırılan zaman aşımı için ekran güncellemesi olmadığında minimum yenileme hızı kullanılır.
  • ro.surface_flinger.set_display_power_timer_ms: > 0 ise yapılandırılan zaman aşımı için ekran açıldığında (veya AOD'den çıkıldığında) varsayılan yenileme hızı kullanılır.

Frame Rate API

Kare hızı API'si, uygulamaların amaçladıkları kare hızını Android platformuna bildirmesine olanak tanır ve Android 11'i hedefleyen uygulamalarda kullanılabilir. Kare hızı API'si hakkında daha fazla bilgi edinmek için developer.android.com adresindeki geliştirici belgelerine göz atın.

Geliştirici seçenekleri

Menüye, mevcut yenileme hızıyla ekranda bir yer paylaşımını açıp kapatan yeni bir geliştirici seçeneği eklendi. Yeni seçenek Ayarlar > Sistem > Geliştirici seçenekleri > Yenileme hızını göster bölümünde yer alır.