1

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

myChart.get("myPointId').update(50);默认行为是调用重绘函数。

现在,假设我在该图表上有 3 个系列(系列 A、系列 B、系列 C),而我刚刚更新了系列 A 中的1 个点。它会非常快地重绘所有图表(seriesA、seriesB、seriesC、轴、标签等),还是只是新点?

Highchart 是否与图层一起使用,或者都在同一个“框架”中?

我问这个是因为我将使用大于 1,000 点的系列,并且我知道在 Highchart 上使用大数据时可能会出现一些性能问题。(我已经看到启用marker.states.hover时性能会变慢选项或工具提示选项)

4

4 回答 4

2

据我了解,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()使用第二个参数调用 as false,这将跳过隐式chart.redraw()调用,从而跳过其中的所有内容。然后,您可以显式调用series.redraw()您希望更新的特定系列(该点所属的系列)上的方法。
注意:这不会重绘轴(和其他东西),如果点的更新值超出当前轴的极值,则可能需要重绘。还有series.redraw()未在文档中列出,可能表明不鼓励使用它并可能产生意外结果。
在 99% 的情况下,我会采用这种chart.redraw()方式,因为大多数时候性能是可以接受的。

参考资料:
point.update()api参考
Demo@JsFiddle

于 2013-02-17T15:28:02.817 回答
1

From the source code:

/**
 * Redraw legend, axes or series based on updated data
 *
 * @param {Boolean|Object} animation Whether to apply animation, and optionally animation
 *    configuration
 */
 redraw: function (animation) {
于 2013-02-19T17:06:12.317 回答
0

您还可以使用点更新()函数http://api.highcharts.com/highstock#Point.update()

于 2013-02-18T10:09:46.860 回答
0

我在加载 > 1000 点健身数据系列(如心率、速度等)时遇到了一些问题。我发现在情节Highcharts 示例中禁用标记,提供了相当显着的性能提升。我也禁用了动画。

我在我的解决方案上运行了 chrome 分析器,发现在准备渲染期间调用了 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;
                    }
                }
            };

我听说forEach 比for 循环慢,所以我注释掉了forEach 的默认选择。在jsperf for vs foreach上进行测试,在我的机器环境中显示 foreach 比最快的反向 for 循环慢 85%

于 2013-02-17T10:28:41.907 回答