2009-07-14 57 views
6

我在写一个应用程序,它使用您的手指绘制简单的图表。我有它的大部分工作,但现在我试图优化其性能。当用户快速挥动手指时,我无法捕捉足够的触摸事件来绘制平滑的路径。为iPhone SDK优化绘图(带手指触摸)应用程序

这是我目前的做法:

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

的主要问题是,当用户扫描快,我得到相对较少的触摸事件,所以我在触摸之间绘制线条很长,使得路径看锯齿状不顺利。

我的问题:

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

如果没有 - 做触摸事件被排队时被调用的drawRect?我该如何提高性能 - 简单地提高drawRect的性能?

如果是的话 - 我怎样才能得到更多的触摸事件发生,所以我可以得出一个平滑的路径?

谢谢。

回答

4

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

3

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

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

+0

所以我的drawRect和我的触摸事件处理程序都得到所谓的主线程上? 你是否建议每次触摸事件发生时,我应该开始一个新的线程,并在该线程中做我的绘图? – aloo 2009-07-14 17:19:10

1

乌尔都语童谣,你必须找到一个解决方案,以他作为我有同样的问题。我也发现agreat教程http://www.ipodtouchfans.com/forums/showthread.php?t=132024但它也有同样的问题,如果你快速绘制,说一个圆圈,绘图不是很平滑。它几乎像iPhone一样无法跟上,不幸的是这必须使用核心显卡。

0

我尝试添加

CGContextSetLineJoin(UIGraphicsGetCurrentContext(), kCGLineJoinRound); 

但什么也没做。看来我们得弄清楚贝塞尔曲线

相关问题