HwUI繪制
硬件加速繪制流程
每次硬件加速繪制都會調用Surface.unlockCanvasAndPost
Surface.unlockCanvasAndPost()
-> HwuiContext::unlockAndPost()
->HardwareRenderer::syncAndDraw()
->RenderProxy.cpp ::syncAndDrawFrame()
-> DrawFrameTask::drawFrame()
-> DrawFrameTask::run() 渲染線程開始執(zhí)行繪制操作
-> DrawFrameTask::syncFrameState 與主線程同步數(shù)據(jù)腰涧,這個階段在用AutoMutex加鎖糠亩,主線程等待
->CanvasContext::prepareTree
-> CanvasContext::draw 通過調用OpenGLPipeline方法開始繪制
->SkSurface::flushAndSubmit()
->SkiaOpenGLPipeline::swapBuffers (CanvasContext::draw()中調用)交換buffer 到SurfaceFlinger
->eglSwapBuffersWithDamageKHR()該方法執(zhí)行完成后,將回調ANativeWindow::queueBuffer進一步回調到Surface::hook_queueBuffer() 到現(xiàn)在應用進程繪制完成
SurfaceFlinger 合成
- handleMessageInvalidate
-> handlePageFlip獲取Predictor queue 進來的Buffer鸭你,更新可見臟區(qū) mVisibleRegionsDirty
-> acquireBuffer拿到Buffer后,將Buffer保存在mSlots[item->mSlot].mGraphicBuffer中霉猛。同時更新mFrameNumber和mFence - onMessageRefresh
- prepareFrame
和Hwbinder 通信選擇合成策略,需要顯示的數(shù)據(jù)已經送到HWC,且每一層Layer的合成方式已經確定刺下,Buffer也只是將Buffer的handle傳給底層的HWC姥份,并沒有傳Buffer里面的內容,這里創(chuàng)建底層HWCLayer - finishFrame
finishFrame 主要處理需要GPU合成的layer郭脂,將Client端的Layer渲染到FBTarget(GPU 作為client dequeueBuffer進行渲染,然后通過queueBuffer到BufferQueue,再acquireBuffer 澈歉,將各layer 合成后的數(shù)據(jù)保存在FBTarget展鸡,通過setClientTarget給HWC設置Client端的合成結果,傳給底層進行顯示) - postFramebuffer
告訴HWC開始做最后的合成了埃难,包括client和device合成 - postComposition
到此一次合成處理完成莹弊,REFRESH處理完成涤久。下一個Vsync到來時,新的一次合成
- prepareFrame