优化一个iPhone SDK上的绘图(使用手指触摸)应用程序

6
我正在编写一个应用程序,使用手指绘制简单的图形。目前它基本能够工作,但我现在正在尝试优化其性能。当用户快速滑动手指时,我无法捕获足够的触摸事件来绘制平滑的路径。
以下是我的当前方法:
1)我创建了一个UIView的子类,并向其中添加了一个CGLayer属性(懒加载创建,大小与我的UIView相同)。 2)我的UIView子类通过将当前和上一个触摸点存储在实例变量中来响应触摸事件。 3)在drawRect中,执行以下操作: - 从上一个触摸位置到当前触摸位置绘制一条线到CGLayer - 将整个CGLayer一次性绘制到我的视图上下文中
主要问题是当用户快速滑动时,我只能获取相对较少的触摸事件,因此我在触摸之间绘制的线条很长,使路径看起来不平滑。
我的问题:
1)我的UIView子类的drawRect和触摸事件处理程序是否在同一线程中调用?也就是说,可能会有两个线程在执行(一个在触摸事件中,另一个在我的drawRect中)?
如果不是,请问在调用drawRect时是否会排队等待触摸事件?我该如何提高性能-只是改善drawRect的性能?
如果是,请问我如何获取更多的触摸事件,以便我可以绘制更平滑的路径?
谢谢。
5个回答

4

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


3

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

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


那么我的drawRect和touch事件处理程序都在主线程上被调用?您是在建议每次触摸事件发生时,我都应该启动一个新线程,并在该线程中进行绘图吗? - aloo
1
我建议只有一个工作线程。每当旧线程完成并且至少有一个新的触摸可用时,它就开始绘制。 - Nikolai Ruhe


1
Aloo,你有找到解决方案吗?我也遇到了同样的问题。我还发现了一个很棒的教程http://www.ipodtouchfans.com/forums/showthread.php?t=132024,但它也有同样的问题,如果你画得太快,比如画一个圆,那么画出来的效果就不是很平滑。这似乎是因为iPhone无法跟上速度,不幸的是这必须使用核心图形技术。

0

我尝试添加

CGContextSetLineJoin(UIGraphicsGetCurrentContext(), kCGLineJoinRound);

但这并没有什么作用。看起来我们需要弄清楚贝塞尔曲线。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接