首先查看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中只有一点点优化空间,如果性能是一个需求,你可能不得不看另一个库。
谢谢。查看更新的问题。 –
好吧我认为它具体到足以尝试现在的答案 –