ContentShell启动过程全分析(二)

来源:互联网 发布:锥度螺纹怎么编程循环 编辑:程序博客网 时间:2024/04/29 13:32

一、Render进程初始化

Render进程的初始化流程与Browser进程非常相似,启动service后会调用到ContentMain::Start,并且在RunNamedProcessTypeMain函数中走RenderMain的流程。


上述流程图是Render进程消息循环及IPC相关类的初始化,可见它们在Render进程刚一建立就相继被初始化了,因为它们是一个进程最最基础的类。

而RenderViewImpl类啥时候初始化呢?它是在收到IPC消息后初始化的,因为一个RenderView总与一个RenderVIewHost想对应,所以它由RenderViewHost初始化。


这里插一句,RenderThreadImpl一看名字就是很重要的类,类似的还有Browser进程的BrowserThreadImpl类。后面会更详细的分析一下这几个类。

二、Surface初始化
虽然内容是通过SurfaceView控件显示(关于SurfaceView的使用我是外行),但chromium显然没想搞这么简单。处于性能的考虑,chromium需要在GPU进/线程来绘制,而不影响UI线程。关于GPU渲染的一些内容可以参考早先的文章。

这里先把基本原理抄一遍:

ANativeWindow类是连接OpenGLAndroid窗口系统的桥梁,即OpenGL需要通过ANativeWindow类来间接地操作Android窗口系统。这种桥梁关系是通过EGL库来建立的,所有以egl为前缀的函数名均为EGL库提供的接口。

每一个EGLSurface对象surface有一个关联的ANativeWindow对象。这个ANativeWindow对象是通过函数eglCreateWindowSurface的第三个参数来指定的。在我们这个场景中,这个ANativeWindow对象正好对应于前面所创建的 Surface对象s。每当OpenGL需要绘图的时候,它就会找到前面所设置的绘图表面,即EGLSurface对象surface。有了EGLSurface对象surface之后,就可以找到与它关联的ANativeWindow对象,即Surface对象s。有了Surface对象s之后,就可以通过其内部的Binder代理对象mSurface来请求SurfaceFlinger服务返回帧缓冲区硬件设备的一个图形访问接口。这样,OpenGL最终就可以将要绘制的图形渲染到帧缓冲区硬件设备中去,即显示在实际屏幕上。

上面一段原理介绍中我们可以看出,GPU线程是通过EGL来绘制的,而ANativeWionw类是连接SurfaceView和eglSurface的关键。ANativeWinow从SurfceHolder::getNativeWindow函数中可以得到。(关于SurfaceView和SurfaceHolder的关系参见android)。

介绍完原理,开始说下流程。当SurfaceView创建时,会触发SurfcaeHolder::surfaceCreated函数。该函数中会先得到ANativeWinow,然后进行如下流程:


这个流程会将ANativeWinow先存储起来,下面一个流程将使用ANativeWinow来初始化eglsurface


这一初始化流程是在第一次绘制的时候进行,chromium31的CC模块比之26又有较大的不同,现在还没有仔细研究,日后可能会稍微看一下这部分。关于CC模块可以参看早先的文章。