我正在尝试绘制一些实时数据,这里的“实时”意味着 < 10 毫秒的数据,理想情况下尽可能低。我已经能够让 Android 如此快速地获取和处理数据,但 ACE 看起来并不是为实时使用而设计的。第一个症状是垃圾收集器像没有明天一样启动并完全杀死应用程序。我正在以“滑动窗口”方式可视化数据,因此我并不期望 ACE 实时绘制千分之几的点。我已经看过它,并且 XYChart 的 onDraw 在看起来很方便并且可能使代码更具可读性但并不是真正需要的情况下肯定会分配非常多的。这甚至可能比以前更糟,所以它可能还没有被注意到。
return mXY.subMap(start, stop);
为了:
return new TreeMap<Double, Double>(mXY.subMap(start, stop));
这会创建巨大的分配(尽管仍然由原始 subMap 支持),当 onDraw 正在进行时将更新排队并稍后在原子更新或该行上的某些东西上处理它们可能会更好,以避免并发问题。
真正的遗憾是ACE 的速度确实足够满足我的需要。它可以完美地在我的硬件上完成我需要的工作,但是由于它在重绘上分配了如此多的资源,因此 Android 对 GC 感到很疯狂。它很快就会在 GC 运行时开始分配,所以它必须等待,我的应用程序开始看起来像定格动画电影。
但真正的问题是:期望能够使用 ACE 实时(低于 200 毫秒的刷新率)重新绘制 4 或 6 个折线图(平板电脑应用程序)是否合理,或者它根本没有为这种滥用做好准备?如果答案是否定的。您还有其他选择吗?
编辑 20130109: 修订版 471 对小型数据集进行了相当大的改进。2.000 点 / 4 个图表 / 100 毫秒刷新率是可行且流畅的。日志仍然会疯狂地看到“GC_CONCURRENT freed”(大约 10/秒),但没有“WAIT_FOR_CONCURRENT_GC blocked”,这是让您的应用停止运动的表现。在 3.000 点/1 个图表/100 毫秒时,它显然不平滑。我们再次在 logcat 和口吃应用程序上遇到“WAIT_FOR_CONCURRENT_GC 被阻止”的雪崩。再次看起来我们没有速度问题,只有内存管理问题。
看起来我可能会要求 ACE 变魔术,但在重构所有代码以检索和存储 1KHz 的遥测数据后,我碰上了这堵墙。一旦我终于看到我的应用程序在完全不触发 GC 的情况下实时检索和存储所有这些内容,我在尝试绘制图表时用 ACE 拉扯我的头发:)