iPhone 5s + iOS 7 上 UIPanGestureRecognizer 不准确

4
我在我的游戏(cocos2d 2.0)中使用UIPanGestureRecognizer来进行平移操作,在iOS 5.x到6.x版本中一直运行良好。但是在iOS 7中,它变得非常卡顿。您可以进行一段时间的平移操作,但最终它会变得不准确。即使在我的游戏代码对手势进行任何操作之前,我也可以清楚地在日志中看到平移值在3-5个点之间跳动。通常,平滑的手指拖动每次只有1个点的平移量分散。在屏幕边缘附近滑动似乎会立即导致问题,但仅仅平移也会导致这种情况。
是否有任何更改会导致cocos2d或手势识别器出现问题?

似乎在iOS 7上运行cocos2d 2.x版本存在一些内存泄漏问题,你可以在这里和cocos2d论坛上找到相关讨论,但目前还没有解决方案。 - CodeSmile
这个内存泄漏足以引起手势问题吗?加载后我很快就能复现这个问题。看起来内存泄漏更像是一个慢性出血。 - Vanny
我没有仔细跟进这个线程,但有些人说它是关于拥堵的,其他人在触摸输入的组合中经历了它,还有一些人只是随着时间的推移不断增加内存使用量,尽管在设备上并不显著。你可能想检查一下你的帧率是否下降了。你是不是因为平移而添加节点? - CodeSmile
1个回答

0

CADisplayLink 刷新一个 openGL 视图和 UIApplication 的 sendEvent 方法似乎存在一些优先级冲突。我为此苦苦挣扎了一个星期!在我的测试中,我发现只要您的手指移动,UIPanGestureRecognizer 通常会在每次屏幕刷新时触发。当刷新 GLKView(或任何 openGL 上下文,我假设)时,识别器偶尔会跳过几个帧。如果你连接一个 CADisplayLink 刷新一个 GLKView 并且四处移动,你可以亲眼看到它。

-(void)panRecCallback:(UIPanGestureRecognizer *)rec{
    CGPoint loc = [panRec locationInView:self.view];
    printf("    rec loc %3.3f %3.3f\n",loc.x,loc.y);
}
-(void)display:(CADisplayLink *)displayLink{
    [myGLKView display];
    CGPoint loc = [panRec locationInView:self.view];
    printf("display loc %3.3f %3.3f\n",loc.x,loc.y);
}

我从未完全搞清楚它,但我找到了一个超级hacky的方法来使其始终平稳运行。我发现在故障期间,识别器正在等待信号量,这意味着OpenGL的绘图是在识别器的选择器触发之前发生的,并且由于某种原因它会滞后足以阻止一个周期。所以我的目标是延迟识别器的时间,以便它在下一个渲染之前触发。这是hack部分,我在主线程上dispatch_async触发我的[glkView display],以便我的识别器会被调用,然后我捕获识别器动作并在周期过去后触发它。我不得不说这就是我能做的全部,但它有效!


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