【前端】关于帧内刷新的一点想法。我为什么抛弃框架。
由于最近想歇歇(前一段忙拍摄上云和大版本升级太累了!!),给自己放了个假,鼓捣前端。
(资料图片仅供参考)
产品给了一句没头没尾的需求:体验要和FinalCut一样。
然后,我又想让他看我电脑锁屏:这个需求做不了,I don't want to do this shit!
PS:依旧没碰云剪辑,另外一个业务场景。
然后研究了一下Final的操作为何会觉得如此丝滑。
今天要讲的一个细节:
几乎所有在画面上调整,滑块调整,都是帧内完成,也就是说,鼠标操作的跟随,全部在当前帧完成。
别问我咋知道的。录了操作的录屏,传到分秒帧,用逐帧播放功能一帧一帧看过的。(为了给后面维护的同学留下证据,原生JS写代码,真不是我有那个大病。)
场景:
不方便说,就反正类似我们现在在视频上圈点画标注的功能,需要鼠标拖动时,画面上实时产生变化的场景。
解决方案
由React重构为原生JS,外层在套入React。组件内部操作不使用数据驱动。
整站的技术栈在使用React,所以其实很多组件当时写的时候也是数据驱动。也就是,鼠标按下时改变状态,然后移动时计算位置坐标,直接set到子组件进行位置更新的方式。
这个方式存在的问题就摆在那了。查了一遍之前的代码。很多setXXX useEffect({},[xxx])的玩意儿。假设经过一次数据的监听和计算之后再Set回去,然后Render的时候再改。鼠标点按和位置改变,就差了一帧。鼠标移动较慢的情况下一般1-2个像素,较快的情况下。10几个像素也是有可能的。就会有种不丝滑的感觉了。
div重绘问题也比较显著。数据变了,然后这个div……就重新生成了一个。(这点我也十分惊讶)组件套组件之后。div渲消耗?没帧都产生了新的,GC消耗????……emmm 自己想吧,不多做解释了。
这个地方需要加一个我们自己的场景遇到的问题:
时间码
剪辑过视频的小伙伴可能会注意到这个东西。视频非编工具,大致上是这样的 时:分:秒:帧 音频则是 时:分:秒:毫秒。假设我们把音频的 一个数据记录(44100HZ 就是单声道1秒 44100个数据记录,实际上毫秒都不足以计明白)anyway无论音频还是视频。在我们公司产品里,确实要求时间码需要和视频的帧数强一致。
但往往,视频播放组件,和时间戳显示组件,就根本不是同一个组件。需要数据Prop。好吧。。这次场景。。都不在一个项目里(讲真)。主站引用不同的两个包。。。
这时候,你监听数据变化。很抱歉,不是差一帧就是差两帧。极度恶心。音频更显著。毕竟毫秒是计量单位。
而且。。。video标签和Audio标签的ontimeupdate一秒只触发四次。播放过程中,每一帧和他的时间码对上,这事儿。。就挺恶心的。当然,好在这些差异,其实只在播放中体现。暂停之后。显示器刷新一两帧之后。也就自然而然的对上了。基本上只有了FCP和PR的人才会觉得好像有哪别扭。
处理这个问题必然是根本不set 需要用到的组件需要能直接调用到video/audio标签的currentTime,RAF刷新innerText。(虽然不难,但就是觉得在React项目里,写这玩意,是很有那个大病)
时不时打开性能签,调试单帧内调用栈所用时长。
调试技巧吧算是。首先,我开发用的显示屏刷新率实际在 60HZ。之前发现过这个问题。感觉开发时候很顺畅的东西,拿到120HZ显示屏测。效果就跟屎一样。
这个时候,首先确保写的前端组件自身能不能支持到120HZ的刷新频率。也就是毫秒内完成所有计算和渲染。并不是性能签渲染全绿就可以。和16毫秒刷新的要求差的还挺多的。
然后,你需要保证你的同事写的别的组件不拖你后腿(我开玩笑的!真的),整个页面的计算和渲染都必须控制在毫秒内。当然,性能签录了堆栈的。哪拖后腿搞哪就好,跟正常的前端性能调试没啥区别。
这里需要承认,到写这玩意儿为止,还是没能保证应用场景的整个页面计算+渲染在毫秒以内。确实,和用户的硬件性能关联还挺大的。但是尽可能提高性能还是得花些功夫。(反正至少我开发机,调不到这个数,我也不会上线,你们也看不着,哈哈哈哈哈)
开发环境录屏。
这个完全是测主观感受用的。上述都是理论、数据。实际主观感受,丝滑程度,跟手程度,基本优化完一个地方,就实际操作录一版。逐帧播放。看着哪觉得不对劲逐帧播放看一下。
遗留问题:GC
众所周知,浏览器GC。。。行吧 我不说了,就是会卡一下。有感知的卡一下。目前还没有特别好的解法。不过大致的思路是,尽可能缩短GC时间。毕竟GC过程在清理无用的内存。也是顺着节点往上找有没有引用占得时间长。那么尽可能的,少制造垃圾。。只是解题思路,这玩意,没真优化完,不敢说确保有效。有啥新想法到时候再写吧。
最后:更新完应该不会在现有功能上先用,应该是新功能上用。收一波数据,再改现有的视频圈点批注。
依旧,群号,答案自己查
711929228
关键词:
相关阅读
-
【前端】关于帧内刷新的一点想法。我为...
由于最近想歇歇(前一段忙拍摄上云和大版本升级太累了!!),给自己放 -
关于北京和利美生物科技有限公司的行政...
中国质量新闻网讯近日,北京市市场监督管理局网站发布一条处罚信息,涉 -
节日慰问暖人心 浓浓关怀显真情
日前,淳安县石林镇组织50余名退役军人举行庆“八一”活动,表彰奖... -
抢占数字经济赛道③|范仲淹好友滕子京...
编者按:党的二十大报告指出,要加快发展数字经济,促进数字经济和实体经 -
株洲举行全市卷烟放心消费环境建设全面...
为全面建设株洲卷烟市场放心消费环境,凝聚广大卷烟零售客户自主自发的 -
热身赛-法蒂世界波制胜阿劳霍进球被吹 ...
上半场,莱奥一条龙射门被扑;下半场,法蒂世界波破门,阿劳霍进球因越 -
字节、阿里、小米…捐款驰援!多家上市...
灾难无情,人间有爱!近日,受超强台风“杜苏芮”影响,北京、河北... -
上海空港型国家物流枢纽获批 纳入国家...
来源 采访对象提供新民晚报讯(记者金志刚)近日,国家发展改革委发布2 -
湖湘自然历|气象万千雾里看夜郎
2023年8月2日星期三 大暑第11天一年四季中,夏天最适合听故事、讲故事 -
国道看景收费理念落伍时代
近日,有网友发布视频称,游客在西藏日喀则G349国道卡若拉冰川路段停车 -
嗨!白山新闻来了 | 谢忠岩主持召开市...
●8月1日,市委书记、长白山保护开发区党工委书记谢忠岩主持召开市委常 -
蔚来7月交付新车20462台 同比增长103.6%
上证报中国证券网讯8月1日,蔚来公告7月新车交付情况。2023年7月,蔚来 -
成都大运会:上海大学宋佳媛夺得中国队...
2023年8月1日,在成都举行的第31届世界大学生夏季运动会田径项目女子铅 -
通用技术环球医疗首笔绿色银团贷款落地
7月28日,通用技术环球医疗全资子公司——中国环球租赁有限公司(以... -
英国留学硕士费用一年大概多少人民币
《英国留学硕士费用一年大概多少人民币》由留学费用网发布,主要内容:你 -
成都大运会|大运之城中的太极古韵
成都第31届世界大学生运动会正在举行,全市掀起全民健身热潮。在杜甫草 -
出口管制对公司金属镓业务影响很小 铝...
出口管制对公司金属镓业务影响很小7月31日,商务部、海关总署、国家国 -
强化智能制造这一主攻方向
智能制造是发展壮大战略性新兴产业、加快建设现代化产业体系的重要手段 -
网贷综合评分不足去哪里借钱?分享10个...
网贷综合评分不足去哪里借钱,网贷综合评分不足可以去以下网贷app上借 -
省教育厅举办2023年教育财务管理培训班
为全面落实省人大重点审查、审计整改和基层管理检视问题整改工作要求,