Çoklu 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 yeni HAL API'leri tanıtıldı.
  • Farklı yenileme hızları için cihaz yapılandırmalarını ayrıştırmaya ve istenen yenileme hızını ayarlamaya yönelik platform kodu
  • Uygulamaların istedikleri kare hızını ayarlamasına olanak tanıyan yeni SDK ve NDK API'leri

Uygulama

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

Grupları yapılandırma

IComposerClient::Attribute getDisplayAttribute_2_4 API kullanılarak sorgulanabilen yeni bir CONFIG_GROUP özelliği eklendi. Bu özellik, satıcıların ekran yapılandırmalarını birlikte gruplandırmasına olanak tanır. Aynı gruptaki konfigürasyonlar çoğu durumda bunlar arasında kesintisiz geçişe olanak tanır. Yapılandırma grubu, platform tarafından, bir yapılandırmanın diğer niteliklerini değil, yenileme hızını değiştirmek amacıyla hangi yapılandırmaların aralarında değiştirilebileceğini ayırt etmek için kullanılır.

Dört ekran yapılandırmasını destekleyen bir aygıtla 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 48Hz, 60Hz, 72Hz ve 90Hz yenileme hızlarını desteklese de ekran farklı bir modda çalışır ve 60Hz'den 72Hz'e geçiş, ekran yapılandırmasını 1080p'den 1080i'ye değiştirir; bu da istenen davranış olmayabilir. Bu, yapılandırma grupları kullanılarak çözülür. 60Hz ve 90Hz'i bir yapılandırma grubunda ve 48Hz ve 72Hz'i başka bir yapılandırma grubunda gruplayarak. Platform, 60Hz ile 90Hz arasında ve 48Hz ile 72Hz arasında geçiş yapabileceğini ancak 60Hz ile 72Hz arasında geçiş yapamayacağını biliyor çünkü bu, yalnızca yenileme hızını değiştirmek yerine yapılandırma değişikliğine neden olacak.

Besteci 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 süresi açısından) döndürür. Bu, özellikle platformun bir sonraki karenin ne zaman başlatılacağına karar vermesi için yenileme hızı ile mevcut yenileme hızı arasında geçiş yapması gerektiğinde kullanışlı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.
    istenilenZamanNano
    CLOCK_MONOTONIC vsync periyodunun değişebileceği süre (yani vsync periyodu bu saatten önce değişmemelidir). Bu, platform yenileme hızı değişikliği için önceden plan yapmak istediğinde ancak kuyrukta sunacak bazı arabelleklerin zaten bulunduğu durumlarda kullanışlıdır. Platform bu süreyi, bu arabellekleri hesaba katacak şekilde ayarlar ve yenileme hızı geçişinin mümkün olduğu kadar yumuşak olmasını sağlar.
    kesintisizGerekli
    Doğruysa, vsync dönemi değişikliğinin gözle görülür bir görsel yapı olmadan sorunsuz bir şekilde gerçekleşmesi gerekir. Bu işaret, içerik değişikliğinin bir sonucu olarak yenileme hızı değişikliği gerektiğinde (örneğin, cihazın boşta olması ve animasyonun başlaması) platform tarafından kullanılır. Bu, satıcıya gözle görülür bir görsel yapıya yol açabilecek belirli yapılandırma değişikliklerine izin vermeme fırsatı verir. Yapılandırmalar sorunsuz bir şekilde değiştirilemezse ve seamlessRequired true olarak ayarlandıysa, uygulamanın dönüş kodu 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ğrısını çağırması beklenir.

Başarı üzerine uygulama, platforma yenileme hızı değişikliğinin ne zaman gerçekleşeceğini bildiren bir VsyncPeriodChangeTimeline döndürür. newVsyncAppliedTimeNanos parametrelerinin, yeni ekranın yeni vsync döneminde yenilenmeye başlayacağı CLOCK_MONOTONIC içindeki zamana ayarlanması gerekir. 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, yenileme hızının kesintisiz geçişine olanak tanır.

