我正在尝试使用CoreGraphics在地图上绘制雷达数据。之前,我试图通过围绕每个单独的数据点创建路径然后填充适当的颜色来单独绘制每个数据点。因此,对于这种方法,我必须有4个位置点和每个数据点的数据值。这样做的结果太昂贵了,因为每张图片有30,000到80,000个数据点。
雷达数据以径向格式存储(360个径向,每个包含230个数据点)。因此,我只是循环遍历径向,而不是遍历每个数据点。而不是围绕每个数据点的路径,我有一个围绕每个径向的路径。然后,我使用该特定渐变的颜色数组创建并绘制线性渐变(CGGradientCreateWithColors)。
这种方法绘制速度比以前快很多,但仍然不够快。另一个问题是当我放大时数据的“平滑度”。渐变在径向中的每个数据点之间混合,因此您无法看到单个像素。我不希望它这样做。我认为这是我最大的性能影响来源(计算每个数据点之间的梯度)。我宁愿将每个数据点绘制为离散颜色。这看起来会更好,而且应该表现得更好。
有没有办法为路径提供一系列颜色(类似于我对渐变的颜色),它将离散地绘制它们。我需要能够绘制它而无需返回绘制单个数据点。
提前谢谢你, 罗斯
修改
第一张照片是我正在进行绘图的原始方式(通过单独绘制每个数据点)。这就是我希望它最终看起来的样子。
第二张图片是渐变,它比以前效率更高(尽管效率不够),但看起来并不正确。
答案 0 :(得分:1)
我很难想象你想要绘制什么(很难想象在iPhone屏幕上绘制80,000个任何东西并且每个东西都比像素大......)但这里有一些想法你的方式。
首先,如果您要反复绘制一致的内容,请将其放在CGLayer
上。不是CALayer
,而是CGLayer
。这是一个硬件优化的对象,用于反复“标记”同一件事。如果您需要更改颜色甚至应用渐变,您可以使用蒙版或合成CGImage
来应用这些(如果您可以重复使用生成的图像而不必缩放任何内容,则后者通常会更快)。
尽可能预先计算渐变并将其存储在数据结构中。试图在drawRect:
中计算它们往往是一个重大的性能影响。同样,预先计算您的路径,这样您就不必在每次绘制时都构建它们。
如果您可以避免缩放图层,则可以将shouldRasterize
设置为YES
,这通常会在您拥有复杂图层时提高性能。另一方面,如果您需要进行缩放或其他变换,那么绘制CALayer
并应用所需的变换可能会非常快。您也可以将变换应用于整个UIView
,但是如果您需要转换大量单独的内容,那么这就是CALayer
的全部内容。 (在早些时候,您当然可以在CGLayer
上绘制CALayer
。)
通过“离散地”绘制路径,我不明白你的意思。路径是由控制点定义的连续线。
编辑:根据您的修改,我建议尝试的是索引颜色空间(CGColorSpaceCreateIndexed()
)。这样,您的渐变不应该包含中间颜色,并且整个绘图上的计算应该更快。
您还应该查看CGShading
。 (我相信它适用于iOS,而不仅仅是Mac。)它可能比CGGradient
更接近你想要的。