首页 > 编程语言 >Chromium源码分析二:LifeofaPixel.pdf

Chromium源码分析二:LifeofaPixel.pdf

时间:2024-11-15 19:29:31浏览次数:1  
标签:渲染 OpenGL 图形 源码 pdf LifeofaPixel Vulkan PrePaint view

Chromium源码分析二:LifeofaPixel.pdf

目录

LifeofaPixel.pdf像素的一生,跟随像素的一生去理解Chromium的工作原理。据说是Chromium的入门培训PPT
网址:​​​​​​​​​​​​​​https://docs.google.com/presentation/d/1boPxbgNrTU0ddsc144rcXayGA_WF53k96imRH8Mp34Y/edit?usp=sharing

在网上找到了比较精简的笔记
图片转载自:https://blog.csdn.net/hebhljdx/article/details/139473588

LifeofaPixel

个人观点

ccLayer树

用过PhotoShop的人都知道图层这个概念。做前端的人也熟悉CSS(层叠样式表)。我们在屏幕上看到的最终图像其实是处于不同图层的图像拼合起来的。

对应到前端层面(html+javascript+css)
就是DOM树,DOM树的每个节点都有自己的大小、位置、样式,画到一起就是图像了。
这里有个特别要提到的就是“ShaddowDOM”,ShaddowDom通过独立组件的方式,避免了在样式、行为上受外层dom的影响。

对应到C++的实现层面这就是ccLayer树,cc(Chromium Compositor)前文讲过,是chromium的合成器。
ccLayer树的节点是View类,后面的各种页面的组件(窗口、button、text、toast之类的)都是继承的view类。View类有如下常用的API:

//设置View的位置和大小
  void SetBounds(int x, int y, int width, int height);
  //添加一个子view
  void AddChildView(View* view);
  //删除一个子view
  void RemoveChildView(View* view);
  //获取View对应的Widget
  Widget* GetWidget();
  //获取当前view孩子的数量
  int child_count()
  //获取parent view
  View* parent()
  //设置view是否可见
  void SetVisible(bool visible)
  //触发一次view树排版
  void Layout()
  //标示当前view区域需要重绘并立马重绘
  void SchedulePaint()
  //每次绘制,都会进入该方法收集绘制指令并绘制
  void Paint()
  //为当前view设置背景
  void SetBackground(std::unique_ptr<Background> b);
  //如果view设置这个属性,说明该view的声明周期自己负责,父view析构不会影响当当前view;若没有设置这个属性,并且当前view被添加为parent_view的child_view,则parent_view析构的时候,会一并析构调该child_view
  void set_owned_by_client()

也就是说,每个页面中的组件都有位置和大小,合成图像的时候,只要把各个层级的ccLayer树遍历一遍,每个节点调用一下Paint函数,图像就画出来了。
这个遍历是并非是根据节点关系遍历的,是根据图层的前后顺序遍历的,background先paint,foreground的后paint,还有一些不visible的,就不paint了。

paint的过程就是光栅化的过程,和PhotoShop里说的光栅化差不多。就是把矢量图转成位图了。比较复杂的操作,比如把图片放大、缩小、旋转、糊化之类的操作还有可能被送到gpu中去做。
这里面就涉及到了图像处理相关的知识了。简单介绍一下skia、vulkan、openGL、openCV。

skia、vulkan、openGL、openCV

Skia

用途:Skia 是一个高性能的 2D 图形处理库,主要用于绘制文本、形状、图像和矢量图形。它提供了跨平台的图形API,支持多种输出格式,如位图、PDF 和 SVG。
应用场景:Skia 常用于构建用户界面,如网页、移动应用和桌面应用的渲染引擎。它是 Google Chrome、Chromium 和 Android 操作系统的核心图形库。

Vulkan

用途:Vulkan 是一种低级别的图形和计算API,允许开发者直接访问GPU硬件,以实现高性能的3D图形渲染和并行计算。
应用场景:Vulkan 适用于游戏开发、虚拟现实、科学计算和图形密集型应用,它减少了CPU的负载,提高了多线程性能和跨平台兼容性。

