我使用 UIBezierPath 进行手指绘画(我的应用程序)。我使用 path = [UIBezierPath bezier path] 创建它;. 它在 iPad 上总是滞后(并且从 drawrect 中调用它并没有改变任何东西)。我已经为此工作了几个小时,但没有找到解决方案,只是滞后了。有人会这么好心来帮助我吗?另外,我正在使用 NSTimer 来调用该函数。这是我的应用程序的旧方式,所以请帮我解决这个问题!!!!!!!
2 回答
由于您的任何问题都没有包含足够的详细信息,因此我将做一些不恰当的事情并发布您 当前 最后 五个 问题的元答案。
首先,画在drawRect:
别处。
这太重要了,我要再说一遍。
画在drawRect:
别处。
不是touchesMoved:withEvent:
。
不是touchesBegan:
或Ended:
。
drawRect:
无处可去。
如果您正在制作要保存到文件的图像,那是一回事。但是,当您在屏幕上绘图时,除了drawRect:
.
严重地。这很重要。
第 2 步:不要试图在任何其他时间强制进行绘图。
drawRect:
当您需要绘画时,它会为您调用。根据定义,在任何其他时间,你都不需要画画,所以画画就是在做你不需要做的事情。通过扩展,不要打电话给drawRect:
自己。你不需要,它永远不会有帮助。
实际上,这只是第 1 步的扩展。如果调用drawRect:
,与调用的绘图代码相同。绘图代码不会到处重复,这很好,但它仍然在错误的时间运行。仅drawRect:
当系统调用它时才调用它。
setNeedsDisplay
存在是为了告诉系统是时候绘制了。当且仅当您需要绘制的内容发生了变化时,您才应该这样做。你的视图的属性,模型中的一些东西——当你要绘制的东西发生变化时,给你自己发送setNeedsDisplay
. 不要在其他任何时间这样做;你不需要。
剪掉计时器。你不需要它。无论如何,已经有一个计时器,将您限制为 60 fps。
核心图形不落后。不,真的,它没有。缓慢或“滞后”是因为要么你试图做太多事情,要么你做错了什么。
不要不必要地缓存。您所做的任何事情都不需要图像缓存。
“滞后”是因为您试图从touchesMoved:withEvent:
和/或touchesBegan:
/绘制或强制绘制Ended:
。往上看。
这是您需要做的:
在您的touchesBegan:
//方法Moved:
或Ended:
其他适当的响应者方法中,更新您的状态。这将包括贝塞尔路径。不要绘制,这包括不要调用drawRect:
或以其他方式尝试强制绘制。
在你更新你的状态之后,并且只有当你这样做了,给你自己发送setNeedsDisplay
.
在您的drawRect:
方法中,并且仅在您的drawRect:
方法中,绘制路径、渐变等任何您认为合适的方法。
做这些事情,你的应用程序会很快。使用核心图形。没有滞后。
另外,一些重要的阅读:
- 查看 iOS 编程指南
- 绘图 … iOS 编程指南
- Quartz 2D(核心图形)编程指南
- 性能概述(某些部分是 Mac OS X 特定的,但大部分也与 iOS 相关)
- 仪器用户指南
当必须根据对用户事件的响应重绘视图时,不要使用计时器定期重绘。
相反,使用setNeedsDisplay
或setNeedsDisplayInRect:
当您收到要求您重绘视图部分的触摸时使您的视图无效。
一个复杂的触摸绘图 iPad 应用程序可能需要很多实时渲染,尤其是当您过度绘制时。仅在需要时绘制。
另一种选择:分层工作
您的应用中可能没有撤消功能,因此它应该很容易实现。定期将您的图像合成为单个视图。当调用 draw rect 时,您可以绘制更少的路径(1 个大图像 + 更少的路径)。在这种情况下,缓存的支持位图肯定会有所帮助。
同样,您的帖子中没有太多细节,而且您还没有告诉我们分析器向您展示了什么。