GLKViewControllerDelegate被阻止

Ros*_*mes 8 iphone opengl-es mapkit glkit

我有一个GLKViewController来处理一些OpenGL绘图.我已经实现了glkView:drawInRectupdate方法,并将preferredFramesPerSecond属性设置为30(默认值).

问题是当用户与应用程序的其他部分交互时,委托方法停止触发.我见过这种情况的两种情况是当用户滚动UITableView或与MKMapView交互时.

有没有办法确保这些代表总是触发,无论应用程序的其余部分在做什么.我希望这些停止的唯一时间是应用程序进入后台(这是自动进行).

Fel*_*lix 15

原因是在表视图或地图视图中滚动期间,runloop的UITrackingRunLoopMode优先级高于默认模式.这可以防止某些事件触发,以保证高滚动性能.

要解决您的问题,您必须设置自己的渲染循环,而不是依赖于GLKViewController.

  • 第一组enableSetNeedsDisplayGLKViewNO(应该会自动使用GLKViewController时设置).
  • 设置preferredFramesPerSecond为0(或可能为1)以禁用渲染循环GLKViewController或根本不使用GLKViewController
  • 导入QuartzCore框架: #import <QuartzCore/QuartzCore.h>
  • 创建CADisplayLink并安排在NSRunLoopCommonModes:
CADisplayLink* displayLink = [CADisplayLink displayLinkWithTarget:self selector:@selector(render:)];
[displayLink addToRunLoop:[NSRunLoop currentRunLoop] forMode:NSRunLoopCommonModes];
  • 可选:将displayLink的frameInterval设置为2(=帧速率的一半)
  • 渲染方法:
- (void)render:(CADisplayLink*)displayLink {
    GLKView* view = (GLKView*)self.view;
    [view display];
}

我没有测试过这个,所以请告诉我它是否有效!

  • 这确实有效.我正在寻找一种我不必这样做的方式,但我认为你是对的,这是唯一的方法. (3认同)