GLKViewControllerDelegate被阻塞(GLKViewControllerDele

2019-09-16 11:09发布

我有一个GLKViewController来处理一些OpenGL绘图。 我有glkView:drawInRectupdate方法得到实施和有preferredFramesPerSecond属性设置为30(默认值)。

问题是,委托方法,当用户与应用程序的其它部分进行互动停止射击。 我已经看到这种情况发生的这两起案件是当用户滚动一个UITableView或用的MKMapView交互。

有没有一种办法,以确保这些代表永远火,无论什么样的应用程序的其余部分做。 我想这些停下唯一的一次,当应用程序进入背景(这是做自动)。

Answer 1:

这样做的原因是,在表视图或地图滚动期间查看runloop是UITrackingRunLoopMode具有比默认模式更高的优先级。 这可以防止一些事件,从以保证较高的滚动性能射击。

为了解决你的问题,你必须建立自己的渲染循环,而不是依靠GLKViewController

  • 首先设置enableSetNeedsDisplay所述的GLKViewNO (使用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];
}

我没有测试过这一点,所以告诉我,如果它的作品!



文章来源: GLKViewControllerDelegate getting blocked