【问题标题】:UIPanGestureRecognizer inaccurate on iPhone 5s + iOS 7UIPanGestureRecognizer 在 iPhone 5s + iOS 7 上不准确
【发布时间】:2013-10-24 15:18:21
【问题描述】:

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

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

【问题讨论】:

  • 在 iOS 7 上运行 cocos2d 2.x 版本显然存在一些内存泄漏问题,您会在此处和 cocos2d 论坛上找到讨论,但 atm 没有解决方案
  • 内存泄漏是否足以导致此手势问题?我能够在加载后很快产生问题。看起来记忆更像是一种缓慢的流血。
  • 我没有密切关注该线程,但有人说这是关于拥塞,其他人结合触摸输入体验了它,其他人只是随着时间的推移内存使用量不断增加,尽管在设备上并不显着。您可能想检查您的帧率是否正在下降。您是否可能会因为平移而添加节点?

标签: ios cocos2d-iphone ios7 uigesturerecognizer uipangesturerecognizer


【解决方案1】:

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);
}

我从来没有完全弄清楚它,但我确实找到了一种 super hacky 方法来让它始终如一地顺利工作。我发现在故障期间,识别器正在等待一个信号量,我认为这意味着 openGL 的绘图是在识别器的选择器触发之前发生的,并且它以某种方式滞后到足以阻止一个循环。所以我的目标是延迟识别器,使其在 next 渲染之前触发。这是破解部分,我在主线程上 dispatch_async 触发我的[glkView display] 以便调用我的识别器,然后我在一个块中捕获识别器操作并在循环过去后触发它。我不想说这是我所能做的,但我工作!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-03-02
    • 2016-05-19
    • 1970-01-01
    • 1970-01-01
    • 2014-09-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多