搭建婚戀系統原始碼,軟體是怎麼顯示在裝置上的

雲豹科技阿星發表於2021-12-02

一、概要

婚戀系統原始碼顯示的過程:婚戀系統原始碼呼叫SurfaceFlinger服務把經過測量、佈局和繪製後的Surface渲染到顯示螢幕上。

SurfaceFlinger:android系統服務,負責管理android系統的幀緩衝區,即顯示螢幕。 Surface:android應用的每個視窗對應一個畫布(Canvas),即Surface,可以理解為android婚戀系統原始碼的一個視窗。

婚戀系統原始碼的顯示過程包含了兩個部分(應用側繪製、系統側渲染)、兩個機制(程式間通訊機制、顯示重新整理機制)。

二、應用側繪製

一個android應用程式視窗裡麵包含了很多UI元素,這些元素是以樹形結構來組織的,即它們存在著父子關係,其中,子UI元素位於父UI元素裡面。

因此,在繪製一個婚戀系統原始碼視窗的UI之前,首先要確定裡面的各個子UI元素在父UI元素裡面的大小和位置。確定各個子UI元素在父UI元素裡面的大小以及位置的過程有稱為測量過程和佈局過程。因此,婚戀系統原始碼視窗的UI渲染過程可以分為測量、佈局和繪製三個階段。

測量:遞迴(深度優先)確定所有檢視的大小(寬、高) 佈局:遞迴(深度優先)確定所有檢視的位置(左上角座標) 繪製:在畫布canvas繪製應用程式視窗的所有檢視

三、系統側渲染

android應用程式在圖形緩衝區中繪製好View層次結構後,這個圖形緩衝區會被交給SurfaceFlinger服務,而SurfaceFlinger服務再使用OpenGL圖形庫API來將這個圖形緩衝區渲染到硬體幀緩衝區中。

android影像顯示的底層原理:

CPU:作用是計算圖片的形狀和文字的紋體 GPU:功能是渲染影像的顏色 Display:螢幕顯示影像 Vsync:垂直同步訊號,顯示卡輸出頻率與螢幕重新整理頻率同步的訊號 android影像在繪製的時候,首先是CPU計算出影像形狀,計算完成CPU會將影像交給GPU渲染出顏色,如果這一切都能夠在16ms內完成,那麼在下一個VSync出現時,就能顯示剛剛渲染出來的那一幀影像了。但是如果CPU和GPU處理一幀影像時間超過16ms,那麼這幀影像只能等到第二個VSync出現時才能刷出螢幕,呈現給使用者了,這就意味著使用者在32ms內所看到的是同一幀影像,這就是所謂的掉幀,也就是卡頓了。

四、程式間通訊機制

婚戀系統原始碼為了能夠將自己的UI繪製在系統的幀緩衝區上,它們就必須要與Surface服務進行通訊。 android應用程式與SurfaceFlinger服務是執行在不同的程式中的,因此,它們採用某種程式間通訊機制來進行通訊。由於婚戀系統原始碼在通知SurfaceFlinger服務來繪製自己的UI的時候,需要將UI資料傳遞給SurfaceFlinger服務,例如,要繪製UI的區域、位置等資訊。一個android應用程式可能會有很多個視窗,而每一個視窗都有自己的UI資料,因此,android系統的匿名共享記憶體機制就派上用場了。

每一個android應用程式與SurfaceFlinger服務之間,都會通過一塊匿名共享記憶體來傳遞UI資料。但是單純的匿名共享記憶體在傳遞多個視窗資料時缺乏有效的管理,所以匿名共享記憶體就被抽象為一個更上流的資料結構SharedClient。

在每個SharedClient中,最多有31個SharedBufferStack,每個SharedBufferStack都對應一個Surface,即一個視窗。一個SharedClient對應一個android應用程式,而一個android應用程式可能包含多個視窗,但至多可以包含31個視窗。每個SharedBufferStack中又包含了N個緩衝區(android4.1以下,N = 2,4.1以上,N = 3),即顯示重新整理機制中即將提到的雙緩衝和三緩衝技術。

五、顯示重新整理機制

一般婚戀系統原始碼在繪製UI的時候,都會採用一種稱為“雙緩衝”的技術。雙緩衝意味著要使用兩個緩衝區,其中一個被稱為Front Buffer,另外一個被稱為Back Buffer。UI總是先在Back Buffer中繪製,然後再和Front Buffer交換,渲染到顯示裝置中。在android4.1中引入了VSync,這類似於時鐘中斷,每收到VSync中斷,CPU就開始處理各幀資料。

宣告:本文由雲豹科技轉發自Android_XG部落格,如有侵權請聯絡作者刪除

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69982461/viewspace-2845466/,如需轉載,請註明出處,否則將追究法律責任。

相關文章