转载请注明出处:http://www.cnblogs.com/fangkm/p/3960327.html

硬件渲染依赖计算机的GPU,GPU种类繁多,兼容这么多种类的硬件,稳定性是个大问题,虽然Chromium内部维护了一个GPU黑名单列表,限定了哪些渲染特性不能在哪些GPU上渲染,但还不足以解决使用GPU过程中的稳定性问题。在Chromium的多进程架构中,不稳定不可控的因素一般都会采取独立进程的渲染方式, 从而保证主进程的稳定性,比如Render进程、插件进程,GPU的使用也一样,采取独立进程的方式运行。

主进程在启动的时候,会调用GpuDataManagerImpl的Initialize初始化方法,在Initialize方法中,会加载预置的GPU黑名单列表,列表信息位于” src\gpu\config\software_rendering_list_json.cc”文件中,由JSON格式来描述,程序中通过kSoftwareRenderingListJson变量来访问。通过分析GPU的黑名单列表,可以获得当前GPU在当前的系统下不知道的渲染特性,当初始化渲染环境时,会从GpuDataManagerImpl维护的禁用渲染特性中查询是否被禁用,从而决定采取硬件渲染还是软件渲染。另外,在GPU进程崩溃超过三次时,会在GpuDataManagerImpl里禁用当前GPU的所有渲染支持,也就是将所有的渲染特性加入到当前的GPU黑名单列表,之后的渲染流程都走软件渲染的逻辑。相关逻辑请参见GpuProcessHost的析构方法。

下面探寻一下GPU进程的启动流程:

和创建Render进程类似,主进程首先创建一个创建一个命名管道的Server端(参见ChildProcessHostImpl的CreateChannel方法),然后启动GPU进程,将创建好的管道名当命令行参数传递过去(参见GpuProcessHost的LaunchGpuProcess方法),GPU子进程启动后,会从命令行参数中取出管道名,然后创建相应的管道Client端(参见ChildThread的Init方法),然后就完成管道的连接处理。

与GPU子进程建立连接后,主进程给GPU进程发送GpuMsg_Initialize消息,GPU进程收到这个消息后,会回复一个GpuHostMsg_Initialized消息,附上采集到的GPU信息,这个时候GPU会创建好GpuChannelManager对象,管理即将到来的专供GPU渲染的IPC连接列表。主进程在初始化硬件渲染上下文的时候(参见WebGraphicsContext3DCommandBufferImpl的Initialize方法,一般在主线程),会向GPU子进程发送GpuMsg_EstablishChannel消息(在IO线程发送),然后Wait住主线程,GPU进程在收到该消息后,会创建一个专供渲染用的管道Server端(参见GpuChannelManager的OnEstablishChannel处理),创建完成后会给主进程回复一个GpuHostMsg_ChannelEstablished消息,将刚创建好的渲染管道名称传递过去,主进程接收到回复消息后(在IO线程接受处理),将之前Wait的信号授信,主线程继续处理,从而完成硬件渲染通信管道的初始化过程。

Render进程也需要使用GPU进行硬件渲染,Render进程GPU管道的创建流程委托给主进程,当Render进程初始化3D绘制环境时,会给主进程发送GpuHostMsg_EstablishGpuChannel同步消息,然后等待答复消息的返回。主进程收到GpuHostMsg_EstablishGpuChannel消息后的处理过程,就是上面讲到的主进程启动GPU进程的流程,不同的是,当GPU进程返回创建好的IPC管道名后,会将该名称通过GpuHostMsg_EstablishGpuChannel答复消息返回给Render进程,由Render进程创建相应的IPC管道客户端。

