{"id":13559684,"url":"https://github.com/Sunny-117/browser-core","last_synced_at":"2025-04-03T15:30:46.771Z","repository":{"id":230978366,"uuid":"778602189","full_name":"Sunny-117/browser-core","owner":"Sunny-117","description":"实现最简浏览器渲染模型","archived":false,"fork":false,"pushed_at":"2024-03-28T03:04:08.000Z","size":27,"stargazers_count":10,"open_issues_count":0,"forks_count":1,"subscribers_count":2,"default_branch":"main","last_synced_at":"2025-03-25T19:48:51.568Z","etag":null,"topics":["browser","cpu","effects","gpt","optimization","render","render-engine"],"latest_commit_sha":null,"homepage":"","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Sunny-117.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null}},"created_at":"2024-03-28T03:03:59.000Z","updated_at":"2025-01-15T12:12:34.000Z","dependencies_parsed_at":"2024-04-01T23:06:35.994Z","dependency_job_id":"db7c73ff-9437-40ff-b01f-7765a7e4448a","html_url":"https://github.com/Sunny-117/browser-core","commit_stats":null,"previous_names":["sunny-117/browser-core"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Sunny-117%2Fbrowser-core","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Sunny-117%2Fbrowser-core/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Sunny-117%2Fbrowser-core/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Sunny-117%2Fbrowser-core/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Sunny-117","download_url":"https://codeload.github.com/Sunny-117/browser-core/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":247027698,"owners_count":20871572,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["browser","cpu","effects","gpt","optimization","render","render-engine"],"created_at":"2024-08-01T13:00:31.178Z","updated_at":"2025-04-03T15:30:42.192Z","avatar_url":"https://github.com/Sunny-117.png","language":"JavaScript","funding_links":[],"categories":["JavaScript"],"sub_categories":[],"readme":"# 实现最简浏览器渲染模型\n\n## 渲染流水线\n\n- （1）渲染进程把 HTML 转变为 DOM 树型结构\n- （2）渲染进程把 CSS 文本转为浏览器中的 stylesheet\n- （3）通过 stylesheet 计算出 DOM 节点的样式\n- （4）根据 DOM 树创建布局树\n- （5）并计算各个元素的布局信息\n- （6）根据布局树生成分层树\n- （7）根据分层树进行生成绘制步骤\n- （8）把绘制步骤交给渲染进程中的合成线程进行合成\n- （9）合成线程将图层分成图块(tile)\n- （10）合成线程会把分好的图块发给栅格化线程池，栅格化线程会把图片(tile)转化为位图\n- （11）而其实栅格化线程在工作的时候会把栅格化的工作交给 GPU 进程来完成，最终生成的位图就保存在了 GPU 内存中\n- （12）当所有的图块都光栅化之后合成线程会发送绘制图块的命令给浏览器主进程\n- （13）浏览器主进程然后会从 GPU 内存中取出位图显示到页面上\n\n## HTML 转 DOM 树\n\n- 浏览器中的 HTML 解析器可以把 HTML 字符串转换成 DOM 结构\n- HTML 解析器边接收网络数据边解析 HTML\n- 解析 DOM\n  - HTML 字符串转 Token\n  - Token 栈用来维护节点之间的父子关系，Token 会依次压入栈中\n  - 如果是开始标签，把 Token 压入栈中并且创建新的 DOM 节点并添加到父节点的 children 中\n  - 如果是文本 Token，则把文本节点添加到栈顶元素的 children 中，文本 Token 不需要入栈\n  - 如果是结束标签，此开始标签出栈\n\n## CSS 转 stylesheet\n\n- 渲染进程把 CSS 文本转为浏览器中的 stylesheet\n- CSS 来源可能有 link 标签、style 标签和 style 行内样式\n- 渲染引擎会把 CSS 转换为 document.styleSheets\n\n## 计算出 DOM 节点的样式\n\n- 根据 CSS 的继承和层叠规则计算 DOM 节点的样式\n- DOM 节点的样式保存在了 ComputedStyle 中\n\n## 创建布局树\n\n- 创建布局树\n- 创建一棵只包含可见元素的布局树\n\n## 计算布局\n\n- 计算各个元素的布局\n\n## 生成分层树\n\n- 根据布局树生成分层树\n- 渲染引擎需要为某些节点生成单独的图层，并组合成图层树\n  - z-index\n  - 绝对定位和固定定位\n  - 滤镜\n  - 透明\n  - 裁剪\n- 这些图层合成最终的页面\n\n## 绘制\n\n- 根据分层树进行生成绘制步骤复合图层\n- 每个图层会拆分成多个绘制指令，这些指令组合在一起成为绘制列表\n\n## 合成线程\n\n- 合成线程将图层分成图块(tile)\n- 合成线程会把分好的图块发给栅格化线程池，栅格化线程会把图片(tile)转化为位图\n- 而其实栅格化线程在工作的时候会把栅格化的工作交给 GPU 进程来完成，最终生成的位图就保存在了 GPU 内存中\n- 当所有的图块都光栅化之后合成线程会发送绘制图块的命令给浏览器主进程\n- 浏览器主进程然后会从 GPU 内存中取出位图显示到页面上\n- 合成线程\n\n## 图块\n\n- 图块渲染也称基于瓦片渲染或基于小方块渲染\n- 它是一种通过规则的网格细分计算机图形图像并分别渲染图块(tile)各部分的过程\n\n## 栅格化\n\n- 栅格化是将矢量图形格式表示的图像转换成位图以用于显示器输出的过程\n- 栅格即像素\n- 栅格化即将矢量图形转化为位图(栅格图像)\n\n## 资源加载\n\n- CSS 加载不会影响 DOM 解析\n- CSS 加载不会阻塞 JS 加载，但是会阻塞 JS 执行\n- JS 会依赖 CSS 加载，JS 会阻塞 DOM 解析\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FSunny-117%2Fbrowser-core","html_url":"https://awesome.ecosyste.ms/projects/github.com%2FSunny-117%2Fbrowser-core","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FSunny-117%2Fbrowser-core/lists"}