Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> chromium for android v34 2dcanvas硬件渲染實現分析

chromium for android v34 2dcanvas硬件渲染實現分析

編輯:關於Android編程

這篇接著上一篇2dcanvas硬件繪制,分析保存繪制結果的texture被合成到on screen framebuffer上的過程。

1.webkit為canvas元素對應的render樹節點RenderHTMLCanvas,
創建RenderLayer的過程如下:

\

RenderLayerModelObject::createLayer()調用
RenderLayer::insertOnlyThisLayer()將創建完
的RenderLayer加入到renderlayer tree中。<喎?/kf/ware/vc/" target="_blank" class="keylink">vcD4KPHA+PGJyPgoyLkNhbnZhczJETGF5ZXJCcmlkZ2Ww/LqsV2ViRXh0ZXJuYWxUZXh0dXJlTGF5ZXJJbXBsyrXA/aOsPGJyPgpXZWJFeHRlcm5hbFRleHR1cmVMYXllckltcGy1xLm51Oy6r8r91tC0tL2otcRUZXh0dXJlTGF5ZXI8YnI+CrG7t+LXsNTaV2ViRXh0ZXJuYWxUZXh0dXJlTGF5ZXJJbXBs1tCw/LqstcRXZWJMYXllckltcGzKtcD91tChozxicj4K1eLA77S0vai1xFdlYkxheWVySW1wbLnYwaq1vWNhbnZhc73ateO21NOmtcRSZW5kZXJMYXllcsnPtcS5/bPMyOfPwqO6PGJyPgo8L3A+CjxwPjxpbWcgc3JjPQ=="/uploadfile/Collfiles/20141011/201410110833405.jpg" alt="\">

GraphicsLayer::setupContentsLayer()中將WebExternalTextureLayerImpl包含的
WebLayerImpl實例作為子節點關聯到GraphicsLayer
包含的WebContentLayer包含的WebLayerImpl實例上。
這樣,Canvas2DLayerBridge包含WebExternalTextureLayerImpl實例中創建的TextureLayer
就被關聯到了renderlayer tree間接包含的cc模塊中的layer tree上。
以上兩個過程涉及的類圖:

\

chromium for android硬件渲染流程全解析(render進程)可知,這顆layer tree最終會被傳給cc::LayerTreeHost持有。
在頁面更新時,會遍歷這顆layer tree依次調用各個節點的Update()。


3.canvas元素對應renderlayer間接包含的texturelayer得到保存繪制結果信息的mailbox的過程。


SkBitmapDevice::onAccessBitmap()返回的bitmap是在
SkGpuDevice的構造函數中創建的,這個bitmap由以下語句創建:
SkBitmapDevice(make_bitmap(context, renderTarget));
所以,這個bitmap的內容就是保存硬件繪制結果的目標texture的內容。
SkSurface_Gpu::onNewImageSnapshot()以bitmap為參數創建了SkImage.
Canvas2DLayerBridge::prepareMailbox()將這個SkImage封裝進mailboxinfo.
將mailboxinfo送出去之前,Canvas2DLayerBridge::prepareMailbox()調用了
WebGraphicsContext3D::produceTextureCHROMIUM()。最終調用到
GLES2DecoderImpl::DoProduceTextureCHROMIUM().
WebExternalTextureLayerImpl::PrepareTextureMailbox()
將blink::WebExternalTextureMailbox封裝成cc::TextureMailbox返回給
TextureLayer。


4.Browser進程消耗保存繪制結果的目標texture的過程

TextureLayer::Update()只做一件事就是得到包含繪制結果的texture,對於
canvas元素對應的texture,得到的是封裝了繪制結果的mailbox.
TextureLayer::PushPropertiesTo()中將這個mailbox傳給了TextureLayerImpl.
TextureLayerImpl::WillDraw()中調用
ResourceProvider::CreateResourceFromTextureMailbox().將mailbox由保存在了
ResourceProvider創建的Resource中。
Browser進程中執行的合成過程會調用到,
GLRenderer::DrawRenderPassQuad()
ScopedReadLockGL::ScopedReadLockGL()調用
ResourceProvider::LockForRead()
ResourceProvider::LockForRead()中會調用
ConsumeTextureCHROMIUM()最終調用到
GLES2DecoderImpl::DoProduceTextureCHROMIUM().
以上過程,以前的文章中分析過,不細分析了。

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved