Çoklu yenileme hızı

Android 11, birden fazla yenileme hızı olan cihazlar için destek ekler. Her biri 100'den az gösterim alan üç ana bileşeni var:

  • Yeni HAL API'leri android.hardware.graphics.composer@2.4
  • Cihaz yapılandırmalarını farklı yenileme hızlarına ve İstenen yenileme hızını ayarlayın
  • 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'e yenileme hızı değiştirmeye özel destek eklendi. Önceki sürümlerinden itibaren bu sürümü kullanmanızı öneririz: oluşturucu HAL'si, yenileme hızı arasında geçiş yapmak için sınırlı destek sunar.

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 yapılandırmalarına yardımcı olur. 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.

Yapılandırma kullanmanın avantajlarını gösteren aşağıdaki örneği düşünün dört ekran yapılandırmasını destekleyen bir cihaza sahip gruplar:

  • 60 Hz'de 1080p
  • 1.080p, 90 Hz'de
  • 1080i, 72 Hz
  • 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ü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 gruplandırarak. Platformun da bu işi 60 Hz ile 90 Hz ve 48 Hz ile 72 Hz arasında geçiş yapabilir ancak 60 Hz ve 72 Hz olarak ayarlanır. Bu işlem, yalnızca değiştirmek yerine yapılandırma değişikliğine neden olur. yenileme hızını artırı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 de yenileme hızı ile mevcut yenileme hızı arasında geçiş yapılmasını sağlamak için sonraki karenin ne zaman başlatılacağına karar vermek için platform oluşturun.
setActiveConfigWithConstraints
setActiveConfigWithConstraints Yöntemi yeni bir uzantıdır setActiveConfig yöntemi ile daha uyumlu yapılandırma değişikliği hakkında bilgi edinin. Kısıtlamalar vsyncPeriodChangeConstraints parametreleri ve şunları içeren: parametreleridir.
    desiredTimeNanos
    CLOCK_MONOTONIC bölgesinde vsync döneminin gerçekleşebileceği süre (vsync dönemi, bu tarihten önce değişmemelidir). Bu, 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 tamponları hesaba katacak şekilde bu zamanı da belirler ve yenileme hızı geçişi olabildiğince akıcı olacak.
    seamlessRequired
    True (doğru) ise vsync dönemi değişikliğinin sorunsuz bir şekilde gerçekleşmesi gerekir RACI matrisini elinizin altında bulundurun. 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.

Başarılı olursa, uygulama bir VsyncPeriodChangeTimeline, platforma ne zaman gerçekleşeceğini bildirir yenilenme hızı değişimine yol açacak. 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ı uygulamalar, yenilemeden önce yenileme çerçevesi gönderilmesini gerektirir gönderilebileceğini görebilirsiniz. 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ı gerektiğini belirtmek için HAL tarafından çağrılabilecek yeni bir geri çağırma işlevi. HAL'deki uzun işlem 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
Aynı yapılandırmadaki bir yapılandırmayı ayarlayarak yenileme hızını belirler grubunu varsayılan yapılandırma olarak belirleyin ve min/maks. dahilinde bir yenileme hızına sahip aralığı.

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
  • Şunun üzerinden yineleme yaparak minimum ve maksimum değer aralığını kısıtlama sistem koşulları
    • Varsayılan yenileme hızı ayarı: Varsayılan yenileme hızı değeri R.integer.config_defaultRefreshRate yapılandırma yer paylaşımında ayarlandı. 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 değerinden okunur. Bu değer, mevcut cihaz ayarını yansıtacak şekilde çalışma zamanında değiştirilir (ör. bir menü seçeneğinden). 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ğer Settings.System.MIN_REFRESH_RATE değerinden okunur. Bu değer, geçerli cihaz ayarını yansıtacak şekilde (örneğin, (seçenek) seçeneğini belirleyin. 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 (sıradaki katmanlar) göre ayarlar çerçeve güncellemeleri) girin. 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 belgelerini inceleyin.

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, varsayılan değer Yenileme hızı, kullanıcı yapılandırılmış sürüm için ekrana dokunduğunda kullanılır zaman aşımına uğrar. 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, minimum yenileme hızı , yapılandırılan zaman aşımı için herhangi bir ekran güncellemesi olmadığında kullanılır.
  • ro.surface_flinger.set_display_power_timer_ms: > 0, açılırken (veya ekran açılırken) varsayılan yenileme hızı AOD dışında) görürsünüz.

Kare Hızı API'si

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. Şu konu hakkında daha fazla bilgi edinmek için: hakkında daha fazla bilgi edinmek istiyorsanız developer.android.com adresindeki geliştirici belgelerini inceleyin.

Geliştirici seçenekleri

Yer paylaşımını açık konuma getiren menüye yeni bir geliştirici seçeneği eklendi ekranda geçerli yenileme hızıyla gösterilir. Yeni seçenek Ayarlar > Sistem > Geliştirici seçenekler > Yenileme hızını göster.