我尝试创建10个折线图,所有这些都有3000点,300 * 300 svg大小。它崩溃了我的浏览器,我检查了任务管理器,google渲染器疯狂,内存利用率为1.2G,CPU利用率为100%。
答案 0 :(得分:2)
对于这样的事情,没有简单的解决方案。您可以仔细检查您的代码并使其尽可能高效,但无论如何,如果您的代码需要在一个“线程”中执行数十万次操作,那么事情就会冻结。
避免这种冻结的一般解决方案是将绘图过程拆分为较小的任务,您可以异步调用(即从setTimeout
内部)。这样浏览器在运行JS代码时不会长时间锁定,也许(我不是专家)垃圾收集器也有机会在中途清理。
结果不是更快的整体绘制时间,但对于用户来说“感觉”更快,因为浏览器不会冻结。您甚至可以添加进度条。
某些绘图操作无法分解为子任务。例如,您无法拆分生成图表路径定义的d3函数svg.line()
。但是,您可以拆分10个图表的绘图代码,以便在setTimeout
的每个刻度上一次绘制一个图表。您也可以类似地从实际绘图中分离数据的准备。
我写了一个不同场景的答案,但这里有一个类似的问题:CSS transitions blocked by JavaScript