android4.4 webview chromium实现硬件渲染的chromium内核结构

这里只关注与原生chromium不同的几个类。
一.DrawGLFunctor
android4.4 webview chromium的硬件渲染是android ui系统和chromium内核协作
完成的。android ui系统负责触发网页渲染(调用WebView.onDraw()),以及提供
网页内容的最终目的地(HardwareCanvas);chromium内核提供具体的渲染行为。
这里就引出了DrawGLFunctor结构。
DrawGLFunctor.java/draw_gl_functor.cpp
draw_gl_functor.cpp提供了接口供chromium内核注册自己的DrawGL函数。
DrawGLFunctor是一个函数指针,这个函数在系统调用WebView.onDraw()
的过程中被传给了android ui系统,并在android ui系统中被调用,
DrawGLFunctor的operator()调用的实际是chromium内核注册的DrawGL函数。
由于DrawGLFunctor的operator()是android ui系统调用的,所以需要将
android ui系统的DrawGlInfo结构转换成chromium的AwDrawGLInfo之后,
再调用chromium内核注册的DrawGL函数,并在调用完后,更新android ui
系统的DrawGlInfo结构。
先看chromium的DrawGL函数注册给draw_gl_functor.cpp的过程。
android4.4 webview chromium实现硬件渲染的chromium内核结构

draw_gl_functor.cpp中定义了全局函数:
void SetChromiumAwDrawGLFunction() {
g_aw_drawgl_function = reinterpret_cast(draw_function);
}
设置给draw_gl_functZ??">vci5jcHC1xMirvtax5MG/Z19hd19kcmF3Z2xfZnVuY3Rpb261xMrHQXdDb250ZW50cy5qYXZh1tA8YnI+Cm5hdGl2ZUdldEF3RHJhd0dMRnVuY3Rpb24oKbe1u9i1xLqvyv2x6sq2oaM8YnI+Cs7Sw8e/tEF3Q29udGVudHMuamF2YTo6bmF0aXZlR2V0QXdEcmF3R0xGdW5jdGlvbigptcO1vbXEvt/M5crHxMe49rqvyv2hozxicj4KYXdfY29udGVudHMuY2M8YnI+CnN0YXRpYyBqaW50IEdldEF3RHJhd0dMRnVuY3Rpb24oSk5JRW52KiBlbnYsIGpjbGFzcykgezxicj4KICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxqaW50PigmYW1wO0RyYXdHTEZ1bmN0aW9uKTs8YnI+Cn08YnI+CmF3X2NvbnRlbnRzLmNj1tC2qNLlwcvIq77WtcS6r8r91rjV67Hkwb9EcmF3R0xGdW5jdGlvbqO6PGJyPgpleHRlcm4g"C" {
static AwDrawGLFunction DrawGLFunction;
static void DrawGLFunction(int view_context,
AwDrawGLInfo* draw_info,
void* spare) {
// |view_context| is the value that was returned from the java
// AwContents.onPrepareDrawGL; this cast must match the code there.
reinterpret_cast(view_context)->DrawGL(
draw_info);
}
}
所以aw_contents.cc中GetAwDrawGLFunction()得到的是
android_webview::InProcessViewRenderer::DrawGL()的函数地址。
设置给draw_gl_functor.cpp的全局变量g_aw_drawgl_function的就是
android_webview::InProcessViewRenderer::DrawGL()。
接着看draw_gl_functor.cpp定义的DrawGLFunctor()被android ui系统调用的过程。
android4.4 webview chromium实现硬件渲染的chromium内核结构

draw_gl_functor.cpp
virtual status_t operator ()(int what, void* data) {
g_aw_drawgl_function(view_context_, &aw_info, NULL);
}
前面的分析我们知道draw_gl_functor.cpp定义的全局变量g_aw_drawgl_function指向的是
android_webview::InProcessViewRenderer::DrawGL()。
所以DrawGLFunctor()调用的是android_webview::InProcessViewRenderer::DrawGL()。
二.SynchronousCompositorImpl
SynchronousCompositorImpl的结构图:
android4.4 webview chromium实现硬件渲染的chromium内核结构

调用SynchronousCompositorImpl::CreateForWebContents()
实际调用的是:
WebContentsUserData::CreateForWebContents(){
DCHECK(contents);
if (!FromWebContents(contents))
contents->SetUserData(UserDataKey(), new T(contents));
}
SynchronousCompositorImpl创建后被设置给了WebContents的UserData.
SynchronousCompositorImpl的SynchronousCompositor接口都是在InProcessViewRenderer中调用的。
SynchronousCompositorImpl的SynchronousCompositor接口实现转接给了SynchronousCompositorOutputSurface。
SynchronousCompositorImpl的SynchronousCompositorOutputSurfaceDelegate接口都在SynchronousCompositorOutputSurface中调用的;
SynchronousCompositorImpl的SynchronousCompositorOutputSurfaceDelegate接口实现转接给了
SynchronousCompositorClient即InProcessViewRenderer.
所以SynchronousCompositorImpl只是SynchronousCompositorOutputSurface
与InProcessViewRenderer之间协作的中转类。
三.WebGraphicsContext3DInProcessCommandBufferImpl和GLInProcessContextImpl
WebGraphicsContext3DInProcessCommandBufferImpl结构图如下:
android4.4 webview chromium实现硬件渲染的chromium内核结构

