0

我有一个视图,它有一个背景图像,并且CGPath随着用户触摸屏幕而改变。绘制图像CGContextDrawImage()然后在顶部绘制路径不够快,并且会阻碍触摸事件的性能。我想要的是有一个位图缓冲区,并且只绘制路径中的更改。因此,视图drawRect()将只是绘制缓冲区。我怀疑我需要使用CGContexts 但我不知道该怎么做。有没有其他优化方法?

编辑:

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

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

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

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

4

4 回答 4

1

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

于 2009-02-02T22:48:17.760 回答
0

实际上,这几乎就是它的工作方式。传递给 drawRect 的上下文绘制到 CALayer 中,该 CALayer 被缓冲,直到您执行需要视图重绘自身的操作。您提到“当用户触摸屏幕”时路径会更改 - 然后您是否在视图上设置 setNeedsDisplay ?

如果你真的每次都有不同的路径,那么你将无法缓冲它。如果它是相同的,只要你没有调用 setNeedsDisplay,或者会影响它被调用的东西,那么支持你的视图的层应该被缓冲。我在图层中有很多这样的视图,所有这些都有很多花哨的 CG 东西(绘制和填充路径、剪切图像、着色等),并且性能非常好。

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

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

于 2009-02-02T22:10:14.280 回答
0

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

有关更多信息,请参阅此 CocoaBuilder 线程

于 2009-02-02T23:19:49.007 回答
0

从您的编辑看来,您正在做某种绘图应用程序。

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

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

于 2009-02-05T14:18:03.777 回答