Android 顯示系統框架

一.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。?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/715902.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/715902.shtml
英文地址,請注明出處:http://en.pswp.cn/news/715902.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Day11:信息打點-Web應用企業產權指紋識別域名資產網絡空間威脅情報

目錄 Web信息收集工具 業務資產-應用類型分類 Web單域名獲取-接口查詢 Web子域名獲取-解析枚舉 Web架構資產-平臺指紋識別 思維導圖 章節知識點&#xff1a; Web&#xff1a;語言/CMS/中間件/數據庫/系統/WAF等 系統&#xff1a;操作系統/端口服務/網絡環境/防火墻等 應用…

dart中的事件隊列與微任務

dart在每個事件循環中&#xff0c;會先執行同步任務代碼&#xff0c;然后分別檢查兩個任務隊列&#xff1a;微任務隊列和事件隊列。dart總是先執行微任務隊列中的代碼&#xff0c;然后才是事件隊列中的代碼。當兩個隊列中的任務都執行完成后&#xff0c;線程進入休眠狀態&#…

Stable Diffusion WebUI API http://127.0.0.1:7860/docs空白

在嘗試調用Stable Diffusion WebUI API的時候&#xff0c;打開http://127.0.0.1:7860/docs遇到了以下頁面 網絡診斷是這樣的原因&#xff1a; 修bug&#xff0c;改來改去遇到了以下兩種頁面&#xff1a; 此時http://127.0.0.1:7860可以如下正常顯示&#xff1a; 查資料的時候找…

vue+springboot項目部署服務器

項目倉庫&#xff1a;vuespringboot-demo: vuespringboot增刪改查的demo (gitee.com) ①vue中修改配置 在public文件夾下新建config.json文件&#xff1a; {"serverUrl": "http://localhost:9090"//這里localhost在打包后記得修改為服務器公網ip } 然后…

[NSSCTF 2nd] web復現