OpenGL

用途:OpenGL 是一种跨平台的API,用于渲染2D和3D图形,提供了一套标准的图形绘制功能,包括纹理映射、光照和阴影效果。
应用场景:OpenGL 广泛应用于游戏开发、CAD/CAM、科学可视化和教育软件,支持从简单的图形到复杂的3D场景。

OpenCV

用途:OpenCV 是一个开源的计算机视觉和机器学习库,提供了一系列函数和算法,用于图像处理、特征检测、物体识别和视频分析。
应用场景:OpenCV 主要用于计算机视觉研究、安全监控、医学影像分析、机器人视觉和自动驾驶等领域。

区别

抽象级别:OpenGL 和 Vulkan 处理图形渲染,但Vulkan提供了更低级别的硬件访问,而OpenGL提供了更高层次的抽象。
用途范围:Skia 和 OpenGL/Vulkan 主要用于图形渲染,而OpenCV专注于图像处理和计算机视觉任务。
计算能力:Vulkan 支持并行计算和GPU加速,而Skia、OpenGL 和 OpenCV 更侧重于图形和视觉处理的特定方面。

联系

图形渲染:Skia 和 OpenGL/Vulkan 都涉及图形渲染,但它们的使用场景和抽象级别不同。
GPU加速:Vulkan 和 OpenCV 都可以利用GPU加速,前者用于图形渲染,后者用于图像处理和机器学习任务。
跨平台性:Skia、OpenGL 和 Vulkan 都支持跨平台应用,提供了一致的API,以适应不同的操作系统和硬件。
总的来说,Skia、Vulkan、OpenGL 和 OpenCV 在图形和视觉处理领域各自发挥着独特的作用,它们之间的联系主要体现在图形渲染和GPU加速方面,而区别则在于它们的应用场景、抽象级别和计算能力。

之后就是上篇笔记讲到的,把绘图和渲染任务分配到render进程,最终放display到显示屏上。在此过程中,chromium也做了很多的优化,比如PrePaint,PrePaint在实际绘制之前预先计算和准备所有必要的渲染信息,避免在渲染过程中进行昂贵的计算,从而减少重绘和布局的成本。

PrePaint

PrePaint在 Chromium 中的主要作用

预计算和缓存:PrePaint 阶段会计算和缓存各种渲染属性,如图层的位置、大小、可见性、变换矩阵、滚动偏移等。这些信息在后续的绘制阶段可以直接使用,避免了重复计算。
资源准备:PrePaint 还会准备渲染所需的资源,如纹理、字体、图像等,确保在实际绘制时这些资源已经加载完成并可用,减少绘制延迟。
优化渲染路径:PrePaint 会分析图层树和视图层次结构,决定哪些图层需要绘制,哪些可以被裁剪或复用,从而优化渲染路径,减少不必要的重绘。
滚动和动画预测:PrePaint 能够预测用户可能的滚动和动画操作,提前计算和准备相关的渲染信息,确保动画和滚动的流畅性。
异步渲染准备:PrePaint 还支持异步渲染,可以在后台线程上进行预计算,减少主线程的负担,提高渲染性能。
避免重绘:通过在 PrePaint 阶段计算哪些部分需要更新,可以避免不必要的重绘,只更新发生了变化的部分,提高渲染效率。
性能分析:PrePaint 还提供了性能分析和调试的手段,可以帮助开发者理解和优化渲染性能瓶颈。
总之,PrePaint 在 Chromium 中起到了桥梁的作用,它连接了布局和绘制两个阶段,通过预计算和资源准备,大大提高了渲染性能和用户体验。通过将昂贵的计算移到实际绘制之前,PrePaint 能够确保渲染流程的高效和平滑。

标签:渲染,OpenGL,图形,源码,pdf,LifeofaPixel,Vulkan,PrePaint,view
From: https://www.cnblogs.com/bugutian/p/18548545