void InProcessViewRenderer::DrawGL()第一次执行时会先调用
bool InProcessViewRenderer::InitializeHwDraw().触发硬件渲染需要的类的初始化。
webkit::gpu::ContextProviderInProcess::CreateOffscreen()创建包含
WebGraphicsContext3DInProcessCommandBufferImpl的ContextProviderInProcess实例。
SynchronousCompositorOutputSurface::InitializeHwDraw()调用CreateWebGraphicsContext3D()创建了
WebGraphicsContext3DInProcessCommandBufferImpl的实例。
ContextProviderInProcess实例以及WebGraphicsContext3DInProcessCommandBufferImpl的实例作为参数传给了
OutputSurface::InitializeAndSetContext3D()。
WebGraphicsContext3DInProcessCommandBufferImpl构造函数中需要GLInProcessContext做参数。
ContextProviderInProcess实例通过OutputSurface::InitializeAndSetContext3D()
调用的LayerTreeHostImpl::DeferredInitialize()最终传给了ResourceProvider::offscreen_context_provider_变量.
WebGraphicsContext3DInProcessCommandBufferImpl的实例通过OutputSurface::InitializeAndSetContext3D()
调用OutputSurface::SetContext3D()保存在了OututSurface的scoped_ptr context3d_变量中。
ResourceProvider::offscreen_context_provider_变量中包含的WebGraphicsContext3DInProcessCommandBufferImpl包含的
GLInProcessContext是null.在WebGraphicsContext3DInProcessCommandBufferImpl::MaybeInitializeGL()事通过
GLInProcessContext::CreateContext()创建的。
四.InProcessCommandBuffer和CommandBufferService
android4.4 webview chromium实现硬件渲染的chromium内核结构

synchronous_compositor_output_surface.cpp中定义了全局函数:
scoped_ptr CreateWebGraphicsContext3D()
GLInProcessContextImpl::Initialize()创建了
InProcessCommandBuffer,GLES2CmdHelper和GLES2Implementation实例。
InProcessCommandBuffer::InitializeOnGpuThread()创建了
CommandBufferService,GLES2DecoderImpl实例。
与多进程的原生chromium的GPU进程结构不同,这里不需要创建CommandBufferProxy.
GLES2Implementation还是通过GLES2CmdHelper向CommandBuffer写入数据,这里是直接向
CommandBufferService间接包含的SharedMemory.
GLES2DecoderImpl还是在GpuScheduler的调度下从CommandBuffer中读取数据,并调用命令中的gl操作。
最后总结下渲染相关的chromium内核结构
android4.4 webview chromium实现硬件渲染的chromium内核结构

Android中数据存储方
android4.4 webview chromium实现硬件渲染的chromium内核结构
Android OTA升级包制
android4.4 webview chromium实现硬件渲染的chromium内核结构
Android从普通发送和
android4.4 webview chromium实现硬件渲染的chromium内核结构
Android开发:Parall

分类:默认分类 时间:2012-01-06 人气:17
本文关键词:
分享到:

