Birden fazla yenileme hızı

Android 11, birden fazla yenileme hızına sahip cihazlar için destek ekler. Bu özelliğin üç ana bileşeni vardır:

  • android.hardware.graphics.composer@2.4 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 android.hardware.graphics.composer@2.4 HAL'ya eklendi. composer HAL'in önceki sürümleri yenileme hızı geçişini sınırlı olarak desteklediğinden bu sürümü kullanmanızı önemle tavsiye ederiz.

Yapılandırma grupları

CONFIG_GROUP adlı yeni bir özellik, getDisplayAttribute_2_4 API'si kullanılarak sorgulanabilen IComposerClient::Attribute'ye eklendi. Bu özellik, tedarikçilerin ekran yapılandırmalarını birlikte gruplandırmasına olanak tanır. Aynı gruptaki yapılandırmalar çoğu durumda bunlar arasında sorunsuz geçiş yapmanızı sağlar. Yapılandırma grubu, yenileme hızını değiştirmek için platform tarafından kullanılır. Bu sayede, yapılandırmanın diğer özelliklerini değiştirmeden hangi yapılandırmalar arasında geçiş yapılabileceği belirlenir.

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 ve 60 Hz'den 72 Hz'ye geçiş yapıldığında ekran yapılandırması 1080p'den 1080i'ye değişir. Bu, istenen bir davranış olmayabilir. Bu sorun, yapılandırma grupları kullanılarak çözülür. 60 Hz ve 90 Hz'i 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ı bilir. Bunun nedeni, bu durumda yenileme hızını değiştirmek yerine yapılandırmanın değiştirilmesi gerekmesidir.

Composer API güncellemeleri

getDisplayVsyncPeriod
Yenileme hızları değiştirilirken 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 kullanışlıdır. Platformun bir sonraki kareye ne zaman başlayacağına karar vermesi için mevcut yenileme hızı gerekir.
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
    vsync döneminin değişebileceği CLOCK_MONOTONIC süresi (yani vsync dönemi bu süreden ö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. Bu işaret, içerik değişikliği (ör. cihaz boşta ve animasyon başlıyor) sonucunda yenileme hızı değişikliği gerektiğinde platform tarafından kullanılı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.

Uygulama başarılı olduğunda, yenileme hızı değişikliğinin ne zaman gerçekleşeceğini platforma bildiren bir VsyncPeriodChangeTimeline döndürü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 için refreshRequired, yenileme karesinin gönderilmesi gereken ilk dikey senkronizasyonu belirtmek için ise refreshTimeNanos parametresine sahiptir.

onVsyncPeriodTimingChanged [callback]
HAL tarafından, zaman çizelgesinin bazı parametrelerinin değiştiğini ve platformun zaman çizelgesini ayarlaması gerektiğini belirtmek için çağrılabilen 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ını yineleyerek 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, mevcut cihaz ayarını yansıtmak için çalışma zamanında (ör. bir menü seçeneğinden) 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: Yenileme hızı ayarlanmamış olsa bile 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.