blink渲染知识14 - 阶段总结

总结一下执行流程。


4.5.0上,ui线程,impl线程就是执行childcompositorui线程。


1.ui 线程onDraw=>awContents.onDraw会调用chilidcompositor来使用其activelayer tree合成一个compositorframe,也就是调用BrowserViewRender::onDrawHW.并向webcore线程申请beginframe.然后向系统申请一次drawGl操作。申请parentcompositor执行合成操作。


2.系统render线程,调用drawGL操作,执行HardWareRender::commitFrame.把之前的childcompositor合成的compositorframe commitparentcompositor自己维护的layertree里面。


3.系统render线程,执行drawGl操作。调用parentcompositor 执行合成操作。也就是hardwareRender::drawGL函数。并不需要调用childcompositor的合成,也就是说不许要调用BrowserViewRender::onDrawHW


5.webcore线程的beginFrame执行paint操作后,也就是beginframe操作后,需要把绘制完成的layertree commitimplthreadpendinglayer tree. Commit操作在impl/ui线程执行,webcore线程需要等待commit完成。


ui线程有一个messagepump, message loop, 会执行post过来的任务。并且其中一个task是一个timer,定期检查是否有需要commit的操作。如果有就执行commit操作,同步renderlayers内容。将webcore线程的layertree copyimpl线程的pendinglayer tree里面。


6.commit完成后,impl线程将webcore线程解锁。接着会创建一些raster任务,让一些工作线程执行raster任务。当raster执行完成后。impl线程得到通知,接着把被raster过的pendingtree 激活成activetree。激活后,触发一个redraw操作。因为有了新的activetree了。


7.又回到step1: ui线程的onDraw里执行draw操作,其实就是使用目前的activetree,执行合成,生成compositor frame.主要涉及到准备一些renderpass数据。


8.ui线程合成了compositorframe后执行swapbufer,就是把结果存起来,并向系统requestGL操作。


9.又回到step2: 系统render线程,执行drawGL操作,进行commit操作,把之前childcompositor合成的结果取出来,并挂载到parentcompositorlayertree上。


10.系统render线程执行drawGL操作,进行合成操作,把之前的合成结果中的renderpass取出来,把其中的quard绘制到当前的glcontext. 使用glcommand buffer. 如果要swap,也是使用glflush命令。


看着稍微有些乱:主要是因为涉及到三个线程,这三个线程的任务:

1.webcore线程:处理beginFrame任务,也就是生成renderlayer,并paint他们。


2.impl也就是ui线程,任务较多:

a. 执行commit操作,也就是从webcore线程把layertree copy到自己的pendinglayer tree.

b. 创建raster任务并分配给raster线程

c. 执行active操作,把被rasterpendinglayer tree激活成activelayer tree.

d. 响应系统的onDraw,使用activelayer tree合成出一份compositorframe. 以备parentcompositor 使用.并向webcore线程发送beginFrame的申请。也就是申请另一次paint.

e. 向系统render申请drawGL操作。


3.系统render线程任务:

drawGL是系统render线程进入chromium的唯一入口点,完成如下任务:

a. impl线程生成的compositorframe执行commit操作挂载到parentcompositor使用的layertree上成为一个子layer.

b. 遍历parentcompositorlayertree,调用drawLayer,其实就是处理compositorframe中的rendrepass数据。并生成gl命令在glcontext下绘制并合成。




目前有2点还没仔细看:

1.render 线程的生成的gl命令如何执行的,如何使用glcommand buffer的,glcommand 是不是也是执行在render线程?还是有专门的gpu线程?

2.raster操作具体是干了什么?我们知道impl线程合成compositorframe使用的activelayer tree是被raster线程raster过的,那么raster究竟干了什么?


一个大概的顺序:

1.webcore 线程paint

2.imipl线程commitpendinglayer tree

3.impl线程启动raster任务,raster pending layer tree

4.impl线程activepending layer tree

5.impl线程使用activelayer tree合成compositorframe(含有renderpass)

6.render线程执行commit,compositorframe挂载给parentcompositor layer tree

7.render线程合成,消耗compositorframe中的renderpass数据,生成gl命令。








  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值