相关文章

  • Chromium on Android: Android L平台上WebView的变化及其对浏览器厂商的影响分析 2013-11-26

    摘要:Android L平台在图形渲染方面有一项重要的改进,它引入了一个专门的线程用于执行渲染工作,UI线程负责生成的显示列表(DisplayList),渲染线程负责重放(playback)这个显示列表绘制最终的内容,因此Chromium WebView在图形栈的实现方面也作了相应的调整,以支持Android L系统上新的渲染线程模型。本文将深度分析Chromium WebView的渲染流水线是如何无缝整合到Android L系统的渲染模型中,以及对目前市场主流浏览器厂商将会产生什么样影响等问题

  • Android 各个版本WebView 2013-07-08

    转载请注明出处 http://blog.csdn.net/typename/ powered by miechal zhao : [email protected] 前言: 根据Google公布的Android 各个系统版本市场占有率(Google Android dashboards), Android 4.0及其以上系统将近90%左右,发展趋势必将是未来市面上几乎是Android 4.0以上系统。本文主要关注Android 4.0及以上系统WebView的实现,从Android We

  • 分享国外高手对混合移动应用开发见解 2013-04-21

    本文我们来分享一下国外专家对混合移动应用开发有如见解,就使用原生开发(native)还是混合开发(hybrid)如何去权衡。 Facebook 在2012年发布了他们新的 iOS app,为了获得更好的用户体验,他们放弃了原来的 HTML5 混合开发方式。考虑到2010~2011年的时候,HTML 在移动端的性能确实不尽如人意,这个决定在当时看来也在情理之中。2010年的时候我们觉得 iPhone 3G/3GS 够眩够快,但按照现在的标准来看它们就太慢了。因此在为移动应用开发做架构设计时,我们需

  • 360极速浏览器的收藏夹内容不见了怎么办 2013-02-06

      360极速浏览器的收藏夹内容不见了的解决方法如下:   这可能是因为没有登录之前同步过收藏夹的360帐号,可以重新登录试试看。如果已经登录了360账户,可以点击地址栏后面扳手按钮,进入“选项”→个人资料,然后通过“收藏夹备份”恢复。   360极速浏览器是一款极速、安全的无缝双核浏览器。它基于Chromium开源项目,具有闪电般的浏览速度、完备的安全特性及海量丰富的实用工具扩展。此外,为了更适合国内用户使用,它加入了鼠标手势、超级拖拽、恢复关闭的标签、地址栏下拉列表等实用功能,配合原有Chr

  • 360极速浏览器和chrome浏览器有什么区别? 2013-02-18

      360浏览器极速版基于Chromium开源浏览器。虽然和Chrome浏览器来自同样的开源代码,但实质并不完全相同。以下是360浏览器极速版与Chrome浏览器相比的主要特点:   •无缝双核   360浏览器极速版加入了IE标签功能,并在此基础上做了大量工作,实现了IE、chromium双核引擎间的无缝切换,是第一款完美支持标准和兼容性的高速双核浏览器。用户既可以享受到Chromium浏览器风一样的速度、HTML5/CSS3的标准化支持,又可以无缝兼容只有IE浏览器才能正常访问的网银网购网站

  • 360极速浏览器是什么 2013-06-15

      360极速浏览器是一款极速、安全的无缝双核浏览器。它基于Chromium开源项目,具有闪电般的浏览速度、完备的安全特性及海量丰富的实用工具扩展。此外,为了更适合国内用户使用,它加入了鼠标手势、超级拖拽、恢复关闭的标签、地址栏下拉列表等实用功能,配合原有Chromium的顺滑操作体验,让浏览网页时顺畅、安心。   360极速浏览器是国内最安全的双核浏览器。360极速浏览器集成了独有的安全技术,充分利用360的优势,集成了恶意代码智能拦截、下载文件即时扫描、隔离沙箱保护、恶意网站自动报警、广告窗

  • Chrome 28 Beta版增加独立通知中心 2013-07-21

      距离Chrome 27的稳定版本发布才两天时间,谷歌马不停蹄,继续宣布了Windows、Mac和Linux版本的Chrome 28 Beta的推出。该版本最引人注目的是独立通知中心功能的加入,众所周知,目前只有Windows版本才具有此功能。   谷歌方称:“我们将这些通知设计得既有花瓶的迷人外表,又有内在的实用性。”来自app的通知以及扩展功能可以转化为文本显示或者图片的格式,还会在弹出窗口里直接包含一些动作功能。   这里给出一个例子,如下图所示:   Chrome和Chrome操作系统

  • 简析Chrome和Webkit的渊源 2013-07-22

      互联网的浪潮从未停息,而用以网上冲浪的冲浪板也一直在变得愈加精良。自人们进入互联网时代以来,即已经发生了三次浏览器大战。第一次浏览器大战的主角是IE和Netscape,最终IE凭借着Windows的庞大身躯推倒了Netscape;第二次浏览器大战Netscape浴火重生化身为火狐狸Firefox,一口咬了IE身上一大块肥肉;正在Firefox和IE正缠绵不息之时,突然凭空杀出个Chrome——这名出身豪门Google的小伙子一下子成长得额外精壮,上串势头凶猛,追得两位前辈娇喘吁吁。   Ch

  • 针对Chrome浏览器 性能对比测试报告 2013-08-18

    十五年前,Netscape推出第二代浏览器并改名为Navigator。后来微软认识到浏览器的重要性,迅速推出了最早的IE版本,并捆绑进操作系统,最终打败了Netscape。时间进入了21世纪,浏览器战争开始了,随着浏览器市场日益成熟,产品之间竞争也主要是细节的争夺。其间有倒下的 Navigator,有苹果推出的Safari,有Mozilla推出的Firefox,更有Google公司开发的,浏览速度走在众多浏览器前列的Chrome浏览器。 Chrome浏览器的主题、新标签页、多功能框、隐身模式、稳

Copyright (C) quwantang.com, All Rights Reserved.

趣玩堂 版权所有 京ICP备15002868号

processed in 0.142 (s). 10 q(s)