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类是连接OpenGL和Android窗口系统的桥梁,即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模块可以参看早先的文章。
- ContentShell启动过程全分析(二)
- ContentShell启动过程全分析(一)
- ContentShell启动过程全分析(一)
- Chromium源码分析:ContentShell启动流程
- chromium34 contentshell启动分析之sandox process创建历程
- Android 启动过程分析 (二)
- Chromium contentshell启动分析之sandox process创建历程(chromium:tag28)
- uClinux 启动过程详细分析(二)
- Arm linxu启动过程分析(二)
- SurfaceFlinger启动过程分析(二)
- ARM linxu启动过程分析(二)
- SurfaceFlinger启动过程分析(二)
- SurfaceFlinger启动过程分析(二)
- SurfaceFlinger启动过程分析(二)
- Android init 启动过程分析(二)
- Solr1.3的启动过程分析二
- linux内核启动过程分析(二)
- 4412uboot启动过程分析之二
- Redhat/CentOS6.2 x86系统KVM虚拟机网络配置(一)—NAT方式
- UVa 11332 Summing Digits (water ver.)
- 五个小球完全弹性碰撞
- 韩国vieworks
- Linux分区
- ContentShell启动过程全分析(二)
- Linux下调试段错误的方法[Segmentation Fault]
- 使用jquery-easyui. 动态设置选中项
- apt-get install-路径
- Redhat/CentOS6.2 x86系统KVM虚拟机网络配置(二)—Bridge方式
- 小探UIScrollView(一)基本属性
- ini处理工具
- 详解选择排序和对其优化
- 不只是技术!成为IT经理必备的十大软技能