Birden fazla yenileme hızı

Android 11, birden fazla yenileme hızı olan 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ırıp istenen yenileme hızını ayarlayan platform kodu
  • Uygulamaların istedikleri kare hızını ayarlamalarına olanak tanıyan yeni SDK ve NDK API'leri

Uygulama

Yenileme hızı geçişi için özel destek android.hardware.graphics.composer@2.4 HAL'e eklendi. composer HAL'ın önceki sürümleri yenileme hızı geçişi için sınırlı destek sunduğundan bu sürümü kullanmanızı önemle tavsiye ederiz.

Yapılandırma grupları

IComposerClient::Attribute alanına, getDisplayAttribute_2_4 API kullanılarak sorgulanabilir yeni bir CONFIG_GROUP özelliği eklendi. Bu özellik, tedarikçilerin 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ıza olanak tanır. Yapılandırma grubu, platform tarafından bir yapılandırma için diğer özellikleri değil de yenileme hızını değiştirmek amacıyla hangi yapılandırmalar arasında geçiş yapılabileceğini belirlemek için kullanılır.

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

  • 60 Hz'de 1080p
  • 90 Hz'de 1080p
  • 72 Hz'de 1080i
  • 48 Hz'de 1080i

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 davranış olmayabilir. Bu sorun, yapılandırma grupları kullanılarak çözülebilir. 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 gruplandırarak. Platform, 60 Hz ile 90 Hz 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, 60 Hz ile 72 Hz arasında geçiş yapılmasının yenileme hızını değiştirmekten ziyade yapılandırma değişikliğine yol açması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ığı geçerli yenileme hızını (vsync dönemi Bu özellikle, platformun bir sonraki kareyi ne zaman başlatacağına karar vermek için yenileme hızı ile mevcut yenileme hızı arasında geçiş yaparken yararlıdı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
    CLOCK_MONOTONIC içinde, vsync süresinin değişebileceği zaman (yani vsync süresi bu zamandan önce değişmemelidir). Bu özellik, platformun yenileme hızı değişikliği için önceden plan yapmak istediği ancak sırada sunulacak bazı arabellekleri olduğunda faydalıdır. Platform, bu zaman aralığını bu tamponları hesaba katacak ve yenileme hızı geçişinin olabildiğince sorunsuz olmasını sağlayacak şekilde ayarlar.
    seamlessRequired
    Doğruysa vsync dönemi değişikliğinin belirgin bir görsel kusur olmadan sorunsuz bir şekilde gerçekleşmesini gerektirir. Bu işaret, içerik değişikliği sonucunda yenileme hızı değişikliği gerektiğinde (örneğin, cihaz boştayken animasyon başladığında) platform tarafından kullanılır. Bu sayede tedarikçi firma, belirgin bir görsel kusur oluşturabilecek belirli yapılandırma değişikliklerine izin vermeyebilir. Yapılandırmalar sorunsuz bir şekilde değiştirilemiyorsa ve seamlessRequired true olarak ayarlanmışsa uygulamanın, döndürülen kod olarak SEAMLESS_NOT_POSSIBLE 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 platforma yenileme hızı değişikliğinin ne zaman gerçekleşeceğini bildiren bir VsyncPeriodChangeTimeline döndürülür. newVsyncAppliedTimeNanos parametrelerinin, yeni ekranın yeni vsync döneminde yenilenmeye başlayacağı CLOCK_MONOTONIC zamanına ayarlanması gerekir. Bu, desiredTimeNanos ile birlikte platformun yenileme hızı geçişini önceden planlamasına ve uygulamaları yeni yenileme hızı için önceden işaretlemeye başlamasına olanak tanır. Bu, yenileme hızının sorunsuz bir şekilde geçiş yapmasını sağlar.

Bazı uygulamalarda, yenileme hızının gönderilebilmesi için bir yenileme çerçevesinin gönderilmesi gerekir. Bunun için HAL'de, yenileme çerçevesine ihtiyaç duyulduğunu belirten refreshRequiredparametresi ve yenileme çerçevesinin gönderilmesi gereken ilk vsync'i belirten refreshTimeNanos parametresi bulunur.

onVsyncPeriodTimingChanged [callback]
Platforma zaman çizelgesinin bazı parametrelerinin değiştiğini ve zaman çizelgesini ayarlamasının gerektiğini belirtmek için HAL tarafından çağrılabilecek yeni bir geri çağırma işlevi. HAL'deki uzun işleme süresi veya geç bir yenileme çerçevesi nedeniyle eski zaman çizelgesi herhangi bir nedenle kaçırıldıysa bu geri çağırma işlevinin çağrılması beklenir.

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

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

DisplayManager
DisplayManager, yenileme hızı ile ilgili üst düzey politikayı belirler. Besteci HAL yapılandırmasıyla aynı olan varsayılan bir görüntüleme yapılandırması belirler. Ayrıca, SurfaceFlinger için yenileme hızı olarak seçebileceği minimum ve maksimum değer aralığını belirler.
SurfaceFlinger
Varsayılan yapılandırmayla aynı yapılandırma grubunda bulunan ve minimum/maksimum aralıktaki bir yenileme hızı içeren bir yapılandırma ayarlayarak yenileme hızını belirler.

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

  • SurfaceFlinger kaynağından etkin yapılandırmayı sorgulayarak varsayılan yapılandırma kimliğini bulur
  • Sistem koşullarını iterleyerek 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 yer paylaşımında ayarlanır. Bu değer, animasyonlar ve dokunma etkileşimleri için standart cihaz yenileme hızını belirlemek amacıyla kullanılır.
    • En yüksek yenileme hızı ayarı: En yüksek yenileme hızı değeri Settings.System.PEAK_REFRESH_RATE'den okunur. Bu değer, mevcut cihaz ayarını yansıtacak şekilde çalışma zamanında değiştirilir (ör. bir menü seçeneğinde). Varsayılan değer, R.integer.config_defaultPeakRefreshRate yapılandırma yer paylaşımında ayarlanır.
    • Minimum yenileme hızı ayarı: Minimum yenileme hızı değeri Settings.System.MIN_REFRESH_RATE'den okunur. Bu değer, çalışma zamanında mevcut cihaz ayarını yansıtacak şekilde değiştirilebilir (ör. bir menü seçeneğinden). Varsayılan değer 0 olduğundan varsayılan minimum değer yoktur.
    • Uygulama tarafından istenen ModeId: Uygulamalar, WindowManager.LayoutParams.preferredDisplayModeId değerini ekranın çalışması gereken tercih edilen yapılandırmayı yansıtacak şekilde 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 ayarlar.
    • 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ı belirledikten sonra SurfaceFlinger, yenileme hızını etkin katmanlara (kare güncellemelerini sıraya ekleyen katmanlar) göre belirler. Katmanın sahibi bir kare hızı ayarlarsa SurfaceFlinger, yenileme hızını bu hızın çarpanı olan bir değere ayarlamayı dener. Örneğin, iki etkin katman kare hızını 24 ve 60 olarak ayarlarsa SurfaceFlinger, mevcutsa 120 Hz'i seçer. SurfaceFlinger bu tür bir yenileme hızını kullanamıyorsa 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şaretçileri korur:

  • ro.surface_flinger.use_content_detection_for_refresh_rate: Ayarlanırsa, kare hızı ayarlanmasa bile yenileme hızına etkin katmanlara göre karar verilir. SurfaceFlinger, arabelleğe eklenen sunma zaman damgasına bakarak katmanın yayınladığı arabellekleri ortalama kare hızını bulduğu bir sezgisel yöntem kullanır.
  • ro.surface_flinger.set_touch_timer_ms: > 0 ise kullanıcı ekrana dokunduğunda varsayılan yenileme hızı, yapılandırılmış zaman aşımı için kullanılır. Bu sezgisel yaklaşım, animasyonlar için varsayılan yenileme hızıyla hazır olmak amacıyla yapılır.
  • ro.surface_flinger.set_idle_timer_ms: > 0 ise yapılandırılmış 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 ekran açıldığında (veya AOD'den çıktığınızda) yapılandırılmış zaman aşımı için varsayılan yenileme hızı kullanılır.

Frame Rate API

Kare hızı API'si, uygulamaların Android platformunu hedefledikleri kare hızıyla ilgili bilgilendirmesine 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 dokümanlarına göz atın.

Geliştirici seçenekleri

Menüye, ekranda mevcut yenileme hızıyla bir yer paylaşımını açan 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.