8

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

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

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

4

1 回答 1

15

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

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

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

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

于 2012-07-07T21:52:29.927 回答