请教一个前端设计及实现问题, 绘制并实时更新 96 个折线图的最佳实践?

2025 年 1 月 23 日
 lurenjiaMAX

程序是这样的:

问题有这些:

目前我选择的是 tauri+vite+react+highchart(highstock).

我调研的每一个绘图库都吹榜他的性能, 包括上面选择的 highstock.

后端性能没有问题, 交互时后端单独发送数据, 前端使用 debounce.

但是性能却非常糟糕.

3201 次点击
所在节点    问与答
34 条回复
paopjian
2025 年 1 月 23 日
好家伙,每秒 96*3 的数据还要时时绘图?这不现实吧,前端折线图这种每次改数据是要重新计算的,你这算得过来吗
miloooz
2025 年 1 月 23 日
echarts 的大数据量绘图还可以啊 。
通道数据在绘图时 是追加到原有数据还是覆盖了所有数据额,覆盖可能会有性能问题,追加的话会好很多。
miloooz
2025 年 1 月 23 日
https://echarts.apache.org/zh/api.html#echartsInstance.setOption
不过我没做过这么大数据量的测试,你可以试试看哈
shadowyue
2025 年 1 月 23 日
你说的性能糟糕具体指什么现象
shadowyue
2025 年 1 月 23 日
你不如直接丢一份测试数据出来,还有设计图
crazyBlack
2025 年 1 月 23 日
首先肯定是一起发好,减少连接数

你这数据量到底有多大,能碰到绘图库的性能上限,你先确认一下是数据存的太大内存顶不住了,还是点太多绘制上去有问题,如果是绘制的问题正常的库都会有给数据抽稀的方法,过大的数据直接绘制上去意义不大,我盲猜是数据量过大存不住了,你可以研究一下接一层 bff 做数据整合和抽稀,或者交给后端做

然后前后端分离和追求性能不冲突,如果你觉得是交给客户端的计算量过大可以试试尽量把计算放在 worker 里或者考虑 next 或者 remix 这样的服务端渲染框架
crazyBlack
2025 年 1 月 23 日
我才看到技术栈里还有个 tauri ,next 或者 remix 当我没说,生产敢用这东西的都是个猛人,打扰了
andyskaura
2025 年 1 月 23 日
1.都差不多,但只要前端的主线程没出现堵塞,一起发送更好。websocket 会自己分片,ipc (我不知道你前端的什么 ipc ,只说 electron 的 ipc )大数据会有一定延迟( 4k 的 bmp 会有 200ms 左右延迟),但预估你数据量还没那么大。
2.别用 svg ,用 canvas ,绘图的渲染性能都没什么压力的,毕竟都只是 2d 的。我猜测问题可能出在数据处理上,可以用帧循环来将 96 个数据排序提交,减小并发。用 woker 或者 wasm 来优化处理,无论怎样,千万别让主线程卡住了。
3.感觉前后端分不分离和性能没啥联系。

最好还是把问题现象描述的清楚一点,主要不好分析出现在堵在哪儿了
chairuosen
2025 年 1 月 23 日
不用 UI 框架的内置 state ,直接调用绘图框架的更新方法更新,绘图框架最好是 canvas 的,这样就只有数据计算过程,没有 vdom 的更新
lurenjiaMAX
2025 年 1 月 23 日
@shadowyue 好的 我后面收拾一下代码 做一个最小可运行实例分享出来
thulof
2025 年 1 月 23 日
你是不是每次都全量重绘的…… 只追加 delta 就好了吧
sgiyy
2025 年 1 月 23 日
你要把你的效果图和具体数据量大小放出来才好评估
thulof
2025 年 1 月 23 日
@thulof #11 哦不对,仔细看了下是折线图,那确实需要全量重绘。那考虑下分片分批处理吧
lurenjiaMAX
2025 年 1 月 23 日
@sgiyy 效果图是这样的 ![图片]( )
Moierby
2025 年 1 月 23 日
我做过一个页面 30 个折线和柱状图的需求,直接一次性请求过来一把梭,用的 echarts ,基本没有明显卡顿。不过我的绘图数据比较小,每张 chart 上也就几十个节点。
现在流行的 chart 库都是用 canvas 实现的,每次绘制都是清理完之前的图层,重算重绘,也就是图表渲染这一步你基本没有什么可优化的空间。
你看一下你的瓶颈在哪,针对性的优化:
如果数据请求太慢,你就不要一个接口一次性返回所有 data ;
如果单个 chart 数据节点太多,一次性绘制 96 个太占资源,你就判断哪些出现在当前 viewport 才绘制哪个
lurenjiaMAX
2025 年 1 月 23 日
@crazyBlack 数据量没有多少 就是每隔一秒获取一次最新的数据 增量更新
Bologna
2025 年 1 月 23 日
一次性显示 96 个,这眼睛看的过来吗
lurenjiaMAX
2025 年 1 月 23 日
@Moierby 这是个好主意! 我测试只显示 4 个图的话是没有多大压力的
horizon
2025 年 1 月 23 日
先 measure ,再优化
moooooooo
2025 年 1 月 23 日
为什么要一次显示 96 个....一点交互都不讲究的?

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1107258

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX