1

我使用 UIBezierPath 进行手指绘画(我的应用程序)。我使用 path = [UIBezierPath bezier path] 创建它;. 它在 iPad 上总是滞后(并且从 drawrect 中调用它并没有改变任何东西)。我已经为此工作了几个小时,但没有找到解决方案,只是滞后了。有人会这么好心来帮助我吗?另外,我正在使用 NSTimer 来调用该函数。这是我的应用程序的旧方式,所以请帮我解决这个问题!!!!!!!

4

2 回答 2

10

由于您的任何问题都没有包含足够的详细信息,因此我将做一些不恰当的事情并发布 当前 最后 五个 问题的元答案。

首先,画在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:方法中,绘制路径、渐变等任何您认为合适的方法。

做这些事情,你的应用程序会很快。使用核心图形。没有滞后。


另外,一些重要的阅读:

于 2011-10-03T03:10:19.443 回答
1

当必须根据对用户事件的响应重绘视图时,不要使用计时器定期重绘。

相反,使用setNeedsDisplaysetNeedsDisplayInRect:当您收到要求您重绘视图部分的触摸时使您的视图无效。

一个复杂的触摸绘图 iPad 应用程序可能需要很多实时渲染,尤其是当您过度绘制时。仅在需要时绘制。

另一种选择:分层工作

您的应用中可能没有撤消功能,因此它应该很容易实现。定期将您的图像合成为单个视图。当调用 draw rect 时,您可以绘制更少的路径(1 个大图像 + 更少的路径)。在这种情况下,缓存的支持位图肯定会有所帮助。

同样,您的帖子中没有太多细节,而且您还没有告诉我们分析器向您展示了什么。

于 2011-10-03T02:07:15.497 回答