优化iPhone SDK的绘图(带手指触摸)应用程序

时间:2009-07-14 03:25:03

标签: iphone uikit drawing quartz-graphics

我正在编写一个使用手指绘制简单图表的应用程序。我大部分都在工作,但现在我正在努力优化其性能。当用户快速滑动手指时,我无法捕获足够的触摸事件来绘制平滑的路径。

这是我目前的做法:

1)我将UIView子类化并在CGLayer中添加了一个poroperty(懒得创建并且与我的UIView大小相同)。 2)我的UIView子类通过在实例变量中存储当前和最后的触摸点来响应触摸事件。 3)调用我的视图的setNeedsDisplay,并在绘制rect中执行以下操作: - 从上一个触摸位置到CGLayer的当前触摸位置绘制一条线 - 一次性将整个CGLayer绘制到我的视图上下文

主要问题是当用户快速滑动时我得到的触摸事件相对较少,因此我在触摸之间绘制的线条较长,使得路径锯齿状不平滑。

我的问题:

1)我的UIView子类上的drawRect(在我的UIView子类上)和我的触摸事件处理程序是否在同一个线程中被调用?即我可以执行线程(一个在触摸事件中,第二个在我的绘制rect中)?

如果没有 - 在调用drawRect时,触摸事件是否排队?我怎样才能提高性能 - 只是提高drawRect的性能?

如果是 - 我怎样才能获得更多触摸事件,以便我可以画出更平滑的路径?

感谢。

5 个答案:

答案 0 :(得分:4)

另一种方法是在采样点之间插入曲线。当手指拖动开始时,开始收集样本点。随着点数的增加,重新划线。用两个点绘制一条直线,用三条或更多条绘制一条曲线。当采样位于定义距离内的两个点时,您可以重新启动该过程。这将允许您在一个动作中绘制两个弧(如“m”) - 当您改变方向时,您自然会在中间停顿,可能足够长到两个或更多个样本。

答案 1 :(得分:3)

在主线程上调用drawRect。但你不必这样做。您可以使用主线程来收集UI事件并在后台线程上进行绘制。只要有新的触摸,后台线程就会得到通知,并在自己的CGBitmapContext中启动绘图操作。然后创建一个CGImage并将其交给View:view.layer.contents = drawingImage

如果您需要更高的性能,请考虑使用OpenGL绘图。

答案 2 :(得分:1)

Aloo,你有没有找到解决方案,因为我遇到了同样的问题。我还发现了一个非常好的教程http://www.ipodtouchfans.com/forums/showthread.php?t=132024,但它也有同样的问题,如果你快速绘制,比如一个圆圈,绘图不是很平滑。它几乎就像iPhone无法跟上,遗憾的是这必须使用核心图形的东西。

答案 3 :(得分:1)

答案 4 :(得分:0)

我尝试添加

CGContextSetLineJoin(UIGraphicsGetCurrentContext(), kCGLineJoinRound);

但这没有做任何事。看起来我们必须弄清楚贝塞尔曲线