欢迎来到天天文库
浏览记录
ID:39547213
大小:606.50 KB
页数:47页
时间:2019-07-06
《Chromium网页渲染调度器(Scheduler)实现分析》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、Chromium网页渲染调度器(Scheduler)实现分析在采用线程化渲染方式渲染网页时,Chromium依赖一个调度器协调Main线程和Compositor线程的执行,同时也通过这个调度器决定它们什么时候该执行什么操作。调度器将Main线程和Compositor线程的当前状态记录在一个状态机中,然后通过这个状态机决定下一个要执行的操作。这个操作在满足当前设置条件下是最优的,因此可以使网页渲染更快更流畅。本文接下来就分析Chromium网页调度器的实现。调度器实现在Chromium的CC模块中,并且运行在Composito
2、r线程中。Compositor线程的职责是将网页的内容渲染出来。从这个角度看,调度器只不过是在调度Compositor线程的执行。不过由于要渲染的网页内容是由Main线程提供给Compositor线程的,因此调度器也会在必要的时候调度Main线程执行,使得它可以提供最新的网页内容给Compositor线程渲染。网页是一帧一帧地渲染出来的。从前面这个系列的文章我们学习到,Android应用程序UI的每一帧的最佳渲染时机是下一个屏幕VSync信号到来时。Chromium也不例外,它在渲染网页的时候,也是利用了屏幕的VSync信号
3、。这一点在调度器的时间轴中可以得到体现,如图1所示:从图1可以看到,调度器并没有严格在VSync到来时就去渲染网页的下一帧,而是为网页的下一帧渲染时机设置了一个Deadline。在Deadline到来前,调度器可以调度执行其它的渲染操作。在继续分析上述的Deadline机制之前,我们要先搞清楚网页的一帧渲染涉及到哪些操作。这些操作如图2所示:图2的完整分析可以参考前面一文。我们前面说的Deadline,是针对第6个操作ACTION_DRAW_AND_SWAP_FORCED而言的。也就是说,当VSync信号到来时,ACTION
4、_DRAW_AND_SWAP_FORCED操作最迟必须在设置的Deadline到来时执行。这个Deadline是怎么计算出来的呢?我们先来看网页的渲染过程。首先是Render进程进行渲染,然后交给Browser进程进行合成。因此,网页的渲染过程可以看作由两部分时间组成:estimated_draw_duration+estimated_browser_composite_time。其中,estimated_draw_duration表示Render进程的渲染时间,estimated_browser_composite_tim
5、e表示Browser进程的合成时间。假设下一个VSync到来的时间为frame_time,VSync信号时间周期为interval,那么就可以计算出Deadline=frame_time+(interval-estimated_draw_duration-estimated_browser_composite_time)。剩下来的时间区间[frame_time,deadline)可以用做其它事情,例如执行图2所示的第2个操作ACTION_SEND_BEGIN_MAIN_FRAME,也就是通知Main线程对CCLayerTre
6、e进行绘制。时间区间[frame_time,deadline)称为BEGIN_IMPL_FRAME时间。在BEGIN_IMPL_FRAME时间内,存在四个BeginImplFrameState状态,如下所示:[cpp]viewplaincopy在CODE上查看代码片派生到我的代码片classCC_EXPORTSchedulerStateMachine{public:......//Note:BeginImplFrameStatewillalwayscyclethroughallthestatesin//order.Wheth
7、erornotitactuallywaitsordraws,itwillatleasttryto//waitinBEGIN_IMPL_FRAME_STATE_INSIDE_BEGIN_FRAMEandtrytodrawin//BEGIN_IMPL_FRAME_STATE_INSIDE_DEADLINEenumBeginImplFrameState{BEGIN_IMPL_FRAME_STATE_IDLE,BEGIN_IMPL_FRAME_STATE_BEGIN_FRAME_STARTING,BEGIN_IMPL_FRAME_S
8、TATE_INSIDE_BEGIN_FRAME,BEGIN_IMPL_FRAME_STATE_INSIDE_DEADLINE,};......protected:......BeginImplFrameStatebegin_impl_frame_state_;......};这个状态定义在
此文档下载收益归作者所有