转载请注明出处: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. 《ASP.NET1200例》<asp:DataList>分页显示图片

    aspx页面代码 <asp:DataList ID="dlPhoto" runat="server" Height="137px" W ...

  2. Largest Divisible Subset

    Given a set of distinct positive integers, find the largest subset such that every pair (Si, Sj) of ...

  3. Rehashing

    The size of the hash table is not determinate at the very beginning. If the total size of keys is to ...

  4. 关于Linux下进程间使用共享内存和信号量通信的时的编译问题

    今天在编译一个使用信号量实现进程同步时,出现了库函数不存在的问题.如下图 编译结果实际上是说,没include相应的头文件,或是头文件不存在(即系统不支持该库函数) 但我man shm_open是可以 ...

  5. Mysql数据库中设置root密码的命令及方法

    我们都知道通常PHP连接 Mysql都是通过root用户名和密码连接,默认情况下在Mysql安装时root初始密码为空,在安装使用PHP开源系统时,都需要填写连接Mysql数据库的用户名和密码,此时当 ...

  6. SQL— CONCAT(字符串连接函数)

    有的时候,我们有需要将由不同栏位获得的资料串连在一起.每一种资料库都有提供方法来达到这个目的: MySQL: CONCAT() Oracle: CONCAT(), || SQL Server: + C ...

  7. 转载一篇关于ios静态库的文章

    http://blog.csdn.net/zsomsom/article/details/9163635

  8. codeforces 488A. Giga Tower 解题报告

    题目链接:http://codeforces.com/problemset/problem/488/A 题目意思:给出一个数a,范围是[-10^9, 10^9],问它最少需要加的一个正整数 b 是多少 ...

  9. CSS 样式显示为小手

    因为工作需要把鼠标放上去显示小手形状, css样式如下: style="cursor:hand"    部分浏览器支持 style="cursor:pointer&quo ...

  10. php 条件查询和多条件查询

    条件循环 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3 ...