什么是使它成为核心图形不落后的正确方法?

Asp*_*pyn 1 memory iphone core-graphics lag uikit

我使用UIBezierPath进行手指绘画(我的应用程序).我使用path = [UIBezierPath bezier path]创建它; .它经常滞后于iPad(并且从内部调用它并没有改变任何东西).我已经连续数小时研究这个问题并且没有找到解决方案,只是滞后.请问有人帮我吗?另外,我使用NSTimer来调用该函数.这是我的应用程序将工作的旧方式,所以请帮我修复这个lagggg !!!!!

Pet*_*sey 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:方法或其他适当的响应方法中,更新您的状态.这将包括Bézier路径.不要画,包括不要打电话drawRect:或以其他方式强行画画.

在您更新了州之后,只有在您这样做的情况下,发送给自己setNeedsDisplay.

在你的drawRect:方法中,只有在你的drawRect:方法中,绘制路径,渐变,等等,无论你认为合适.

做这些事情,你的申请会很快.使用核心图形.没有滞后.


另外,一些重要的阅读:

  • 这可能是最高的答案:我见过的问题质量比.布拉沃,彼得霍西. (2认同)