我有一个GLKViewController来处理一些OpenGL绘图。 我有glkView:drawInRect
和update
方法得到实施和有preferredFramesPerSecond
属性设置为30(默认值)。
问题是,委托方法,当用户与应用程序的其它部分进行互动停止射击。 我已经看到这种情况发生的这两起案件是当用户滚动一个UITableView或用的MKMapView交互。
有没有一种办法,以确保这些代表永远火,无论什么样的应用程序的其余部分做。 我想这些停下唯一的一次,当应用程序进入背景(这是做自动)。
这样做的原因是,在表视图或地图滚动期间查看runloop是UITrackingRunLoopMode
具有比默认模式更高的优先级。 这可以防止一些事件,从以保证较高的滚动性能射击。
为了解决你的问题,你必须建立自己的渲染循环,而不是依靠GLKViewController
。
- 首先设置
enableSetNeedsDisplay
所述的GLKView
到NO
(使用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];
}
我没有测试过这一点,所以告诉我,如果它的作品!