站在老罗的肩膀上:https://blog.csdn.net/luoshengyang/article/details/50995124
CC模块内部的状态机一旦检测到网页的Layer Tree创建和初始化完毕,就会通知调度器触发一个创建绘图表面的操作。CC模块在为网页创建绘图表面的过程中,也有伴随着网页分块管理器、资源池和光栅化工作者线程池等基础设施的创建。一旦这些基础设施准备完毕,网页才能开始进行绘制
当网页的Graphics Layer Tree的根节点创建出来之后,Blink就会通知Chromium的Content层初始化一个CC Layer Tree,如下所示:
blink::WebLayerTreeView* RenderWidget::InitializeLayerTreeView() {
DCHECK(!host_closing_);
layer_tree_view_ = std::make_unique<LayerTreeView>(
this, compositor_deps_->GetCompositorMainThreadTaskRunner(),
compositor_deps_->GetCompositorImplThreadTaskRunner(),
compositor_deps_->GetTaskGraphRunner(),
compositor_deps_->GetWebMainThreadScheduler());
layer_tree_view_->Initialize(
GenerateLayerTreeSettings(compositor_deps_, for_oopif_,
screen_info_.rect.size(),
screen_info_.device_scale_factor),
compositor_deps_->CreateUkmRecorderFactory());
...
StartCompositor();
...
return layer_tree_view_.get();
}
StartCompositror会PostTask告诉Compositor线程,CCLayer已经创建完毕,可以开始compositing
void ProxyMain::SetVisible(bool visible) {
TRACE_EVENT1("cc", "ProxyMain::SetVisible", "visible", visible);
ImplThreadTaskRunner()->PostTask(
FROM_HERE, base::BindOnce(&ProxyImpl::SetVisibleOnImpl,
base::Unretained(proxy_impl_.get()), visible));
}
ProxyMain::SetVisible向Compositor线程的消息队列发送一个Task。这个Task绑定了ProxyImpl::SetVisibleOnImpl,接下来就会在Compositor线程中执行。ProxyImpl::SetVisibleOnImpl实现如下所示:
void ProxyImpl::SetVisibleOnImpl(bool visible) {
TRACE_EVENT1("cc", "ProxyImpl::SetVisibleOnImplThread", "visible", visible);
DCHECK(IsImplThread());
host_impl_->SetVisible(visible);
scheduler_->SetVisible(visible);
}
然后启调度器, 打开状态机
void ProxyImpl::SetVisibleOnImpl(bool visible) {
TRACE_EVENT1("cc", "ProxyImpl::SetVisibleOnImplThread", "visible", visible);
DCHECK(IsImplThread());
host_impl_->SetVisible(visible);
scheduler_->SetVisible(visible);
}
void Scheduler::SetVisible(bool visible) {
// Turn on state machine
state_machine_.SetVisible(visible);
UpdateCompositorTim