4

我正在使用 UIPanGestureRecognizer 在我的游戏(cocos2d 2.0)中平移,从 iOS 5.x 到 6.x,它运行良好。突然在 iOS 7 中它变得非常不稳定。您可以平移一段时间,但最终它变得不准确。甚至在我的游戏代码对手势进行任何操作之前,我就可以在日志中清楚地看到翻译在 3-5 点左右跳跃。通常,平滑的手指拖动每次更改只会使平移展开 1 个点。在屏幕边缘附近滑动似乎会立即导致问题,但只是平移也会导致问题。

有什么改变会导致 cocos2d 出现问题吗?还是一般的手势识别器?

4

1 回答 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 的绘图是在识别器的选择器触发之前发生的,并且它以某种方式滞后到足以阻止一个循环。所以我的目标是延迟识别器,使其在下一次渲染之前触发。这是破解部分,我在主线程上 dispatch_async 触发 my[glkView display]以便调用我的识别器,然后我在一个块中捕获识别器操作并在循环过去后触发它。我不想说这是我所能做的,但我工作!

于 2015-06-17T23:41:14.100 回答