2013-02-16 96 views
1

當更改圖表上的某些東西時,如myChart.addSeries(mySeriesObj)重繪究竟是幹什麼的?

myChart.get("myPointId').update(50);默認行爲是調用重繪函數。

現在,假設我在該圖表上有3個系列(系列A,系列B,系列C),並且我剛更新了系列A中的1個點。是否會非常快速地重繪所有圖表(系列A,系列B,系列C,軸線,標籤等),還是僅僅是新點?

Highchart是否適用於圖層或全部在同一個「框架」中?

我在問這個,因爲我打算使用大於1000點的系列,我知道在Highchart上使用大數據時可能會出現一些性能問題(我已經看到在啓用marker.states.hover選項或提示選項)

回答

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()還有其他一些代碼段。主要用於重繪軸和傳說等其他東西。似乎這些邏輯大部分都是基於類似的邏輯重新繪製的,因此不應該成爲性能威懾。但是,如果性能真的是一個關鍵因素,您可以撥打point.update()並使用第二個參數false,這將跳過隱含的chart.redraw()調用,因此會跳過其中的所有內容。然後,您可以明確地打電話給您希望更新的特定系列(該點所屬的系列)series.redraw()方法。
注意:這將不會重新繪製軸(和其他東西),如果點的更新值超出當前軸的極值,可能需要重繪軸。 series.redraw()也沒有在文檔中列出,可能表明使用它是不鼓勵的,並可能產生意想不到的結果。
我會在99%的情況下采用chart.redraw()的方式,因爲大部分時間表現都非常可以接受。

參考文獻:
point.update() api reference
Demo @ JsFiddle

+0

謝謝,你能指出我對這個問題的某種參考嗎? (我沒有在他們的api文檔中找到一個) – 2013-02-17 17:33:43

+0

@yoavbarnea,檢查更新的答案 – 2013-02-17 19:44:46

+0

非常全面,你當然對這個問題有所瞭解。謝謝 – 2013-02-17 22:31:31

0

我有一些麻煩Highchart性能負載> 1000點的健身數據序列(如心臟速率,速度等)。我發現在劇情Highcharts example中禁用標記可以顯着提升性能。我也禁用了動畫。

我在我的解決方案上運行了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比最快的反向循環慢了85%

+0

感謝您的responde,但什麼這是什麼意思? Highchart是否適用於圖層,或全部在同一個「框架」中?我知道禁用'marker.states.hover'會提高性能。但我真的不想放棄這個功能。 – 2013-02-17 11:40:48

0

從源代碼:

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