6

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

这是我目前的方法:

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

主要问题是当用户快速滑动时,我得到的触摸事件相对较少,因此我在触摸之间绘制的线条很长,并且使路径看起来参差不齐。

我的问题:

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

如果不是 - 在调用 drawRect 时触摸事件是否排队?以及如何提高性能 - 只需提高 drawRect 的性能?

如果是 - 我怎样才能让更多的触摸事件发生,以便我可以绘制更平滑的路径?

谢谢。

4

5 回答 5

4

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

于 2009-07-14T10:13:29.697 回答
3

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

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

于 2009-07-14T09:41:50.853 回答
1

Aloo,你有没有找到他的解决方案,因为我有同样的问题。我还找到了很棒的教程http://www.ipodtouchfans.com/forums/showthread.php?t=132024但它也有同样的问题,如果你画得很快,比如画一个圆圈,画得不是很流畅。它几乎就像 iPhone 跟不上,不幸的是这必须使用核心图形的东西。

于 2009-08-07T13:00:16.737 回答
0

我尝试添加

CGContextSetLineJoin(UIGraphicsGetCurrentContext(), kCGLineJoinRound);

但这什么也没做。看起来我们必须弄清楚贝塞尔曲线

于 2010-10-19T10:44:55.077 回答