11.1 Android顯示系統框架_framebuffer原理及改進


1. Android顯示系統框架
Android Graphic UI with GPU Hardware Acceleration
https://community.nxp.com/docs/DOC-93612

a. 顯示驅動framebuffer的原理及改進

只有一個FrameBuffer的缺點:

(1)如果App寫入FB的速度慢,LCD圖像變化慢

(2)如果App寫FB速度不快不慢,LCD圖像會閃爍

因此,在僅使用一個FB的基礎上做出改進,使用多個FB來改進:

(1)DisplayController使用FB0

(2)APP寫FB1

(3)DisplayController使用FB1

(4)APP寫FB0

(5)重復以上步驟

最繪制圖片方面:以前在linux中是對在FB中繪制整個空間的數據,如果需要繪制手機界面,步驟如下:狀態欄、導航欄、背景、圖標;每個界面都需要上述四個步驟

在Android中引入層的概念:狀態欄和導航欄為一層、背景為一層、圖片為一層,最后把繪制好的層合並,合並使用HardwareComposer

HWC稱為硬件合並

驅動支持HWC:每一層對應一個驅動/dev/fbx,APP操作某一層,直接寫對應的FrameBuffer,硬件會自動合並它們(比如我們的4412的fb0~fb4就是對應的LCD)

 

 

b. 多任務系統的顯示: 必定有一個顯示管理者

APP不能直接訪問LCD驅動程序,有一個稱為SurfaceFlinger(統一操作顯示設備)的管理者,其功能:

(1)SurfaceFlinger給APP提供buffer,給APP存放界面(這樣APP和SurfaceFlinger之間就不需要傳輸buffer了)

a、SurfaceFlinger通過gralloc模塊(HAL)向ashmem(驅動層)申請內存

b、得到一個fd,用這個文件句柄描述申請的buffer

c、通過binder把fd傳給APP

d、APP通過mmap(fd)之后直接訪問buffer

(2)APP1/APP 2/APP3 把各自的界面發給SurfaceFlinger,它根據層次、大小進行合成顯示;

a、根據各個界面的Z值(高度,相對XY坐標理解)決定前后順序,Z值肯定是由WindowManagerService確定

b、把這些排序后的buffer傳給HardwareComposer模塊,如果硬件不支持該模塊或者層數超過了模塊的限制,用軟件GL(graphicLibrary)處理

(3)當HardwareComposer不能處理(無硬件/超過硬件支持最大層數),使用GL來處理

 

android系統通過libEGL.so來加載硬件GL庫或者軟件GL庫(引腳GL庫可能是對GPU的訪問),除了SurfaceFlinger可以通過libEGL.so來加載GL庫之外,APP也可以libEGL.so庫來使用GL庫

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM