版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
Android的Graphic系統(tǒng)分析之skiaAndroid的Graphic系統(tǒng)分析之skiaAndroid的Graphic系統(tǒng)分析之skiaxxx公司Android的Graphic系統(tǒng)分析之skia文件編號:文件日期:修訂次數(shù):第1.0次更改批準審核制定方案設計,管理制度Skia庫是一個外部庫,代碼位于external/skia/下面,生成的庫名稱是。Skia庫負責2維圖形的繪制,繪制的結(jié)果最終一般以位圖的形式存放在內(nèi)存的一塊緩沖區(qū)中。我們可以從它里面幾個比較重要的類來了解它到底完成什么功能。使用SkCanvas,可以將繪制(drawing)結(jié)果保存到一個設備如位圖(bitmap)中,這些繪制操作包含一系列幾何圖形的繪制,如繪制點、線、矩形、多邊形、橢圓和圓弧等幾何圖形。調(diào)用了skia庫的API,有的調(diào)用僅僅是對SkCanvas的簡單包裹。繪制的狀態(tài)(State)封裝在Paint類中,如繪制的線條粗細、線條顏色、區(qū)域如何填充、線條形狀等。SkBitmap是光柵位圖,它包含高度和寬度兩個整數(shù)以及格式(配置config規(guī)定),也可以通過getAddr()獲取存儲實際像素(pixel)塊的地址。一副圖形可以通過它的像素位圖來保存,也可以通過保存它的繪制過程通過SkPicture保存起來,然后寫到文件里,最后通過繪制過程恢復圖形。另外,skia也包括將YUV格式轉(zhuǎn)變?yōu)镴pg的編碼,見。Java部分通過JNI調(diào)用Skia關系如下,包括但不限于下圖中的四個類。庫鏈接到應用程序中,也鏈接到server側(cè)(主要因為layerstate管理和內(nèi)存控制塊等類),因此,其大多數(shù)類運行在應用程序所在進程空間中,它通過Binder與與進程sufaceflinger進行交互。它的代碼位于frameworks/base/libs/surfaceflinger_client下面,SurfaceComposerClient/SurfaceControl如JNI層章節(jié)所述,在創(chuàng)建SurfaceSession(Java)時,會創(chuàng)建SurfaceComposerClient對象,并將SurfaceComposerClient對象指針保存到SurfaceSession(Java)的mClient中。我們來看下創(chuàng)建SurfaceComposerClient對象時還發(fā)生了什么SurfaceComposerClient繼承自RefBase,所以在第一次初始化時,會執(zhí)行其重載的onFirstRef。在onFirstRef中,會獲取ComposerService,也就是SurfaceFlinger在client側(cè)的binder—-ISurfaceComposer,接著使用它建立clientconnection連接(實際上是分配一個用于兩側(cè)通訊的共享內(nèi)存塊),獲取ISurfaceComposerClient,最后創(chuàng)建layer_state_t,保存窗口狀態(tài),用于兩側(cè)的窗口狀態(tài)通訊。SurfaceComposerClient可以加入到列表中由Composer來維護。SurfaceControl對象指針保存在Surface(Java)中的mSurfaceControl。SurfaceControl借助于SurfaceComposerClient,實現(xiàn)對UI控件的一些操作:show/hide:顯示隱藏操作setSize/setPosition:設置大小和位置SetLayer:設置圖層freeze/unfreeze:凍結(jié)與去凍結(jié)操作,即是否更新屏幕SetAlpha:設置Alpha通道,即設置透明等級SetMatrix:設置平移矩陣setFlags:設置其它標志這些SurfaceControl類的功能實現(xiàn)僅僅是對SurfaceComposerClient的簡單封裝??梢酝ㄟ^SurfaceComposerClient的函數(shù)獲取Display的個數(shù)、高、寬、旋轉(zhuǎn)方向以及其它信息。它是通過ComposerService中的控制塊信息來實現(xiàn)的。ScreenshotClient包含屏幕截屏寬(mWidth)和高(mHeight)以及像素格式(PixelFormat),截圖數(shù)據(jù)保存在IMemoryHeap中(mHeap)。它是調(diào)用ISurfaceComposer的captureScreen函數(shù)來實現(xiàn)的。SurfaceSurface類繼承自EGLNativeBase模板類,因此它實際上一個ANativeWindow,只不過該模板給它添加了引用計數(shù)功能,并可安全地進行類型轉(zhuǎn)換。classSurface:publicEGLNativeBase<ANativeWindow,Surface,RefBase>上層應用程序各有自己的surface,因此多個surface會同時存在,這些surface在本側(cè)就是SurfaceComposerClient所代表,它們可以添加到Composer類維護的列表中。SurfaceControl會使用SurfaceClient和Surface去完成相應功能,SurfaceControl的getSurface函數(shù)會創(chuàng)建Surface,從而也會導致SurfaceClient的創(chuàng)建,進而相應的ISurfaceClientComposer等會被創(chuàng)建。ISurfaceComposerISurfaceComposer是SurfaceFlinger在client側(cè)的一個binder,提供的接口用于對整個屏幕的全局性的管理,如方向旋轉(zhuǎn)、屏幕快照、屏幕事件、屏幕更新的凍結(jié)與去凍結(jié)等。它提供的接口對應的枚舉類型有:enum{BOOT_FINISHED=IBinder::FIRST_CALL_TRANSACTION,CREATE_CONNECTION,CREATE_CLIENT_CONNECTION,GET_CBLK,OPEN_GLOBAL_TRANSACTION,CLOSE_GLOBAL_TRANSACTION,SET_ORIENTATION,FREEZE_DISPLAY,UNFREEZE_DISPLAY,SIGNAL,CAPTURE_SCREEN,TURN_ELECTRON_BEAM_OFF,TURN_ELECTRON_BEAM_ON};它是通過Binder進行IPC通訊的接口,BpSurfaceComposer是client一側(cè),BnSurfaceComposer是service一側(cè)。它們都繼承自各自的模板類BpInterface和BnInterface,這兩個模板類完成雙重繼承的功能,一個繼承IPC通訊的API接口,一個繼承Binder功能。RefBase用于索引計數(shù),類IInterface和ISurface定義了IPC通訊的接口API,IBinder/BBinder使雙方具備Binder通訊功能。其中CREATE_CONNECTION和REATE_CLIENT_CONNECTION打開關閉一個Transaction,在打開和關閉的過程中,可以設置狀態(tài),實現(xiàn)窗口管理。狀態(tài)變化更改是在一個事務(transaction)中進行的。其類繼承關系如下:根據(jù)Binder繼承關系規(guī)則,client側(cè)的接口調(diào)用通過最終是由Bn側(cè)的子類完成。我們就可以知道它的它動態(tài)的調(diào)用關系如下,左側(cè)的調(diào)用者一般可以通過指向ISurfaceComposer的智能指針將操作將調(diào)用到SurfaceFlinger類的成員函數(shù)。ComposerService對IsurfaceComposer進行了包裹,使用它的getComposerService函數(shù)可以獲取IsurfaceComposer。另外,ComposerService還包含了surface_flinger_cblk_t控制塊信息,該內(nèi)存塊位于Ashem內(nèi)存上,由SurfaceFlinger申請,并依據(jù)display硬件信息填充字段值。client端程序通過讀取它,即可得到各display的信息。structdisplay_cblk_t{Noneofthisissupportedyet).constGraphicPlane&plane(graphicPlane(dpy));constDisplayHardware&hw=();constuint32_tw=();constuint32_th=();constuint32_tf=();();”“InitializinggraphicsH/W…”);Noneofthisissupportedyet).constGraphicPlane&plane(graphicPlane(dpy));constDisplayHardware&hw=();constuint32_tw=();constuint32_th=();constuint32_tf=();();new(ctrlblk)SharedClient;SharedClient:representsaclientwithseveralstacksSharedBufferStack:representsastackofbuffersSharedBufferClient:manipulatestheSharedBufferStackfromtheclientsideSharedBufferServer:manipulatestheSharedBufferStackfromtheserversideBufferscanbedequeueduntiltherearenoneavailable,theycanbelockedunlesstheyareinusebytheserver,whichisonlythecaseforthelastdequeue-ablebuffer.Whenthesevariousconditionsarenotmet,thecallerwaitsuntiltheconditionismet.”我們先來看一下比較重要的一個類SharedBufferStackclassSharedBufferStack{……//省略部分代碼structSmallRect{//定義了一個矩形:左上角和右下角的坐標uint16_tl,t,r,b;};//定義了一個平面區(qū)域,包含了若干(不超過5個)矩形structFlatRegion{//52bytes=4*(1+2*N)staticconstunsignedintNUM_RECT_MAX=5;uint32_tcount;SmallRectrects[NUM_RECT_MAX];};structBufferData{//64BytesFlatRegiondirtyRegion;//5個矩形區(qū)域SmallRectcrop;//1個剪切矩形區(qū)uint8_ttransform;uint8_treserved[3];};……//省略部分代碼//雙方同步//theseattributesarepartoftheconditions/updatesvolatileint32_thead;//server’scurrentfrontbuffervolatileint32_tavailable;//numberofdequeue-ablebuffersvolatileint32_tqueued;//numberofbufferswaitingforpostvolatileint32_treserved1;volatilestatus_tstatus;//surface’sstatuscode//notpartoftheconditionsvolatileint32_treallocMask;volatileint8_tindex[NUM_BUFFER_MAX];int32_tidentity;//surface’sidentity(const)int32_ttoken;//surface’stoken(fordebugging)Statisticsstats;int8_theadBuf;//lastretiredbufferuint8_treservedBytes[3];int32_treserved;BufferDatabuffers[NUM_BUFFER_MAX];//16個數(shù)組元素};可見SharedBufferStack里面定義了幾個結(jié)構(gòu)體,用于保存矩形區(qū)域。如果我們把BufferData所保存的區(qū)域稱為一塊區(qū)域的話,那么SharedBufferStack里可以包含多達16塊區(qū)域。在Android系統(tǒng)里,一個Surface對應一個SharedBufferStack。而SharedClient則包含了31個SharedBufferStack://32KBmax
classShared
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五融創(chuàng)集團房地產(chǎn)合同效力認定及爭議解決指南3篇
- 電力系統(tǒng)的數(shù)字化與智能電網(wǎng)的融合
- 2025年中國節(jié)能環(huán)保行業(yè)政策、市場規(guī)模及投資前景研究報告(智研咨詢發(fā)布)
- 沉迷網(wǎng)絡危害身心健康教育
- 生態(tài)工程與可持續(xù)發(fā)展
- 現(xiàn)代服務業(yè)的國際化趨勢與挑戰(zhàn)
- 現(xiàn)代職場中的心理健康與情緒干預
- 植保技術教育培養(yǎng)新型農(nóng)民的必由之路
- 電商物流成本降低與供應鏈優(yōu)化實踐
- 2025年長春道路貨物運輸從業(yè)資格證考試
- 戰(zhàn)略管理與倫理
- 如何構(gòu)建高效課堂課件
- 虛擬化與云計算技術應用實踐項目化教程 教案全套 第1-14周 虛擬化與云計算導論-騰訊云服務
- 甲基丙烯酸甲酯生產(chǎn)工藝畢業(yè)設計設備選型與布置模板
- 徐金桂行政法與行政訴訟法新講義
- 瀝青拌合設備結(jié)構(gòu)認知
- 2023年北京高考政治真題試題及答案
- 復旦中華傳統(tǒng)體育課程講義05木蘭拳基本技術
- 北師大版五年級上冊數(shù)學教學課件第5課時 人民幣兌換
- 工程回訪記錄單
- 住房公積金投訴申請書
評論
0/150
提交評論