2

我正在尝试使用 CoreGraphics 在地图上绘制雷达数据。之前,我试图通过围绕每个单独的数据点创建路径然后填充适当的颜色来单独绘制每个数据点。所以对于这种方法,我必须有 4 个位置点和每个数据点的数据值。这样做结果证明成本太高,因为每张图像有 30,000 到 80,000 个数据点。

雷达数据以径向格式存储(360 个径向,每个包含 230 个数据点)。因此,我没有遍历每个数据点,而是仅遍历径向线。而不是每个数据点周围的路径,我有每个径向周围的路径。然后,我使用该特定渐变的颜色数组创建并绘制线性渐变 (CGGradientCreateWithColors)。

这种方法绘制速度比以前快很多,但仍然不够快。另一个问题是放大时数据的“平滑度”。渐变在径向中的每个数据点之间混合,因此您看不到单个像素。我不希望它这样做。我认为这是我最大的性能损失来自(计算每个数据点之间的梯度)。我宁愿将每个数据点绘制为离散的颜色。这看起来会更好,它应该表现得更好。

有没有办法为路径提供一组颜色(类似于我对渐变所做的),这将离散地绘制它们。我需要能够绘制这个而不必返回绘制单个数据点。

提前谢谢你,罗斯

编辑

第一张图片是我绘制的原始方式(通过单独绘制每个数据点)。这就是我希望它最终的样子。

第二张图是梯度,比之前效率高(虽然效率不够),但看起来不太对劲。

这个

这是使用渐变。 请注意颜色如何沿径向混合,而不是显示每个单独的数据点。

4

1 回答 1

1

我无法完全描绘出您要绘制的内容(很难想象在 iPhone 屏幕上绘制 80,000 个任何东西,并且每个东西都大于一个像素......)但这里有一些想法。

首先,如果你有一个一致的东西要反复画,把它放在一个CGLayer. 不是一个CALayer,一个CGLayer。这是一个硬件优化的对象,用于重复“标记”相同的东西。如果您需要更改颜色甚至应用渐变,您可以使用蒙版或通过合成 a 来应用它们CGImage(如果您可以重用生成的图像而无需缩放任何东西,后者通常会更快)。

尽可能预先计算梯度并将它们存储在数据结构中。尝试计算它们drawRect:通常会影响性能。同样,预先计算您的路径,这样您就不必在每次绘制时都构建它们。

如果您可以避免缩放图层,则可以将其设置shouldRasterizeYES,这通常会在您拥有复杂图层时提高性能。另一方面,如果您需要进行缩放或其他变换,那么在 a 上绘制CALayer并应用所需的变换可能会非常快。你也可以对整体应用变换UIView,但是如果你需要对许多单独的东西进行变换,那么这CALayer就是全部。(对于前面的观点,您当然可以将 a 绘制CGLayer到 a 上CALayer。)

我不明白您所说的“离散”绘制路径是什么意思。路径是由控制点定义的连续线。


编辑:根据您的编辑,我建议尝试使用索引色彩空间 ( CGColorSpaceCreateIndexed())。这样,您的渐变不应包含中间颜色,并且整个绘图的计算速度应该更快。

你也应该看看CGShading。(我相信它适用于 iOS 而不仅仅是 Mac。)它可能比CGGradient.

于 2011-07-28T19:27:52.660 回答