首先查看MPAndroidChart源中的DataSet
和BaseDataSet
類。
DataSet
支持一個簡單的清單Entry
。還要注意,MPAndroidChart需要知道xMin
,xMax
,yMin
和yMax
的內部計算結果,並將它們封裝在DataSet
對象中。
每次調用notifyDataSetChanged()
最小值/最大值是在DataSet
對象涉及循環訪問的Entry
整個背列表內重新計算時間。此外,添加一個無序的Entry
將觸發後臺列表迭代,以在列表中找到正確的位置。刪除Entry
將同樣觸發後臺列表的迭代。簡而言之,DataSet
對象僅針對添加已訂購的Entry
進行了優化。
如果您懷疑與512 Entry
創造新DataSet
對象是一個瓶頸,可以通過卸載到另一個線程進行優化,我建議你寫一個microbenchmark檢查採取重現DataSet
對象,並添加你Entry
時間想。雖然Android中的新對象分配很昂貴,但爲了計算最小/最大值,Entry
列表的實際迭代不會因爲CPU緩存和空間局部性而變得昂貴。如果您想要將新構造的DataSet
對象卸載到新線程(使用例如AsyncTask
),則必須在您的基準測試中證明從卸載到另一個線程的開銷足夠小,以證明您的努力。
調用mChart.setData(newDataSet)
之後,如果不對庫進行大量修改,就很少有多線程機會。您可以看到自己的控制流程:setData
觸發計算偏移和準備矩陣。計算偏移是簡單的浮點加法(便宜),轉換矩陣使用本機C++代碼(已經優化)處理。
當繪製View
時,必須在主/ UI線程上執行onDraw()
中的代碼。儘管所有這些看起來可能都不是最佳的,但與其他製圖庫相比,MPAndroidChart仍然可以實現高水平的性能,如this blog post中所見。通過調用mChart.setLogEnabled(true)
並檢查幀速率的logcat,您可以看到自己正在達到的幀速率。
如果您對所獲得的幀速率不滿意,可以考慮SciChart,它具有更好的性能。但請注意,同樣的許可費用。從這裏來的tl; dr在MPAndroidChart中只有一點點優化空間,如果性能是一個需求,你可能不得不看另一個庫。
謝謝。查看更新的問題。 –
好吧我認爲它具體到足以嘗試現在的答案 –