1.php簽到 <?phpfunction waf($filename){$black_list array("ph", "htaccess", "ini");$ext pathinfo($filename, PATHINFO_EXTENSION);foreach ($black_list as $value) {if (stristr($ext, $value)){return false;}}return true; }if(i…

nginx 配置瀏覽器不緩存文件 每次都會從服務器 請求新的文件

目錄 解決問題方法說明 測試html環境js環境第一步然后修改內容 打開帶有js緩存的頁面強制刷新 配置nginx 每次打開頁面都會重新請求index.js 文件重啟nginx再次修改index.js 總結設置為全局 解決問題 適用于實時更新數據的&#xff0c;網頁 可以讓用戶每次都是重新請求&#x…

C語言中的套娃——函數遞歸

目錄 一、什么是遞歸 1.1.遞歸的思想 1.2.遞歸的限制條件 二、舉例體會 2.1.求n的階乘 2.2.順序打印整數的每一位 2.3.斐波那契數列 三、遞歸與迭代 一、什么是遞歸 在學習C語言的過程中&#xff0c;我們經常會跟遞歸打交道&#xff0c;什么是遞歸呢&#xff1f;它其實…

LNMP 架構

環境準備&#xff1a;lnmp 需要安裝 nginx mysql php 論壇/博客 軟件 使用LNMP架構搭建 論壇 1. 關閉防火墻和和核心防護 systemctl disable --now firewalld setenforce 0 2. 編譯安裝 nginx 安裝依賴包 yum -y install pcre-devel zlib-devel gcc gcc-c make 創建…

在Redhat 7 Linux上安裝llama.cpp [ 錯誤stdatomic.h: No such file or directory]

前期準備 在github上下載llama.cpp或克隆。 GitHub - ggerganov/llama.cpp: LLM inference in C/C ? git clone https://github.com/ggerganov/llama.cpp.gitcd llama.cpp 執行make命令編譯llama.cpp make 在huggingface里下載量化了的 gguf格式的llama2模型。 https:/…

每日一練:筆試題復盤-LeeCode原題-判斷二叉樹兩數之和-->找到滿足二叉樹兩數之和的所有路徑

用Java實現&#xff0c;給定一個二叉樹root和一個值 sum &#xff0c;找到從根節點到葉子節點的節點值之和等于 sum 的路徑。 1.該題路徑定義為從樹的根結點開始往下一直到葉子結點所經過的結點 2.葉子節點是指沒有子節點的節點 3.路徑只能從父節點到子節點&#xff0c;不能從子…

Compiling from source on UNIX(cmake doxygen ant maven ccache)

前言 源碼鏈接 cmake-3.18.0 https://cmake.org/files/v3.18/cmake-3.18.0.tar.gzdoxygen-1.10.0 https://www.doxygen.nl/files/doxygen-1.10.0.src.tar.gzapache-ant-1.10.8-bin https://archive.apache.org/dist/ant/binaries/apache-ant-1.10.8-bin.tar.gzapache-maven-3…

#WEB前端(表單)

1.實驗&#xff1a; form、input、label 登錄界面&#xff0c;表單填寫界面 2.IDE&#xff1a;VSCODE 3.記錄&#xff1a; 4.代碼&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name&q…

RedisTemplate中opaForValue.set的注意之處

問題 原本寫了一個小項目&#xff0c;想通過redis緩存實現登錄退出功能&#xff0c;結果出現了莫名奇妙的問題 代碼如下&#xff1a; 報錯&#xff1a; 經過多次調試之后我發現是opsForValue.set(key,value,expireTime)這行代碼的問題&#xff0c;沒有指定過期時間的單位&…

備戰藍橋杯---動態規劃之懸線法

Em...屬于一知道就會&#xff0c;不知道的話比較難想。 我們先看題&#xff1a; 我們不妨把1抽象成一個平面上的點&#xff0c;因此可以變成這一幅圖&#xff1a; 我們假設每一個點被向上牽拉了一根線&#xff1a; 顯然&#xff0c;每一條懸線都有可能成為邊界限制&#xff0c…

JS值和引用

在javaScript中&#xff0c;數據類型整體上可以分為兩大類&#xff1a;基本數據類型和引用數據類型 基本數據類型&#xff1a; string , symbol , number , boolean , undefined , null 引用數據類型&#xff1a; object 1.簡單值&#xff08;原始值&#xff09; 由于簡單…

職業生涯知識回顧-關于抽象類和接口的思考

抽象類和接口是兩個很容易產生疑惑的概念&#xff0c;分不清它們的使用場景&#xff0c;其實只要記住兩點就比較好理解&#xff1a; 接口是對行為的抽象抽象類是對子類有哪些屬性和行為的抽象 當你需要對一個類有哪些行為進行約束時&#xff0c;使用接口&#xff1b;需要為其…

Bulingbuling - 《歷史的教訓》 [ The Lessons of History ]

《歷史的教訓》 兩位當代最偉大思想家的著名論文集&#xff0c;匯集了 5000 多年的歷史 作者&#xff1a;威爾-杜蘭特和阿里爾-杜蘭特 The Lessons of History The celebrated collection of essays compiling over 5,000 years of history by two of the greatest thinkers …

Spring Boot項目中不使用@RequestMapping相關注解,如何動態發布自定義URL路徑

一、前言 在Spring Boot項目開發過程中&#xff0c;對于接口API發布URL訪問路徑&#xff0c;一般都是在類上標識RestController或者Controller注解&#xff0c;然后在方法上標識RequestMapping相關注解&#xff0c;比如&#xff1a;PostMapping、GetMapping注解&#xff0c;通…

Siamrpn++論文中文翻譯(詳細!)

SiamRPN: Evolution of Siamese Visual Tracking with Very Deep Networks SiamRPN&#xff1a;具有非常深度網絡的Siamese視覺跟蹤的進化 【siamrpn論文地址】 https://arxiv.org/abs/1812.11703 摘要 基于Siamese網絡的跟蹤器將跟蹤表示為目標模板和搜索區域之間的卷積特征…

【STA】多場景時序檢查學習記錄

單周期路徑 建立時間時序檢查 在時鐘的有效沿到達觸發器之前&#xff0c;數據應在一定時間內保持穩定&#xff0c;這段時間即觸發器的建立 時間。滿足建立時間要求將確保數據可靠地被捕獲到觸發器中。 建立時間檢查是從發起觸發器中時鐘的第一個有效沿到捕獲觸發器中時鐘后面…