【问题标题】:Draw radial data on iPhone using CoreGraphics使用 CoreGraphics 在 iPhone 上绘制径向数据
【发布时间】:2011-07-28 17:00:36
【问题描述】:

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

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

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

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

提前谢谢你, 罗斯

编辑

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

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

【问题讨论】:

  • 这是现在商店里的应用吗?
  • 是的,它叫Storm Spotter

标签: iphone core-graphics radial


【解决方案1】:

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

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

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

如果您可以避免缩放图层,可以将它们的shouldRasterize 设置为YES,这通常会在您有复杂图层时提高性能。另一方面,如果您需要进行缩放或其他变换,那么在CALayer 上绘图并应用所需的变换会非常快。您还可以对整个 UIView 应用转换,但如果您需要转换许多单独的东西,那么这就是 CALayer 的全部意义所在。 (前面一点,你当然可以在CALayer 上画一个CGLayer。)

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


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

您还应该查看CGShading。 (我相信它适用于 iOS 而不仅仅是 Mac。)它可能比 CGGradient 更接近你想要的。

【讨论】:

  • 应该可以。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-13
相关资源
最近更新 更多