Highcharts 重画到底是做什么的?

Highcharts 重画到底是做什么的?,highcharts,Highcharts,更改图表上的某些内容时,如myChart.addSeries(mySeriesObj)或 myChart.get(“myPointId”).update(50);默认行为是调用redraw函数 现在,假设我在该图表上有3个系列(seriesA、serieb、seriesC),我刚刚在seriesA中更新了1个点。它会很快地重新绘制所有图表(seriesA、serieb、seriesC、轴、标签等),还是只重新绘制新的点 Highchart是与层一起工作,还是都在同一个“框架”中? 我这样问是因为

更改图表上的某些内容时,如
myChart.addSeries(mySeriesObj)

myChart.get(“myPointId”).update(50);
默认行为是调用redraw函数

现在,假设我在该图表上有3个系列(seriesA、serieb、seriesC),我刚刚在seriesA中更新了1个点。它会很快地重新绘制所有图表(seriesA、serieb、seriesC、轴、标签等),还是只重新绘制新的点

Highchart是与层一起工作,还是都在同一个“框架”中?


我这样问是因为我要处理大于1000点的系列,我知道在Highchart上使用大数据时可能会出现一些性能问题。(我已经看到,启用标记.states.hover选项或工具提示选项时,性能会降低)

我在Highchart performance loading>1000点体能数据系列(如心率、速度等)方面遇到了一些问题。我发现禁用绘图中的标记可以显著提高性能。我还禁用了动画

我在我的解决方案上运行了chrome profiler,发现highcharts.src.js中的每个函数都是在准备渲染时调用的

    this.each =
            //Array.prototype.forEach ?
        //  function (arr, fn) { // modern browsers
        //      return Array.prototype.forEach.call(arr, fn);

        //  } : 
            function (arr, fn) { // legacy
                var i = 0, 
                    len = arr.length;
                for (; i < len; i++) {
                    if (fn.call(arr[i], arr[i], i, arr) === false) {
                        return i;
                    }
                }
            };
this.each=
//Array.prototype.forEach?
//函数(arr,fn){//现代浏览器
//返回Array.prototype.forEach.call(arr,fn);
//  } : 
函数(arr,fn){//legacy
var i=0,
len=arr.长度;
对于(;i

我听说forEach比for loop慢,所以我已经注释掉了forEach的默认选择。在上进行的测试表明,在我的机器环境中,forEach比最快的for loop反向速度慢85%

据我所知,Highcharts很可能只会重新绘制脏组件(在您的情况下,该点所属的系列)

chart.redraw()
源代码的某些部分如下所示

// redraw affected series
each(series, function (serie) {
    if (serie.isDirty && serie.visible &&
            (!serie.isCartesian || serie.xAxis)) { // issue #153
        serie.redraw();
    }
});
调用
point.update()
时,只有该点所属的序列被标记为脏。因此在下一次
chart.redraw()调用中会重新绘制,而其他点未更新的序列则不会重新绘制

话虽如此,在
chart.redraw()中还有其他一些代码
除上述内容外。主要用于重新绘制轴和图例以及其他内容。似乎大多数这些内容也是基于类似的
isDirty
逻辑重新绘制的,因此不应成为性能的制约因素。但如果性能真的是一个关键因素,则可以调用
point.update()
第二个参数为
false
,这将跳过隐式的
chart.redraw()
调用,从而跳过其中的所有内容。然后,您可以对要更新的特定序列(该点所属的序列)显式调用
series.redraw()
方法。
注意事项:这不会重新绘制轴(和其他物体),如果点的更新值超出当前轴的极限值,则可能需要重新绘制轴。此外,
series.redraw()
未在文档中列出,可能表明不鼓励使用它,并可能产生意外结果。
在99%的情况下,我会使用
chart.redraw()
方法,因为大多数情况下性能都是可以接受的

参考文献:


您还可以使用源代码中的point update()函数

/**
 * Redraw legend, axes or series based on updated data
 *
 * @param {Boolean|Object} animation Whether to apply animation, and optionally animation
 *    configuration
 */
 redraw: function (animation) {

感谢您的回复,但这意味着什么?Highchart是与层一起工作,还是在同一个“框架”中工作?我知道禁用
标记.states.hover将提高性能。但我不想放弃此功能。谢谢,您能给我指一些关于该主题的参考资料吗?(我在他们的api文档中找不到)非常全面,你肯定对这个问题有一些了解。谢谢