我有一个GLKViewController来处理一些OpenGL绘图。我已经实现了glkView:drawInRect
和update
方法,并将preferredFramesPerSecond
属性设置为30(默认值)。
问题是当用户与应用程序的其他部分交互时,委托方法会停止触发。我看到这两种情况发生在用户滚动UITableView或与MKMapView交互时。
有没有办法确保这些代理总是触发,无论应用程序的其余部分在做什么。我希望这些停止的唯一时间是当应用程序进入后台时(自动进行)。
答案 0 :(得分:15)
原因是在表视图或地图视图中滚动时,runloop位于UITrackingRunLoopMode
中,其优先级高于默认模式。这可以防止某些事件触发,以保证高滚动性能。
要解决您的问题,您必须设置自己的渲染循环,而不是依赖GLKViewController
。
enableSetNeedsDisplay
的{{1}}设置为GLKView
(使用GLKViewController时应自动设置)。NO
设置为0(或者可能为1)以禁用preferredFramesPerSecond
的渲染循环或根本不使用GLKViewController GLKViewController
#import <QuartzCore/QuartzCore.h>
并在CADisplayLink
CADisplayLink* displayLink = [CADisplayLink displayLinkWithTarget:self selector:@selector(render:)]; [displayLink addToRunLoop:[NSRunLoop currentRunLoop] forMode:NSRunLoopCommonModes];
- (void)render:(CADisplayLink*)displayLink { GLKView* view = (GLKView*)self.view; [view display]; }
我没有对此进行测试,请告诉我它是否有效!