是achartengine准备实时图形?(Is achartengine ready for rea

2019-07-17 21:46发布

我试图绘制一些实时数据,“实时”在这里是指<10毫秒的数据,最好尽可能低。 我已经能够得到Android的获取和处理数据,这个速度快,但ACE只是看起来像它没有被设计为心目中的实时使用。 首先的症状是垃圾收集踢像没有明天,完全杀死应用程序。 我在“滑动窗口”的方式可视化数据,所以它不喜欢我期待ACE实时几百点的千分之一的绘制。 我已经采取了看看它和OnDraw函数XYChart分配肯定非常沉重在它看起来像它的方便,很可能使代码更可读,但没有真正需要的情况下。 这甚至可能比它曾经是那么它可能还没有被注意到更糟。 我看到了漏洞修复问题#225解决的并发问题发生变化:

return mXY.subMap(start, stop);

对于:

return new TreeMap<Double, Double>(mXY.subMap(start, stop));

这创造了巨大的分配(由原始子图虽然仍支持)时,它可能会更好排队时的onDraw是怎么回事更新,以后再处理他们在该线路上的原子更新或东西,以避免并发问题。

这里真正可惜的,ACE肯定是足够快的我需要什么 。 它可以做什么,我需要对我的HW完美,但因为它分配如此严重重绘的Android去疯狂与GC。 它很快开始,而GC运行,因此必须等待和我的应用程序开始看起来像一个超炫动画短片分配。

真正的问题虽然是:是否合理期望能够对实时重绘4个或6 linecharts(平板电脑应用)(子200ms的刷新率)与ACE,或者它根本不是那种虐待的准备了吗? 如果答案是否定的。 任何其他选择,你会建议?

编辑20130109:修订471改进的东西相当多的小数据集。 2.000分/ 4图表/ 100毫秒刷新速率是可行的和光滑的。 日志仍然可以看到像疯了似的“解放GC_CONCURRENT”(约10 /秒),但没有“WAIT_FOR_CONCURRENT_GC封锁”,这是让喜欢你的应用程序停止运动的搅局者。 在3.000分/ 1图表/ 100毫秒它显然并不顺利。 我们再次获得“WAIT_FOR_CONCURRENT_GC封杀”上的logcat和口吃应用雪崩。 此外看起来我们没有一个速度问题,只有一个内存管理问题。

它可能看起来像我可能会问ACE做魔术,而是我打这堵墙重构所有的代码来检索和存储数据的遥测在1kHz之后。 有一次,我终于看到了我的应用程序检索和存储所有的实时的,而完全不触发GC我试图绘制:)当拉着我的头发,ACE

Answer 1:

首先感谢伟大的问题,并为你提出的观点的。 你是绝对正确的关于被下做了巨大的内存分配onDraw()方法。 我固定的,并在SVN的代码检查。 我还添加了一个同步块内onDraw()方法,诸如它有望不会抛出ConcurrentModificationException重新绘制期间将新数据添加到数据集时。

请结算从SVN的代码,以建立新的AChartEngine jar文件做一个蚂蚁DIST并在你的应用程序中嵌入它。 请参阅说明这里 。

要回答你的问题:AChartEngine绝对是准备动态图表。 您报告的问题是一个表明,塞,但应该已经得到解决。 我一直在使用它编写的动态图表。 但是,你需要确保你不将数据添加值的100000s的数据集。 旧数据可以从数据集,以获得性能被删除。

这绝对是合理的,如果他们有多达烤漆5个左右线图几个点1000。



Answer 2:

优化我的应用程序的一切了很大的努力后,我仍不能让它在我的理解为“实时”的情节。 图书馆是巨大的,而且速度非常快,但在每一个的onDraw不可避免地分配内存的方式触发垃圾收集的雪崩这与其自身的分配,因此Android的冻结您的应用程序瞬间造成口吃这与“实时”图形完全不符合碰撞。 在“口吃”这里的范围可以从50-250ms(是毫秒),但是这足以杀死一个实时的应用程序。

AChartengine将使就像只要你创建的“动态”的图表,你不需要他们是“实时”(10帧/秒,(<100毫秒刷新速率)或什么你会打电话来“平滑”)。

如果有人在这里需要对核心问题的详细信息,或者为什么我说,图书馆是速度不够快,但内存分配模式最终导致性能问题就来看看谷歌I /Ø2009年-编写实时游戏为Android



Answer 3:

好了,过了一段时间寻找另一个图形库我什么也没找到足够好:)这让我看看ACE再次和我最后做一个小补丁,从理想使其“可用”对我来说,虽然远。

在XYSeries.java我添加了一个新的方法:

/**
* Removes the first value from the series.
* Useful for sliding, realtime graphs where a standard remove takes up too much time.
* It assumes data is sorted on the key value (X component).
*/
public synchronized void removeFirst() {
  mXY.removeByIndex(0);
  mMinX = mXY.getXByIndex(0);
}    

我发现,记忆问题顶部那里有高速帧率一些真正的速度问题了。 我花90%左右的时间上的删除功能我删除其滚出的观点。 其原因是,当你删除一个MIN | MAX点ACE调用InitRange它遍历每个点重新计算的最小/最大点内部使用。 正如我处理每秒1000帧遥测和一个具有小的视区(由ACE存储器分配策略强制)我打最小/最大点非常经常remove函数。 我创建了用于去除一系列的将你添加一个点,这使得一个滚动出你的视口通常被立即调用的第一个点的新方法。 如果你点的键值(经典系列日期时间)来分类的话,可以调整mMinX所以视仍然看起来不错,做到这一点非常快。 我们不能更新MINY或美星快与当前执行的ACE(不,我看着就行),但如果你建立一个适当的初始范围也可能并不需要。 其实我手动从一次使用我有多余的信息,将该范围调整时间,因为我知道我在策划什么的正常范围是在不同的时间点。

所以,这可能是对别人不够好,但我坚持认为,内存分配重构仍然需要在ACE任何严重的实时图形。



文章来源: Is achartengine ready for realtime graphing?