GLKViewControllerDelegate被阻止

时间:2012-04-09 22:59:16

标签: iphone opengl-es mapkit glkit

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

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

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

1 个答案:

答案 0 :(得分:15)

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

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

  • 首先将enableSetNeedsDisplay的{​​{1}}设置为GLKView(使用GLKViewController时应自动设置)。
  • NO设置为0(或者可能为1)以禁用preferredFramesPerSecond的渲染循环或根本不使用GLKViewController
  • 导入QuartzCore框架:GLKViewController
  • 创建#import <QuartzCore/QuartzCore.h>并在CADisplayLink
  • 中安排。{li>
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];
}

我没有对此进行测试,请告诉我它是否有效!