Android 13 ajoute une nouvelle configuration appelée AutoSingleLayer
pour verrouiller les tampons non signalés. Cette configuration permet à SurfaceFlinger de verrouiller un tampon non signalé lorsqu'une seule couche est mise à jour, et non dans les cas qui se produisent entre les couches, tels que les modifications de géométrie ou les transactions de synchronisation.
Avant Android 13, l'indicateur debug.sf.latch_unsignaled
dans AOSP permet à SurfaceFlinger de verrouiller tous les tampons non signalés, quel que soit le cas d'utilisation. Lorsque cette configuration est activée, des effets secondaires indésirables peuvent se produire, tels que l'interruption des transactions de synchronisation et le gel de l'intégralité de l'écran en attendant que des tampons soient incomplets.
Avec le mode AutoSingleLayer
, seul un tampon d'une seule surface est mis à jour dans un frame. Ce mode permet aux jeux et aux autres applications en plein écran de bénéficier du verrouillage des tampons non signalés et de réduire les à-coups de l'application, tout en restant insensible aux blocages de l'écran.
Paramètres du mode AutoSingleLayer
Dans Android 13, AutoSingleLayer
est le mode par défaut de la fonctionnalité de tampon non signalé par verrouillage. Ce mode est contrôlé par la propriété système debug.sf.auto_latch_unsignaled
.
SurfaceFlinger lit LatchUnsignaledConfig
au démarrage.
Voici les configurations possibles:
LatchUnsignaledConfig::AutoSingleLayer
Dans ce mode par défaut d'AOSP, le verrouillage des tampons non signalés est autorisé lorsqu'une seule couche est mise à jour dans un frame, et que la mise à jour ne comprend qu'une mise à jour de tampon sans transactions de synchronisation ni modifications de géométrie. Dans ce mode,
debug.sf.auto_latch_unsignaled
est défini par défaut surtrue
.LatchUnsignaledConfig::Disabled
Ce mode désactive le comportement non signalé du verrouillage et ne verrouille que les transactions signalées. Ce mode désactive également le mode
AutoSingleLayer
. Pour configurer ce mode, définissezdebug.sf.latch_unsignaled
etdebug.sf.auto_latch_unsignaled
surfalse
.LatchUnsignaledConfig::Always
Dans ce mode, tous les tampons sont verrouillés sans signal. Pour configurer ce mode, définissez
debug.sf.latch_unsignaled
surtrue
.
Test AutoSingleLayer
Pour vérifier si un tampon est verrouillé sans signal, recherchez les traces suivantes de SurfaceFlinger dans Perfetto:
Figure 1 : Trace d'un tampon non signalé à verrouillage dans Perfetto