相关文章

  • Chromium源码分析一:基础知识
    目录Webkit、chromium、Googlechrome各模块结构图进程模型代码结构我的衣食父母基于Chromium实现小程序功能,现在已经开发维护代码一年多了,抽时间对公开的知识做个笔记总结。本文内容源于《WebKit技术内幕》Webkit、chromium、GooglechromeWebKit是一个开源的浏览器引擎,包含......
  • ssm111基于MVC的舞蹈网站的设计与实现+vue(论文+源码)_kaic
    摘 要随着科学技术的飞速发展,社会的方方面面、各行各业都在努力与现代的先进技术接轨,通过科技手段来提高自身的优势,舞蹈网站当然也不能排除在外。舞蹈网站是以实际运用为开发背景,运用软件工程开发方法,采用Java技术构建的一个管理系统。整个开发过程首先对软件系统进行需求......
  • 淘宝代购系统;海外代购系统;代购程序,代购系统源码PHP介绍
    以下是关于淘宝代购系统、海外代购系统、代购程序以及代购系统源码PHP的相关介绍:——在成长的路上,我们都是同行者。这篇关于搭建1688淘宝代购集运系统搭建的文章,希望能帮助到您。期待与您继续分享更多跨境系统搭建的知识,请记得关注Taobaoapi2014哦!  淘宝代购系统:......
  • pg16源码部署
    环境:OS:Centos7pg:pg16说明:pg16已经不提供在centos7下使用yum方式安装了,只能通过源码编译的方式安装.1.源码下载:https://www.postgresql.org/ftp/source/v16.4/ 2.解压源码包[root@localhostsoft]#cd/soft/pg16[root@localhostpg16]#tar-zxvfpostgresql-16.4.tar......
  • STM32项目实战:基于STM32U5的智能大棚温控系统(LVGL),附项目教程/源码
    《智能大棚温控系统_STM32U5》项目完整文档、项目源码,点击下方链接免费领取。项目资料领取https://s.c1ns.cn/F5XyUSTM32项目实战之“智能大棚温控系统”(基于STM32U5)今天小编来分享一个《智能大棚温控系统》的项目案例,硬件平台是STM32U5开发板+资源扩展板+显示触摸屏+仿真器,项......
  • pdf.js使用gulp打包,查看打包后的文档
    在pdf.js的源码中,使用了gulp进行打包,现在对部分有用的gulp方法进行说明gulpserver运行一个服务器版本,能够对源码进行调试gulpgeneric打包一个通用浏览器版本的代码,运行命令后在build/generic/web/viewer.html可以直接打开运行web程序gulpwintersmith是生成gh-pages,用来......
  • SSM冷链物流管理系统的设计与开发90b3l 程序+源码+数据库+调试部署+开发环境
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表系统内容:用户,站点信息,司机,车辆信息,商品信息,订单信息,配送信息开题报告内容一、研究背景随着全球经济的飞速发展和人们生活水平的日益提高,冷链食品的市场......
  • 【C++源码编译】
    C++源码到二进制可执行文件的过程与C语言类似,包括四个过程:预编译、编译、汇编、链接1、预编译C/C++编译过程中的第一个阶段,主要目的是对源代码进行处理和准备工作。下面是预编译的主要步骤:去除宏定义:将所有的#define删除,并展开所有的宏定义,将宏替换为具体的值或表达......
  • 搭建指南:宠物社交、APP小程序平台开发!源码部署,支持二开!
    宠物现在成了大家生活中少不了的小伙伴,而且越来越多人开始关心宠物的健康和快乐。这样一来,宠物行业就火了起来,各种宠物用品、服务和交友平台也跟着冒了出来。那么,如何搭建一个宠物交友系统呢?一、搭建指南搭建一个同城宠物交友系统涉及多个方面,包括需求分析、技术选型、系统设......
  • 线上线下游戏陪玩app源码,陪玩平台源码有哪些功能?
    系统源码 交友系统APP游戏陪玩系统源码圈子同城搭子小程序源码陪玩接单平台app家政系统源码家政预约服务小程序源码游戏陪玩源码搭建平台 陪玩小游戏源码是一套专为游戏爱好者设计的软件开发工具,它集成了多种功能,旨在为用户提供一个全方位的游戏社交平台。游戏陪玩app......