Android系列简化

时间:2012-03-04 16:02:07

标签: android

我正在寻找一些最佳实践建议。

我创建了一个应用程序(非常像mytracks),可以收集GPS测量值并将其显示在地图上。我希望能够以10秒的间隔记录理想的24小时GPS数据。这是很多数据,所以我没有将它保存在内存中,我将它存储到SQLiteDB中。在draw()函数内部,我选择所有内容并将其绘制为Path对象。

我的上述方法效果很好,直到我有> 4小时的数据。然后绘制函数需要永远执行,这使得应用程序看起来非常慢。

我认为我需要做的是在地图上绘制一个简化的轨迹。我的问题是这样做的最佳方法是什么。

i)处理器繁重:在draw()中选择SQLiteDB中的所有内容,构建简化的轨迹,在地图上绘制。

ii)内存沉重:在内存中保持简化的轨迹,在新数据到达时更新它,在draw()中将其绘制到地图上。

iii)魔术:使用一些我不知道的特殊OverlayLay来处理行简化。

亲切的问候, 卡瑟尔

2 个答案:

答案 0 :(得分:1)

我最初的半随机想法:

  1. 您没有说您实际上是这样做的,但每个数据库表行存储一个样本。 24小时样品间隔10秒,即8640个样品。每个样本是2个双精度数,即16个字节。一天的数据是135KB,这个数字可以很容易地完全适合内存。您的数据库策略应该是让一个表行对应一个采样周期,其最大长度为一天。不用说,样本数据应该在BLOB字段中。

  2. 绘制路径:这取决于当前地图缩放以及样本集的哪些部分可见。您要做的第一件事就是迭代您的样本集(最大8640)并确定在当前缩放处可见的子集。这应该是一个非常快速的操作。可以说,为了示例5000,可见。然后根据h / w假设为路径选择一些最大数量的样本...用空气中的数字选择一个数字,假设不超过500个样本用于路径(即设备不会很难绘制路径500分)。因此,您使用每10个样本(5000/500 = 10)构建路径,并确保包含可见集的第一个和最后一个样本。

  3. 请注意,您不会每帧都执行 all 此工作。您只需在用户完成平移或缩放地图时重新计算路径。其余的时间你只是绘制你已经计算过的路径。

答案 1 :(得分:0)

奇怪的是,我只是在看大约5年前写的代码做类似的代码。

以下是我经历的步骤:

  • 将数据集简化仅显示可见细节。我设计了几种可插拔的简化策略,但是有一个通用的公差接口,可以输入/输出要渲染的点。更多关于如何设计它的信息如下。

  • 缓存简化点列表的紧凑,快速访问版本。对于大数据集,尽可能多地使用基元是有帮助的,而不是Point对象。对于double精度位置,每点需要128个字节,或10,000个内存需要~1.3 MB。

  • 高效渲染,无需创建垃圾。迭代通过int和float / double数组的x和y坐标是最好的,使用一个紧密的渲染循环,尽可能在循环之外。如果它只是“绘制这条路径”,你将会惊叹你可以一次渲染多少点。

  • 在添加新点时通知简化器,并在将它们添加到缓存点列表之前运行新点。根据需要更新它,但尝试只处理最新的。

简化界面 有很多方法可以实现这一点。最好的一个(对于巨大的点集)是给它一个Iterator<Point>并让简化算法与它一起工作。这样,这些点不必都在内存中,您可以从数据库查询中提供它们。例如,Iterator可以包装JDBC ResultSet。简化器还应具有“容差”值,以确定在忽略点之前的接近点。

如何简化点集/折线: 有很多算法。

  • 最简单的方法是从最后一个包含的点中删除小于$ tolerance的点。这是一个O(n)实现。

  • Douglas-Peucker算法在大点集上提供了出色的多边形简化。缺点是你需要对内存中的点进行操作;一次批量使用它,比如10,000个点。以O(n log n)平均值运行,O(n ^ 2)最坏情况

  • 花式2D哈希:您可以使用2D哈希算法,每个像素可以输入一个条目。映射到占用槽的点不会被渲染。为此,您需要两次运行点,以找到返回相同点的点,如果渲染线而不是散点图。

额外提示:

  • 您可以通过创建一个包装器来提升性能,该包装器将缓存的简化点列表映射到图形基元可以轻松处理的内容。我使用的是Swing,因此我创建了一个像可变的Path2D一样的东西,渲染上下文可以直接处理。

  • 使用您的原语。说真的,我不能说这个。如果你使用对象存储内存,128字节/点可以加倍,并增加内存使用和它不能编译成这样的最佳代码。

使用这些策略,可以一次渲染数百万个点(缩小形式)。如果我没记错的话,我可以实时运行简化程序,一次运行10k +点,使用好的代码。它可能是100k +点。如果您可以存储每个像素一个插槽的哈希表,那么哈希实现速度非常快(我知道,这是我最快的解决方案)