石英绘图优化

时间:2009-02-02 20:45:52

标签: cocoa-touch optimization quartz-graphics

我有一个视图,其背景图像和CGPath会在用户触摸屏幕时发生变化。使用CGContextDrawImage()绘制图像,然后在顶部绘制路径不够快,并且会妨碍触摸事件的性能。我想要的是有一个位图缓冲区,只绘制路径中的变化。因此,视图的drawRect()将只是绘制缓冲区。我怀疑我需要使用CGContext但我无法弄明白该怎么做。是否有不同的优化方法?

编辑:

每次用户触摸屏幕时,我都会添加到路径中;所以“路径更改”是指向现有路径添加更多点。这就是为什么我认为我可以缓冲图像并仅绘制路径的“delta”而不是每次都绘制整个事物。目前我的绘图和事件逻辑是这样的:

-(void)drawRect{
    //Draw the background image
    //Draw the whole path
}

-(void)touchesMoved{
    //Add the touch point to the path
    [self setNeedsDisplay];
}

以这种方式绘制背景会使触摸事件采样的性能明显低于仅绘制路径。

4 个答案:

答案 0 :(得分:1)

如果背景图像没有变化(我无法确定它是否存在),那么您应该将背景图像放在不同的CoreAnimation图层中,其中包含路径的图层位于其上。这让GPU可以处理合成,而不是在-drawRect中完成所有操作。然后可以在可能的情况下缓存背景图像,并且您唯一需要更新的是路径(您仍然可以避免完全重绘每个帧)。您还可以执行缩放或旋转路径等操作,而无需担心对背景图像的影响。

答案 1 :(得分:0)

实际上,这几乎就是它的工作方式。传递给drawRect的上下文绘制到一个CALayer,它被缓冲,直到你做一些需要视图重绘的东西。您提到路径已更改“当用户触摸屏幕时” - 您是否在视图上设置setNeedsDisplay?

如果你每次都有不同的路径,那么你就无法缓冲它。如果它是相同的,只要你没有调用setNeedsDisplay,或者影响它被调用的东西,那么应该缓冲支持你视图的层。我在层中有很多这样的视图,都有很多花哨的CG东西(绘图和填充路径,裁剪图像,色彩等等),性能很棒。

如果您有不同的路径(可能是表示,视觉,触摸) - 您可能想要考虑使用备用视图 - 它们本身不会更改 - 或者可能在单个预渲染视图上使用视图动画?

如果这些都没有达标,请发布更多信息以帮助我们了解您的目标。

答案 2 :(得分:0)

我不是100%肯定它在iPhone上以这种方式工作,但在相应的Mac OS X类中,setNeedsDisplay:实际上是同步的,因此昂贵的绘图操作可能会破坏循环的性能。尝试将绘图代码放在每秒执行几次的计时器上,而不是在事件处理代码中显式调用它。

有关详细信息,请参阅this CocoaBuilder thread

答案 3 :(得分:0)

从您的编辑中看起来您正在使用某种绘图应用。

在这种情况下,我会尝试“未知”的建议(将背景图片放在路径的单独图层/视图中)。事实上,无论如何我都会这样做。 你在使用CGPath吗?如果不是,也可能值得这样做。

如果你仍然有问题,可能值得将当前的“编辑”(快速连续绘制的任何行)分离到他们自己的路径中(在他们自己的图层/视图中),并在适当的空闲时段(使用计时器)后将它们添加到主路径。