一 综述
在上一篇(五)中,分析CompositedLayer的创建过程,在blink中每一个CompositedLayer都会存在一个后端存储,它就是GraphicsLayer,GraphicsLayer存储了网页上LayoutObject的paint方法中的绘制命令,当网页(失效区域)中所有LayoutObject的绘制命令都收集完成后,cc就会执行各个layer的合成操作,然后会交给GPU进行实际绘制操作。
二 GraphicsLayer创建流程
GraphicsLayer是在Layout过程中创建的,当发现LayoutLayer需要被Composited时,它就会创建一个CompositedLayer,同时也会创建GraphicsLayer。
其调用栈如下,Call Stack:
#0 blink::GraphicsLayer::GraphicsLayer(blink::GraphicsLayerClient * client)
#1 blink::GraphicsLayerFactoryChromium::createGraphicsLayer(
blink::GraphicsLayerClient * client)
#2 blink::GraphicsLayer::create(blink::GraphicsLayerFactory * factory,
blink::GraphicsLayerClient * client)
#3 blink::CompositedDeprecatedPaintLayerMapping::createGraphicsLayer(unsigned __int64 reasons)
#4 blink::CompositedDeprecatedPaintLayerMapping::createPrimaryGraphicsLayer()
#5 blink::CompositedDeprecatedPaintLayerMapping::CompositedDeprecatedPaintLayerMapping(blink::DeprecatedPaintLayer & layer)
#6 blink::DeprecatedPaintLayer::ensureCompositedDeprecatedPaintLayerMapping()
#7 blink::DeprecatedPaintLayerCompositor::allocateOrClearCompositedDeprecatedPaintLayerMapping(blink::DeprecatedPaintLayer * layer, blink::CompositingStateTransitionType compositedLayerUpdate)
#8 blink::CompositingLayerAssigner::assignLayersToBackingsInternal(blink::DeprecatedPaintLayer * layer, blink::CompositingLayerAssigner::SquashingState & squashingState, WTF::Vector<blink::DeprecatedPaintLayer *,0,WTF::DefaultAllocator> & layersNeedingPaintInvalidation)
#9 blink::CompositingLayerAssigner::assignLayersToBackingsInternal(blink::DeprecatedPaintLayer * layer, blink::CompositingLayerAssigner::SquashingState & squashingState, WTF::Vector<blink::DeprecatedPaintLayer *,0,WTF::DefaultAllocator> & layersNeedingPaintInvalidation)
#10 blink::CompositingLayerAssigner::assignLayersToBackingsInternal(blink::DeprecatedPaintLayer * layer, blink::CompositingLayerAssigner::SquashingState & squashingState, WTF::Vector<blink::DeprecatedPaintLayer *,0,WTF::DefaultAllocator> & layersNeedingPaintInvalidation)
#11 blink::CompositingLayerAssigner::assign(blink::DeprecatedPaintLayer * updateRoot, WTF::Vector<blink::DeprecatedPaintLayer *,
0,WTF::DefaultAllocator> & layersNeedingPaintInvalidation)
#12 blink::DeprecatedPaintLayerCompositor::updateIfNeeded()
#13 blink::DeprecatedPaintLayerCompositor::updateIfNeededRecursive()
#14 blink::FrameView::updateLayoutAndStyleForPaintingInternal()
#15 blink::FrameView::updateLayoutAndStyleForPainting()
#16 blink::PageAnimator::updateLayoutAndStyleForPainting(blink::LocalFrame * rootFrame)
#17 blink::PageWidgetDelegate::layout(blink::Page & page, blink::LocalFrame & root)
#18 blink::WebViewImpl::layout()
#19 content::RenderWidgetCompositor::Layout()
#20 cc::LayerTreeHost::Layout()
#21 cc::ThreadProxy::BeginMainFrame()
三 GraphicsLayer Tree创建
由多个GraphicsLayer也会形成一颗Tree,下面还是以之前的测试页面来看看GraphicsLayer Tree到底是什么样的,测试页面如图1所示,GraphicsLayer Tree如图2所示。
图1 测试页面
图2 GraphicsLayer Tree