转载请注明出处: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.NET MVC4 WEB编程》学习笔记------Web API

    本文截取自情缘 1. Web API简单说明 近来很多大型的平台都公开了Web API.比如百度地图 Web API,做过地图相关的人都熟悉.公开服务这种方式可以使它易于与各种各样的设备和客户端平台集 ...

  2. 38.输出1到最大的N位数[Print 1 to max number of N bits]

    [题目] 输入数字n,按顺序输出从1最大的n位10进制数.比如输入3,则输出1.2.3一直到最大的3位数即999. [分析] 这是一道很有意思的题目.看起来很简单,其实里面却有不少的玄机. [常规思路 ...

  3. 用几条shell命令快速去重10G数据

    试想一下,如果有10G数据,或者更多:怎么才能够快速地去重呢?你会说将数据导入到数据库(mysql等)进行去重,或者用java写个程序进行去重,或者用Hadoop进行处理.如果是大量的数据要写入数据库 ...

  4. 单个php页面实现301重定向

    301重定向的意思是页面永久性移走,实现方式是当用户请求页面时,服务器返回相应http数据流头信息状态码为301,表示本网页永久性转移到另一个地址,301重定向是页面永久性转移,一般用在不打算改变的地 ...

  5. 【python】一个简单的贪婪爬虫

    这个爬虫的作用是,对于一个给定的url,查找页面里面所有的url连接并依次贪婪爬取 主要需要注意的地方: 1.lxml.html.iterlinks()  可以实现对页面所有url的查找 2.获取页面 ...

  6. Android procrank , showmap 内存分析

    (一)DDMS 的Heap Dump 1) Data Object:java object. 2) Class Object:object of type Class, e.g. what you'd ...

  7. 原创centos7安装hadoop2.7(转载请注明出处)

    启用ip vi /etc/sysconfig/network-scripts/ifcfg-ONBOOT=yes 编辑DNS /etc/resolv.conf nameserver 114.114.11 ...

  8. Android之自定义控件深入

    本文主要讲述两个知识点:popwindow的使用和通过继承View实现一个自定义控件,实现点击,手动按钮的效果. popwindow的使用 //定义 popupWindow popWin = new ...

  9. sina发现并不会去导入qq使用的

    看问题需要多角度,为之不能实现也是有可能没有完善的.确实是由于短时间发布过多,还是bky好点好像有30S

  10. Kafka学习笔记(一):概念介绍

    Kafka是一个开源的,分布式的,高吞吐量的消息系统.随着Kafka的版本迭代,日趋成熟.大家对它的使用也逐步从日志系统衍生到其他关键业务领域.特别是其超高吞吐量的特性,在互联网领域,使用越来越广泛, ...