我正在使用UIPanGestureRecognizer在我的游戏(cocos2d 2.0)中移动,从iOS 5.x到6.x,它一直运行得很好。突然,在iOS 7中,它变得非常不稳定。您可以移动一段时间,但最终它会变得不准确。甚至在我的游戏代码对手势做任何事情之前,我可以在我的日志中清楚地看到翻译大约跳跃了3-5个点。通常,平滑的手指拖动每次更改仅展开1个点的平移。在屏幕边缘滑动似乎会立即导致问题,但仅仅是平移也会导致问题。
有没有什么改变会导致cocos2d出现问题?还是一般的手势识别器?
发布于 2015-06-18 07:41:14
与刷新openGL视图的CADisplayLink和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);
}我从来没有把它完全弄清楚,但我确实找到了一种超级老套的方法,让它一直顺利地工作。我发现在故障期间,识别器正在等待一个信号量,我认为这意味着openGL的绘制是在识别器的选择器触发之前发生的,而且不知何故它的延迟刚好足以阻止一个循环。因此,我的目标是延迟识别器足够长的时间,使其在下次渲染之前触发。这里是hack部分,我在主线程上dispatch_async触发我的[glkView display],这样我的识别器就会被调用,然后我在一个块中捕获识别器的操作,并在循环结束后触发它。我不想说这是我唯一能做的,但是我工作!
https://stackoverflow.com/questions/19569942
复制相似问题