Chromium的GPU进程启动流程的更多相关文章

  1. 【Chromium】GPU进程启动流程

    本篇文档以gpu进程的创建和启动为例,讲述chormium如何启动一个browser进程的子进程 PS:本文使用的chromium代码版本为71 前言 GPU进程的启动时机是由browser进程负责的 ...

  2. ORACLE11G R2 RAC的进程启动流程

    简要说明ORACLE11GR2 RAC的进程启动流程: 1.启动流程概览图: 二.RAC启动流程的梳理: 第一层:OHASD 启动:(OHASD派生) 1.CSSDAGENT负责启动CSSD的AGEN ...

  3. broadcom代码中httpd进程启动流程介绍

    Broadcom代码中包含WEB配置管理媒介, 在嵌入式WEB服务器min_httpd基础上改造实现, 其bin名称为httpd,此httpd可以由管理进程有连接后动态启动,并且当一段时间内没有连接到 ...

  4. ARM-Linux移植之(三)——init进程启动流程分析

    我们通常使用Busybox来构建根文件系统的必要的应用程序.Busybox通过传入的参数来决定执行何种操作.当init进程启动时,实际上调用的是Busybox的init_main()函数,下面我们来分 ...

  5. 内核启动流程3--Busybox的init进程

    Busybox是用来制作文件系统的一个工具集,可以用来替换GNU fileutils shellutils等工具集,它为各种小型的或者嵌入式系统提供了比较完全的工具集. 它提供的核心程序中包括了用户空 ...

  6. Android系统开机启动流程及init进程浅析

    Android系统启动概述 Android系统开机流程基于Linux系统,总体可分为三个阶段: Boot Loader引导程序启动Linux内核启动Android系统启动,Launcher/app启动 ...

  7. Android系统启动流程(二)解析Zygote进程启动过程

    1.Zygote简介 在Android系统中,DVM(Dalvik虚拟机).应用程序进程以及运行系统的关键服务的SystemServer进程都是由Zygote进程来创建的,我们也将它称为孵化器.它通过 ...

  8. Android系统启动流程(一)解析init进程启动过程

    整体流程大致如下:     1.init简介 init进程是Android系统中用户空间的第一个进程,作为第一个进程,它被赋予了很多极其重要的工作职责,比如创建zygote(孵化器)和属性服务等.in ...

  9. chromium for android GPU进程结构分析

    版权声明:本文为博主原创文章.未经博主同意不得转载. https://blog.csdn.net/jaylinzhou/article/details/27517471 GPU进程的client(Br ...

随机推荐

  1. 【SpringMVC】SpringMVC系列3之@PathVariable映射URL占位符参数

    3.@PathVariable映射URL占位符参数 3.1.概述 带占位符的 URL 是 Spring3.0 新增的功能,该功能在SpringMVC 向 REST 目标挺进发展过程中具有里程碑的意义. ...

  2. css排版

    先介绍如何设定字体.颜色.大小.段落空白等比较简单的应用,后面再介绍下比如首字下沉.首行缩进.最后讲一些常用的web页面中文排版,比如中文字的截断.固定宽度词内折行(word-wrap和word-br ...

  3. 【转】Oracle数据库中Sequence的用法

    在Oracle数据库中,sequence等同于序列号,每次取的时候sequence会自动增加,一般会作用于需要按序列号排序的地方. 1.Create Sequence (注释:你需要有CREATE S ...

  4. 30.赋值运算符重载函数[Assign copy constructor]

    [问题] 给出如下CMyString的声明,要求为该类型添加赋值运算符函数.  C++ Code  1234567891011   class CMyString { public:     CMyS ...

  5. c++ 继承 虚函数与多态性 重载 覆盖 隐藏

    http://blog.csdn.net/lushujun2011/article/details/6827555 2011.9.27 1) 定义一个对象时,就调用了构造函数.如果一个类中没有定义任何 ...

  6. wait() 与 sleep

    1.对于两种方法区别 1. 这两个方法来自不同的类,sleep方法属于Thread,wait方法属于Object. 2. 最主要是sleep方法没有释放锁,而wait方法释放了锁,使得其他线程可以使用 ...

  7. wp8 --未找到与约束ContractName Microsoft.VisualStudio.Text.ITextDocumentFactoryService...匹配的导出

    今天打算用VisualStudio2012做一个js效果页面测试的时候,打开VS2012新建项目,但是并没有像之前那样顺利的创建页面,而是弹出了一个错误窗口. 我的系统是win8专业版 64位 ,同时 ...

  8. Action类为何要 extends ActionSupport

    我做的时候,我的action是继承ActionSupport的 Struts 2的Action无须实现任何接口或继承任何类型,普通的POJO类就可以用做Action类,但是,我们为了方便实现Actio ...

  9. LightOJ 1079 Just another Robbery 概率背包

    Description As Harry Potter series is over, Harry has no job. Since he wants to make quick money, (h ...

  10. MATLAB信号与系统分析(一)——连续时间信号与系统的时域分析

    一.连续时间信号的表示: 1.向量表示法: 在MATLAB中,是用连续信号在等时间间隔点的样值来近似表示连续信号,当取样时间间隔足够小时,这些离散的样值就能较好地近似出连续信号. 对于连续时间信号f( ...