美文网首页
绘制相关systrace

绘制相关systrace

作者: 米豆同学 | 来源:发表于2022-08-08 11:12 被阅读0次

HwUI绘制

image.png

硬件加速绘制流程

每次硬件加速绘制都会调用Surface.unlockCanvasAndPost
Surface.unlockCanvasAndPost()
-> HwuiContext::unlockAndPost()
->HardwareRenderer::syncAndDraw()
->RenderProxy.cpp ::syncAndDrawFrame()
-> DrawFrameTask::drawFrame()
-> DrawFrameTask::run() \color{red}{(1)打印trace : DrawFrames } \color{red}{vsyncId} 渲染线程开始执行绘制操作
-> DrawFrameTask::syncFrameState \color{red}{(2)打印trace : syncFrameState }与主线程同步数据,这个阶段在用AutoMutex加锁,主线程等待
->CanvasContext::prepareTree \color{red}{(3)打印trace }
-> CanvasContext::draw 通过调用OpenGLPipeline方法开始绘制
->SkSurface::flushAndSubmit() \color{red}{(4)提交绘制请求到GPU}
->SkiaOpenGLPipeline::swapBuffers (CanvasContext::draw()中调用)交换buffer 到SurfaceFlinger\color{red}{(5)trace:eglSwapBuffersWithDamageKHR }
->eglSwapBuffersWithDamageKHR()该方法执行完成后,将回调ANativeWindow::queueBuffer进一步回调到Surface::hook_queueBuffer()\color{red}{(6)trace:queueBuffer} 到现在应用进程绘制完成

SurfaceFlinger 合成

image.png
  • handleMessageInvalidate
    -> handlePageFlip获取Predictor queue 进来的Buffer,更新可见脏区 mVisibleRegionsDirty
    -> acquireBuffer拿到Buffer后,将Buffer保存在mSlots[item->mSlot].mGraphicBuffer中。同时更新mFrameNumber和mFence
  • onMessageRefresh
    1. prepareFrame
      和Hwbinder 通信选择合成策略,需要显示的数据已经送到HWC,且每一层Layer的合成方式已经确定,Buffer也只是将Buffer的handle传给底层的HWC,并没有传Buffer里面的内容,这里创建底层HWCLayer
    2. finishFrame
      finishFrame 主要处理需要GPU合成的layer,将Client端的Layer渲染到FBTarget(GPU 作为client dequeueBuffer进行渲染,然后通过queueBuffer到BufferQueue,再acquireBuffer ,将各layer 合成后的数据保存在FBTarget,通过setClientTarget给HWC设置Client端的合成结果,传给底层进行显示)
    3. postFramebuffer
      告诉HWC开始做最后的合成了,包括client和device合成
    4. postComposition
      到此一次合成处理完成,REFRESH处理完成。下一个Vsync到来时,新的一次合成

相关文章

网友评论

      本文标题:绘制相关systrace

      本文链接:https://www.haomeiwen.com/subject/bvlwwrtx.html