Ab Android 13 weist das System neue Framebuffer zu, die bei der Client-Zusammensetzung verwendet werden, wenn sich die Bildschirmauflösung ändert. SurfaceFlinger führt diese Zuweisung im nächsten invalidate-Zyklus nach einer Auflösungsänderung aus.
Framebuffer-Verwaltung bei Auflösungswechseln
Änderungen der Auflösung können aus einem der folgenden zwei Gründe auftreten:
Ein Hotplug-Ereignis, das vom Hardware Composer (HWC) initiiert wird, wenn von einem externen Display zu einem anderen externen Display mit einer anderen Standardauflösung gewechselt wird.
Bei einem Hotplug-Ereignis gibt HWC die Handles für die alten Framebuffer frei, wenn die alten Displaydaten freigegeben werden.
Ein von SurfaceFlinger initiierter Displaymoduswechsel, der erfolgt, wenn Sie die Auflösung über die Nutzereinstellungen ändern oder eine App die Auflösung über
preferredDisplayModeId
ändert.Beim Wechsel des Anzeigemodus gibt SurfaceFlinger die Handles für vorhandene Client-Framebuffer frei, bevor
setActiveConfig
odersetActiveConfigWithConstraints
aufgerufen wird.
Um schwerwiegende Probleme wie die Speicherfragmentierung auf Geräten ohne ausreichend Framebuffer-Speicher zu vermeiden, muss HWC Handles für alte Framebuffer freigeben. Das ist in den folgenden Fällen wichtig:
Bei Hotplug-Ereignissen unmittelbar vor dem Aufrufen von
onHotplug
.Bei Moduswechseln unmittelbar nach dem Aufrufen von
setActiveConfig
odersetActiveConfigWithConstraints
.
Durch das Freigeben der Handles kann der Framebuffer-Speicher vollständig freigegeben werden, bevor SurfaceFlinger während des 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. Dies kann zu schwerwiegenden Problemen führen, wenn die neue Zuweisung aufgrund von Fragmentierung oder anderen Problemen fehlschlägt. Noch schlimmer ist es, wenn HWC diese Handles überhaupt nicht freigibt, da dann ein Speicherleck auftreten kann.
Um schwerwiegende Zuweisungsfehler zu vermeiden, sollten Sie die folgenden Empfehlungen beachten:
Wenn HWC die alten Client-Framebuffer weiterhin verwenden muss, bis neue Client-Framebuffer bereitgestellt werden, ist es wichtig, 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 den Framebuffern einen dedizierten Arbeitsspeicherpool zu, der vom restlichen Grafikpuffer-Arbeitsspeicher getrennt ist. Dies ist wichtig, da ein Drittanbieterprozess möglicherweise versucht, Grafikspeicher zwischen der Deallokation und der Reallokation des Framebuffers zuzuweisen. Wenn der Framebuffer denselben Grafikspeicherpool verwendet und der Grafikspeicher voll ist, kann der Drittanbieterprozess Speicher belegen, der zuvor von einem Framebuffer zugewiesen wurde. Dies kann zu unzureichendem Arbeitsspeicher für die Neuzuweisung des Framebuffers oder zu einer Fragmentierung des Arbeitsspeichers führen.
Framebuffer-Verwaltung testen
OEMs wird empfohlen, das korrekte Client-Framebuffer-Speichermanagement bei Auflösungswechseln für ihr Gerät zu testen. Das Vorgehen wird im Folgenden beschrieben:
Bei Hotplug-Ereignissen müssen Sie zwei verschiedene Displays mit unterschiedlichen Auflösungen trennen und wieder anschließen.
Verwenden Sie für Moduswechsel den
ModeSwitchingTestActivity
CTS-Verifier-Test, um einen Moduswechsel zum Testen des Framebuffer-Speicherverhaltens zu initiieren. Mit diesem Test lassen sich Probleme visuell erkennen, die sich programmatisch nur schwer ermitteln lassen.