Gestione framebuffer client

A partire da Android 13, i nuovi framebuffers, utilizzati durante cliente composizione, vengono assegnate ogni volta che la risoluzione del display cambia. Questo l'allocazione viene eseguita da SurfaceFlinger al successivo ciclo di annullamento della convalida. dopo una modifica di risoluzione.

Gestione del Framebuffer durante i cambi di risoluzione

Le modifiche alla risoluzione si verificano per uno dei seguenti motivi: due scenari:

  • Un evento hotplug. avviato da Hardware Composer (HWC), che si verifica durante lo scambio da un su un altro monitor esterno con una risoluzione predefinita diversa.

    Durante un evento hotplug, gli handle dei framebuffer precedenti vengono rilasciati quando i vecchi dati del display vengono distribuiti.

  • Un cambio della modalità di visualizzazione avviato da SurfaceFlinger, che si verifica quando l'utente cambia la risoluzione con le impostazioni utente, oppure un'app cambia la risoluzione con preferredDisplayModeId.

    Durante un cambio della modalità di visualizzazione, gli handle ai framebuffer client esistenti vengono rilasciati da SurfaceFlinger prima di chiamare setActiveConfig o setActiveConfigWithConstraints.

Per evitare problemi catastrofici, come la frammentazione della memoria, sui dispositivi che non riservare abbastanza memoria per i framebuffer vecchio e nuovo, è fondamentale che HWC smetta di usare i vecchi framebuffer e rilascia qualsiasi a questi framebuffer, come illustrato nei seguenti casi:

Il rilascio degli handle consente di allocare completamente la memoria del framebuffer prima dell'allocazione di nuovi framebuffer eseguiti da SurfaceFlinger. durante il successivo ciclo di invalidate.

Consigli per la gestione del framebuffer

Se HWC non rilascia gli handle ai framebuffer precedenti in tempo, la nuova allocazione del framebuffer avviene prima di quella precedente. deallocation. Ciò può causare problemi catastrofici in caso di errore della nuova allocazione a causa della frammentazione o di altri problemi. Ancora peggio, se HWC non rilascia affatto questi handle, una perdita di memoria può che si verificano.

Per evitare errori di allocazione catastrofici, segui questi suggerimenti:

  • Se HWC deve continuare a utilizzare i framebuffer del client precedenti fino al nuovo framebuffer del client, quindi è fondamentale riservare memoria sufficiente sia per il vecchio che per il nuovo framebuffer ed eventualmente eseguire la deframmentazione algoritmi sullo spazio di memoria del framebuffer.

  • Alloca un pool di memoria dedicato per i framebuffer separato da il resto della memoria di buffer grafica. Questo è importante perché deal e riallocazione dei framebuffer, un processo di terze parti può tentativo di allocare memoria grafica. Se lo stesso pool di memoria grafica utilizzata dal framebuffer e, se la memoria grafica è piena, di un processo può occupare la memoria grafica allocata in precedenza da un framebuffer, lasciando memoria insufficiente per la riassegnazione del framebuffer frammentare lo spazio della memoria.

Testa la gestione del framebuffer

Consigliamo agli OEM di verificare la corretta gestione della memoria del framebuffer del client per il proprio dispositivo, come descritto di seguito:

  • Per gli eventi hotplug, è sufficiente scollegare e ricollegare due display diversi con risoluzioni diverse.

  • Per cambiare modalità, utilizza il ModeSwitchingTestActivity CTS Test del verificatore per avviare uno switch di modalità per testare il comportamento della memoria del framebuffer. Questo test può identificare visivamente i problemi difficili da rilevare in modo programmatico.