一.FrameBuffer
FrameBuffer 介紹:
FrameBuffer中文譯名為幀緩沖驅動,它是出現在2.2.xx內核中的一種驅動程序接口。主設備號為29,次設備號遞增。
Linux抽象出FrameBuffer這個設備來供用戶態進程實現直接寫屏。FrameBuffer機制模仿顯卡的功能,將顯卡硬件結構抽象掉,可以通過FrameBuffer的讀寫直接對顯存進行操作。用戶可以將FrameBuffer看成是顯示內存的一個映像,將其映射到進程地址空間之后,就可以直接進行讀寫操作,而寫操作可以立即反應在屏幕上。這種操作是抽象的,統一的。用戶不必關心物理顯存的位置、換頁機制等等具體細節,這些都是由FrameBuffer設備驅動來完成的。
FrameBuffer實際上就是嵌入式系統中專門為GPU所保留的一塊連續的物理內存,LCD通過專門的總線從framebuffer讀取數據,顯示到屏幕上。
FrameBuffer本質上是一塊顯示緩存,往顯示緩存中寫入特定格式的數據就意味著向屏幕輸出內容。所以說FrameBuffer就是一塊白板。
framebuffer常見的設計規格:
fb常見的典型規格:支持幾個圖形層(如果只有一個圖層,那么鼠標必須疊加到內容中),每個圖形層 支持哪些 像素數據格式 / 分辨率 / 顏色空間 / 是否支持裁剪crop / 是否支持顯示偏移設置 / 是否支持壓縮數據解壓讀取(降低帶寬) / 是否支持縮放 等;
二.FrameBuffer與Android
當我們的程序 想要 在屏幕上顯示內容時,我們的機制是直接向FrameBuffer(后面簡稱FB)寫入內容來實現。接下來談談Android 實用FB的策略:
如果只有一個FB,當APP寫入速度>LCD顯示速度時沒問題;當APP寫入速度 <=LCD顯示速度時,會卡頓和閃爍,為了解決這個問題,一般采用2個以上FB。以2個FB為例,APP寫入FB0,LCD此時渲染FB1,FB0寫入結束后,LCD渲染FB0,此時APP寫入FB1,之后不斷循環即可。
對于Android系統來說,有很多個APP,如果這些APP同時向FB寫入內容那顯示的內容就亂了,因此 需要一個大管家來管理,這個大管家就是 SurfaceFlinger。
三.SurfaceFlinger整體框架簡圖說明
SurfaceFlinger(后 簡稱SF)主要可以做以下幾件事情:
1.給app提供buffer: 通過gralloc模塊向ashmen申請內存得到文件句柄fd,將fd通過binder機制傳遞給對應的app,app再執行mmap操作即可獲得 對應的buffer。
2.將app發來的buffer(界面數據)進行合成:根據各個界面的layer(就是Z值,由WindowManagerService來確定),把這些排序后的整體buffer傳遞給HardwareComposer(后簡稱HWC)。
3.當HWC不能處理(無HWC硬件、超出HWC層數)buffer時,使用圖形庫GL來處理。
4.SF也好,APP也好,都可以直接調用EGL層接口來實現 渲染功能。
四.Gralloc模塊
用戶空間的應用程序在使用幀緩沖區之間,首先要加載Gralloc模塊,并且獲得一個gralloc設備和一個fb設備。有了gralloc設備之后,用戶空間中的應用程序就可以申請分配一塊圖形緩沖區,并且將這塊圖形緩沖區映射到應用程序的地址空間來,以便可以向里面寫入要繪制的畫面的內容。最后,用戶空間中的應用程序就通過fb設備來將前面已經準備好了的圖形緩沖區渲染到幀緩沖區中去,即將圖形緩沖區的內容繪制到顯示屏中去。相應地,當用戶空間中的應用程序不再需要使用一塊圖形緩沖區的時候,就可以通過gralloc設備來釋放它,并且將它從地址空間中解除映射。
五.HWC疊加器
hwc模塊定義—The Hardware Composer硬件疊加器
應用把要顯示的layers交給SurfaceFlinger,SurfaceFlinger直接把這些layers交給hwc,hwc就可以在自己能力范圍內做好合成,再把合成好的結果拿去顯示。如果芯片顯示硬件模塊功能較弱,不支持某些合成場景,就會用CPU(純軟件合成)或者GPU去做。
六.OpenGL
OpenGL( Open Graphics Library 開發圖形接口)是一個跨平臺的圖形 API,用于指定 3D 圖形處理硬件中的標準軟件接口。
總結的來講,OpenGl 提供了指定圖形處理的硬件接口,我們在處理圖形的時候,只要按照它的規則來調用,就可以獲得更加高效的圖形處理方法。
通過下面這張圖可以看到,它其實是 CPU 和 GPU 圖形交互的一個橋梁,可以理解成一個庫
因為 GPU 在處理邏輯運算方面,有天然的優勢,因此,可以理解 OpenGL ES 就是一個能操作 GPU 的API。?