2011-05-21 238 views
2

我正在制作一款游戏,并且我使用CAEAGLLayer支持的UIView子类来呈现游戏引擎。触摸处理使用-touchesBegan:withEvent: et。人。为什么我的iPad触摸事件被延迟(有时达到一秒)?

一切工作正常,除非很少,如果其中一个屏幕控件快速轻敲,-touchesBegan:withEvent:不会被调用的某个地方在0.1和1-2秒之间。这种情况可能发生在20次之内,并且只有在您首先快速点击屏幕(4-5次)时才会发生。如果我还在屏幕上的另一个控件上按住另一个手指,似乎更有可能发生这种情况。

认为这是我自己的代码,我分类UIApplication,所以我可以添加一个日志语句-sendEvent:。当触碰发生时,-sendEvent:在触摸开始后的某段时间才会被调用,所以它在我的UIView子类中的触摸处理代码似乎没有错。

有没有人有任何想法这里发生了什么(除了iOS有一些晦涩的bug)?是否有某种内部的“事件队列”让事件传递在填满时变得迟缓?有没有其他人经历过这个?

+0

您是否在这些附近使用了'UIGestureRecognizers'?或者只是原始的'touchesBegan:withEvent:'等等?当我要求手势识别器在发射前失败时,我也一样。 – 2011-05-21 10:24:15

+0

我没有使用或添加任何'UIGestureRecognizer's,它都是'-touchesBegan:withEvent:'。 '[UIApplication sendEvent:]'本身被延迟了,这比我的触摸处理代码要低得多。看起来像更基本的事情是导致这个问题。 – 2011-05-21 10:27:38

+1

触摸事件可以通过阻塞主线程的任何方法来延迟;您可以分析并确定您没有对主要进行密集操作吗?如果触摸事件时间是非常重要的,那么我建议只做主要的UI绘图。 – 2011-05-21 12:18:47

回答

1

触摸事件仅在主UI运行循环中分派,有时仅在主运行循环闲置一段时才分配。因此,如果您的应用程序忙于在一行中处理多个先前的触摸事件而不中断,则主UI界面运行循环可能已饱和,因此在用当前的东西完成之前不会进行任何进一步的触摸事件。

触摸事件也有时间戳。因此,如果您希望应用程序保持最大响应,那么您可以检查它们是否来得太快(比事件处理程序更快并且可以运行生成的UI更新),并跳过或合并适用于您的应用程序的某些事件处理程序。