转载请注明出处: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. Javascript之十大常用原理性样例大总结

    案例一:全选等 运用知识点:ondblclick=()| onclick | 寻找标签属性及判断和函数的应用

  2. Python字符串与数字互转,数字格式化

    # -*- coding: gbk -*- import re #将数字格式化为带三位数逗号的字符串 def formatNumber(number): numStr='%d'%number form ...

  3. linux开机启动服务和chkconfig使用方法(自定义服务路径启动)

    服务概述在linux操作系统下,经常需要创建一些服务,这些服务被做成shell脚本,这些服务需要在系统启动的时候自动启动,关闭的时候自动关闭.将 需要自动启动的脚本/etc/rc.d/init.d目录 ...

  4. 【leetcode】Letter Combinations of a Phone Number

    Letter Combinations of a Phone Number Given a digit string, return all possible letter combinations ...

  5. iOS 中关于ViewController总结

    以前写程序时,经常被旋转问题弄的头疼,今天为了解决这个问题,偶然看到了苹果官方文档 View Controller Programming Guide for iOS. 这才发现这个必读的资料!以前许 ...

  6. Python网络编程(2)——socket模块(2)

    目录: 1. 异常 2. 地址族 3. 套接字类型 4. 模块方法 5. Socket对象与实例方法 socket模块提供了Python中的低层网络连接接口,用于操作套接字操作. 异常 socket模 ...

  7. codeforces A. Difference Row 解题报告

    题目链接:http://codeforces.com/problemset/problem/347/A 题目意思:给出一个序列 a1, a2, ..., an , 通过重排序列,假设变成 x1, x2 ...

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

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

  9. Solr学习笔记(一)

    最近准备为一个产品做一个站内的搜索引擎,是一个java产品.由于原来做过Lucene.net,所以自然而然的就想到了使用Lucene.在复习Lucene的过程中发现了Solr这个和Lucene绑定在一 ...

  10. Linux snmp监控

    http://blog.csdn.net/apple_llb/article/details/50494787 http://www.ttlsa.com/monitor/snmp-oid/