Discuz! Board

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 997|回复: 0
打印 上一主题 下一主题

fre2 新突破:离屏渲染(offscreen rendering)

[复制链接]

1272

主题

2067

帖子

7960

积分

认证用户组

Rank: 5Rank: 5

积分
7960
跳转到指定楼层
楼主
发表于 2023-3-21 18:36:47 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
经过两天的拼命奋斗,我现在正式宣布,fre2 终于无敌了!
过去遭受的憋屈,嘲讽,这一刻全都值了,我终于实现了 vdom 世界最快的算法
直接上图:
可以看到,fre2 现在首屏渲染比原生 js 快一倍,比 vue3 快三倍,比 react17 快四倍
世界上还没有比原生 js 快的框架,那么 fre2 是怎么做到的呢?
offscreen rendering
<ul>  <li>1</li>  <li>2/li></ul>传统遍历,插 ul,插 li,插 1,插 li,插 2,一边操一边插集中绘制,操 2,操 li,操 1,操 li,插 ul,一直操,操完最后只插入一次操作的是内存,插入的是屏幕
再通俗点?
其实和 DocumentFragment 原理是一样的
怎么实现?
以上说起来很轻松,很多框架作者和团队都在觊觎这个算法,甚至 preact 研究了好几年了……
但是至今为止,只有 fre 找到了实现方法——倒序遍历
自下而上,从右往左
得益于 fre 先前的两阶段遍历,以及 fiber 的潜水冒泡模型,我要在 reconcile 阶段生成一个倒序的 effectlist 是有可能的
所以 fre2 彻底重构了核心算法,新的架构主要分为三块
reconciler  - diving - 正序(hooks)  - bubbling - 倒序(effects)commit - 倒序(refs)
reconciler 包括潜水和冒泡这俩过程,潜水过程负责执行 hooks,diff,这块的顺序是正序,冒泡过程是每个组件更新完,这块主要是 effects,是倒序的
commit 阶段是个完全倒序的过程,refs 在这个过程执行
所以对用户来说,fre 的 refs 和 effects 顺序会和 react 相反
但是我认为这是值得的,因为倒序插入是集中绘制的心智模型,理解它为什么快也是很重要的
与此同时,我对 diff 算法也重构了,代码安排更合理了,diff 算法也是 fre2 的进步,配合集中绘制,可以说完美了
总结
如果说 fre1 最大的突破是时间切片(time slicing),那么 fre2 的突破是离屏渲染(offscreen rendering)了
这回我终于可以硬气了呜呜呜,终于干过他们了!

[color=inherit !important]yisar/fre​github.com/yisar/fre
最后放一下 github 连接,你可以不看 react 可以不看 vue,但 fre 的源码真的要看!这可能是最小,最快,最精彩的框架,额,之一(一脸不情愿)
https://zhuanlan.zhihu.com/p/378384686

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|firemail ( 粤ICP备15085507号-1 )

GMT+8, 2024-11-25 05:22 , Processed in 0.058139 second(s), 20 queries .

Powered by Discuz! X3

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表