这篇接着上一篇2dcanvas硬件绘制,分析保存绘制结果的texture被合成到on screen framebuffer上的过程。

1.webkit为canvas元素相应的render树节点RenderHTMLCanvas,

创建RenderLayer的步骤例如以下:

RenderLayerModelObject::createLayer()调用

RenderLayer::insertOnlyThisLayer()将创建完

的RenderLayer增加到renderlayer tree中。

2.Canvas2DLayerBridge包括WebExternalTextureLayerImpl实例,

WebExternalTextureLayerImpl的构造函数中创建的TextureLayer

被封装在WebExternalTextureLayerImpl中包括的WebLayerImpl实例中。

这里创建的WebLayerImpl关联到canvas节点相应的RenderLayer上的步骤例如以下:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvamF5bGluemhvdQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">

GraphicsLayer::setupContentsLayer()中将WebExternalTextureLayerImpl包括的

WebLayerImpl实例作为子节点关联到GraphicsLayer

包括的WebContentLayer包括的WebLayerImpl实例上。

这样,Canvas2DLayerBridge包括WebExternalTextureLayerImpl实例中创建的TextureLayer

就被关联到了renderlayer tree间接包括的cc模块中的layer tree上。

以上两个过程涉及的类图:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvamF5bGluemhvdQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">

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::DoConsumeTextureCHROMIUM().

以上过程,曾经的文章中分析过,不细分析了。

chromium for android v34 2dcanvas硬件渲染实现分析的更多相关文章

  1. Chromium Graphics: Android L平台上WebView的变化及其对浏览器厂商的影响分析

    原创文章.转载请以链接形式注明原始出处为http://blog.csdn.net/hongbomin/article/details/40799167. 摘要:Google近期公布的Android L ...

  2. 理解WebKit和Chromium: 调试Android系统上的Chromium

    转载请注明原文地址:http://blog.csdn.net/milado_nju 1. Android上的调试技术 在Android系统上,开发人员能够使用两种不同的语言来开发应用程序,一种是Jav ...

  3. Chromium on Android: Android在系统Chromium为了实现主消息循环分析

    总结:刚开始接触一个Chromium on Android时间.很好奇Chromium主消息循环是如何整合Android应用. 为Android计划,一旦启动,主线程将具有Java消息层循环处理系统事 ...

  4. Android系统修改硬件设备访问权限

    Android系统修改硬件设备访问权限 在硬件抽象层模块文件(so)文件中,提供的函数调用open函数来打开设备文件,比如/dev/gpio,如果不修改设备文件/dev/gpio的访问权限,那么应用程 ...

  5. 把Android原生的View渲染到OpenGL Texture

    http://blog.csdn.net/u010949962/article/details/41865777 最近要把Android 原生的View渲染到OpenGL GLSurfaceView中 ...

  6. 转——Android应用开发性能优化完全分析

    [工匠若水 http://blog.csdn.net/yanbober 转载请注明出处.] 1 背景 其实有点不想写这篇文章的,但是又想写,有些矛盾.不想写的原因是随便上网一搜一堆关于性能的建议,感觉 ...

  7. Android 应用开发性能优化完全分析

    1 背景 其实有点不想写这篇文章的,但是又想写,有些矛盾.不想写的原因是随便上网一搜一堆关于性能的建议,感觉大家你一总结.我一总结的都说到了很多优化注意事项,但是看过这些文章后大多数存在一个问题就是只 ...

  8. 【转】Android应用开发性能优化完全分析

    http://blog.csdn.net/yanbober/article/details/48394201 1 背景 其实有点不想写这篇文章的,但是又想写,有些矛盾.不想写的原因是随便上网一搜一堆关 ...

  9. Android应用开发性能优化完全分析

    1 背景 其实有点不想写这篇文章的,但是又想写,有些矛盾.不想写的原因是随便上网一搜一堆关于性能的建议,感觉大家你一总结.我一总结的都说到了很多优化注意事项,但是看过这些文章后大多数存在一个问题就是只 ...

随机推荐

  1. Java的一些基础小知识之JVM与GC (转)

    一.JVM是什么 Java虚拟机(英语:Java Virtual Machine,缩写为JVM),又名爪哇虚拟器,一种能够运行Java bytecode的虚拟机,以堆栈结构机器来进行实做.最早由太阳微 ...

  2. haproxy 看到的是https,后台是http的原因

    https://www.zjtest6.com/admin/api/menu haproxy 日志: Jun 24 13:23:02 localhost haproxy[23205]: 192.168 ...

  3. Pods was rejected as an implicit dependency for 'libPods.a' because its architectures 'x86_64' didn

    引入cocoaPods后.第一次编译,或者运行update后 可能报这个错误: Pods was rejected as an implicit dependency for 'libPods.a' ...

  4. Java对象序列化/反序列化的注意事项(转)

    Java对象序列化 对于一个存在Java虚拟机中的对象来说,其内部的状态只是保存在内存中.JVM退出之后,内存资源也就被释放,Java对象的内部状态也就丢失了.而在很多情况下,对象内部状态是需要被持久 ...

  5. 敏捷开发用户故事系列之十一:CSDN博客用户故事分析

    这是敏捷开发用户故事系列的第十一篇.(栏目目录) 经常有人问起有没有完整的用户故事案例.本人在网上找了一下,大约能找到两三篇,但多数只是为了描述用户故事的语法而已,都不涉及用户故事的颗粒度.大量故事的 ...

  6. VSTO学习笔记(二)Excel对象模型

    原文:VSTO学习笔记(二)Excel对象模型 上一次主要学习了VSTO的发展历史及其历代版本的新特性,概述了VSTO对开发人员的帮助和效率提升.从这次开始,将从VSTO 4.0开始,逐一探讨VSTO ...

  7. Erlangserver紧内存优化解决方案

    提出的问题:server100万人在线,16G内存快被吃光. 玩家进程占用内存偏高 解决方法: 第一步: erlang:system_info(process_count). 查看进程数目是否正常,是 ...

  8. java 线程 ProducerAndConsumer

    package j2se.thread.demo; /** * <p>Project:J2SE 的基础知识</p> * <p>Tile:多线程模拟 生产者 和 消费 ...

  9. MySQL将表a中查询的数据插入到表b中

    MySQL将表a中查询的数据插入到表b中 假设表b存在 insert into b select * from a; 假设表b不存在 create table b as select * from a ...

  10. 为了找到自己的路——leo锦书62

    <Leo锦书(文章1编辑)>百度已经降落阅读,今后将继续更新.免费下载:http://t.cn/RvawZEx 柯克•卡梅隆是谁呢?在中国听过这名字的人预计不多.但看下封面我们马下就会说: ...