fabric.js实战

数据采集

业务:

  • 轨迹手写、抄写
  • 雷达采集

轨迹手写、抄写

需求

  • 可配置画笔颜色、粗细
  • 可通过手势生成实际轨迹
  • 可通过手势来圈选轨迹
  • 可撤销、删除轨迹
  • 可操作轨迹
  • 可缩放、拖动
  • 背景网格,且背景网格可缩放和拖动
  • 参考图片可缩放、偏移
  • 手势处理系统,单指绘制、双指缩放、三指拖动

技术选型

因为涉及到轨迹操作轨迹两点,所以 svg 和 canvas 都无法满足,所以从 fabricjs/konva 中选型, 因 fabricjs 使用人数更多,所以采取了其作为技术选型。

fabric 原理
  • 通过其内置几何对象创建图形
  • 维护一个对象树
  • 将对象树通过 canvas-api 绘制在实际的 canvas 上

因此,fabric 能做非常多的优化手段

  • 已渲染的节点可通过子canvas做缓存
  • 对比新旧对象树能做差值更新
  • 虚拟画布,类似于虚拟滚动,只渲染可视化的区域

模块

  • header:与业务相关
  • toolBar:工具栏
  • sidebar:与业务相关
  • canvas:绘制画板

性能问题

  • 圈选是实时的,即判断一个多边形是否相交于或包含于一条复杂轨迹,因为使用了射线法,当遇到大量轨迹的时候,可能会卡顿。目前做了多重优化手段,比如函数节流、先稀疏复杂轨迹的点、然后判断图形的占位区域是否相交、然后判断图形的线段之间是否相交、然后判断是否包含关系。
  • 轨迹的实时生成,在长串touchmove时间中,使用一个初始化的polyline,后续更改其点集,这样只需要实例化一个对象,性能高。
  • touchmove回调里会执行复杂的逻辑,这会阻塞touchmove的触发频率,我们将touchmove里的回调通过settimeout放到异步队列中,这样touchmove事件层 和 回调函数逻辑层剥离了,touchmove的触发频率就会被影响

雷达采集

需求

相关推荐
linux_cfan5 小时前
videojs v10 源代码系列解读:14 · 谓词守卫:在运行时安全地调用能力
前端·javascript·音视频
kyriewen5 小时前
我扒了 10,221 条 JD:腾讯技术岗 75% 在要 AI
前端·人工智能·ai编程
郑州光合科技余经理6 小时前
同城外卖小程序开发:下单成功后,后台导出能不能对上用户端状态
开发语言·前端·git·后端·uni-app·php·ai编程
IT_陈寒7 小时前
Vue的响应式让我熬到凌晨三点,原来漏了这个小细节
前端·人工智能·后端
Blanche15007 小时前
利用 RAG 为答疑机器人扩展知识范围
前端
天若有情6737 小时前
【纯前端小工具】公历生日转农历,批量查询每年农历生日对应的公历日期(GitHub Pages在线直接用)
前端·javascript·github pages·农历转换·lunisolar·网页小工具
SoonITer7 小时前
怎样构建一个 Agent-friendly 的网站
前端·agent
颜进强7 小时前
01 · NestJS 是什么:用途、解决什么问题、与热门框架对比
前端·后端·ai编程
wendZzoo7 小时前
前端工程师的 3D 第一课:一个模型如何进入网页
前端
颜进强7 小时前
04 · NestJS 依赖注入:你在 `@Module` 写的 providers,和构造参数里那个类型,是怎么"对上"的?
前端·后端·ai编程