Ab Android 13 weist das System neue Framebuffer zu, die bei der Client Komposition verwendet werden, wenn sich die Bildschirm auflösung ändert. SurfaceFlinger führt diese Zuweisung im nächsten invalidate-Zyklus nach einer Auflösungsänderung durch.
Framebuffer-Verwaltung bei Auflösungsänderungen
Auflösungsänderungen treten in einem der folgenden beiden Szenarien auf:
Ein Hotplug-Ereignis, das vom Hardware Composer (HWC) initiiert wird, das auftritt wenn von einem externen Display zu einem anderen externen Display gewechselt wird das eine andere Standardauflösung hat.
Bei einem Hotplug-Ereignis gibt HWC die Handles für die alten Framebuffer frei, wenn die alten Displaydaten freigegeben werden.
Ein Displaymoduswechsel, der von SurfaceFlinger initiiert wird, wenn Sie die Auflösung über die Nutzereinstellungen ändern oder eine App die Auflösung mit
preferredDisplayModeIdändert.Bei einem Displaymoduswechsel gibt SurfaceFlinger die Handles für vorhandene Client-Framebuffer frei, bevor
setActiveConfigodersetActiveConfigWithConstraintsaufgerufen wird.
Um schwerwiegende Probleme wie die Speicherfragmentierung auf Geräten mit nicht ausreichendem Framebuffer-Arbeitsspeicher zu vermeiden, muss HWC Handles für alte Framebuffer freigeben. Das ist in den folgenden Fällen entscheidend:
Bei Hotplug-Ereignissen unmittelbar vor dem Aufruf von
onHotplug.Bei Moduswechseln unmittelbar nach dem Aufruf von
setActiveConfigodersetActiveConfigWithConstraints.
Durch das Freigeben der Handles kann der Framebuffer-Arbeitsspeicher vollständig freigegeben werden, bevor SurfaceFlinger im nächsten invalidate-Zyklus neue Framebuffer zuweist.
Empfehlungen für die Framebuffer-Verwaltung
Wenn HWC Handles für alte Framebuffer nicht rechtzeitig freigibt, erfolgt die Zuweisung neuer Framebuffer vor der Freigabe alter Framebuffer. Das kann zu schwerwiegenden Problemen führen, wenn die neue Zuweisung aufgrund von Fragmentierung oder anderen Problemen fehlschlägt. Noch schlimmer ist, dass ein Speicherleck auftreten kann, wenn HWC diese Handles überhaupt nicht freigibt.
Folgen Sie diesen Empfehlungen, um schwerwiegende Zuweisungsfehler zu vermeiden:
Wenn HWC die alten Client-Framebuffer weiter verwenden muss, bis neue Client-Framebuffer bereitgestellt werden, ist es entscheidend, genügend Arbeitsspeicher für die alten und neuen Framebuffer zu reservieren und möglicherweise Defragmentierungsalgorithmen für den Framebuffer-Arbeitsspeicher auszuführen.
Weisen Sie einen dedizierten Arbeitsspeicherpool für die Framebuffer zu, der vom restlichen Grafikpuffer-Arbeitsspeicher getrennt ist. Das ist wichtig, da ein Drittanbieterprozess möglicherweise versucht, Grafikarbeitsspeicher zwischen der Freigabe und der Neuzuweisung von Framebuffer zuzuweisen. Wenn der Framebuffer denselben Grafikarbeitsspeicherpool verwendet und der Grafikarbeitsspeicher voll ist, kann der Drittanbieterprozess Arbeitsspeicher belegen, der zuvor von einem Framebuffer zugewiesen wurde. Das kann zu unzureichendem Arbeitsspeicher für die Neuzuweisung von Framebuffer oder zu Speicherfragmentierung führen.
Framebuffer-Verwaltung testen
OEMs sollten die ordnungsgemäße Verwaltung des Client-Framebuffer-Arbeitsspeichers bei Auflösungsänderungen für ihr Gerät testen. Die Tests werden so beschrieben:
Bei Hotplug-Ereignissen trennen Sie zwei verschiedene Displays mit unterschiedlichen Auflösungen und schließen Sie sie wieder an.
Bei Moduswechseln verwenden Sie den
ModeSwitchingTestActivityCTS Verifier-Test, um einen Moduswechsel zum Testen des Framebuffer-Arbeitsspeicherverhaltens zu initiieren. Mit diesem Test können Probleme visuell erkannt werden, die programmatisch schwer zu erkennen sind.