Bazı uygulamalar, yenileme hızının gönderilebilmesi için önce bir yenileme çerçevesinin gönderilmesini gerektirir. Bunun için HAL, bir yenileme çerçevesinin gerekli olduğunu belirtmek için refreshRequired parametresine ve ardından bir yenileme çerçevesinin gönderilmesi gereken ilk vsync'i belirtmek için refreshTimeNanos sahiptir.

onVsyncPeriodTimingChanged [geri arama]
Platforma zaman çizelgesinin bazı parametrelerinin değiştiğini ve platformun zaman çizelgesini ayarlaması gerektiğini belirtmek için HAL tarafından çağrılabilen yeni bir geri arama. Bu geri aramanın, HAL'deki uzun işlem süresi veya geç yenileme çerçevesi nedeniyle herhangi bir nedenle eski zaman çizelgesinin kaçırılması durumunda çağrılması bekleniyor.

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:

Görüntü yöneticisi
DisplayManager yenileme hızına ilişkin üst düzey politikayı belirler. Besteci HAL yapılandırmasıyla aynı olan varsayılan bir ekran yapılandırmasını ayarlar. Ek olarak, SurfaceFlinger yenileme hızı olarak seçebileceği bir dizi minimum ve maksimum değer belirler.
SurfaceFlinger
Varsayılan yapılandırmayla aynı yapılandırma grubunda yer alan ve yenileme hızı min/maks aralığında olan bir yapılandırmayı ayarlayarak yenileme hızını belirler.

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

  • SurfaceFlinger etkin yapılandırmayı 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 için kullanılır.
    • Tepe yenileme hızı ayarı : Tepe yenileme hızı değeri Settings.System.PEAK_REFRESH_RATE öğesinden okunur. Bu değer, geçerli cihaz ayarını (örneğin bir menü seçeneğinden) yansıtacak şekilde çalışma zamanında 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 adresinden okunur. Bu değer, geçerli cihaz ayarını yansıtacak şekilde çalışma zamanında değiştirilebilir (örneğin bir menü seçeneğinden). Varsayılan değer 0'dır, dolayısıyla varsayılan minimum değer yoktur.
    • Uygulama talep edildi ModeId : Uygulamalar, WindowManager.LayoutParams.preferredDisplayModeId ayarını 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 ve maksimum yenileme hızını, yapılandırmanın yenileme hızıyla eşleşecek şekilde ayarlar.
    • Pil Tasarrufu : Cihaz, Settings.Global.LOW_POWER_MODE.

DisplayManager politikayı ayarladıktan sonra SurfaceFlinger , yenileme hızını etkin katmanlara (kare güncellemelerini sıraya koyan katmanlar) göre ayarlar. Katmanın sahibi bir kare hızı ayarlarsa SurfaceFlinger, yenileme hızını bu hızın çarpanı olan bir değere ayarlamaya çalışır. Örneğin, iki aktif katman kare hızını 24 ve 60'a ayarlarsa SurfaceFlinger, varsa 120Hz'yi seçecektir. Böyle bir yenileme hızı SurfaceFlinger için mevcut değilse, kare hızı için minimum hataya sahip olan yenileme hızını seçmeye çalışacaktır. Daha fazla bilgi için geliştirici.android.com adresindeki geliştirici belgelerine bakın.

SurfaceFlinger yenileme hızına nasıl karar verileceğini kontrol etmek için aşağıdaki bayrakları tutar:

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

Kare Hızı API'si

Kare hızı API'si, uygulamaların Android platformunu amaçlanan kare hızları konusunda bilgilendirmesine olanak tanır ve Android 11'i hedefleyen uygulamalarda mevcuttur. Kare hızı API'si hakkında daha fazla bilgi edinmek için, geliştirici.android.com adresindeki geliştirici belgelerine bakın.

Geliştirici Seçenekleri

Menüye, ekrandaki kaplamayı geçerli yenileme hızıyla değiştiren yeni bir geliştirici seçeneği eklendi. Yeni seçenek Ayarlar > Sistem > Geliştirici seçenekleri > Yenileme hızını göster altındadır.