7

我的主视图控制器包含许多子视图。一个这样的子视图是GLKView链接到GLKViewController. GLKViewController似乎是负责更新GLKView' 显示的人,并且自动在主线程上调用该更新函数 。

我在这个主视图控制器中的其他视图之一是UITableView. 当用户与表视图交互时,GLKView停止更新。

我承认,我对 OGL ES 编程很陌生,所以我不确定如何处理这个问题。GLKViewController我需要得到

- (void)glkView:(GLKView *)view drawInRect:(CGRect)rect;

方法在与主线程不同的线程上调用,因此我可以GLKView在用户与其他元素交互时保持动画。

4

2 回答 2

2

GLKViewController 使用 CADisplayLink 以与您的显示刷新率相匹配的频率调用更新/绘制。当您的 tableview/scrollview 开始跟踪触摸时,运行循环开始赋予它所有优先级。您可能必须拆分您自己的 GLKView 和 CADisplayLink(而不是使用 GLKViewController),以便修改 CADisplayLink 的运行循环模式,以便即使 tableview/scrollview 正在跟踪触摸,它也会继续运行。有关更多信息,请参阅此讨论

于 2013-08-09T15:58:25.033 回答
0

这很棘手,我没有找到一个好的方法,我相信有更好的方法,但对我来说性能不是一个大问题,所以我接受了。我没有完整的解决方案,也没有按照您要求的方式解决问题(即通过线程渲染),但至少可能值得一看。如果我能想出一个更好的解决方案,我会更新它,但现在这就是我所拥有的。

我这样做的方式是,我实际上在“顶部”有一个透明的 ViewController glkViewController,并且我想在 GLKViewController 顶部与之交互的任何东西(例如表格视图、按钮和几乎所有 UI 的东西)都被添加到其中.

我这样做的方式是我的视图控制器有一个单例对象,OverlayViewController我发现它很有用,因为我想从任何地方轻松访问它,不知道这是否适合您的设计,但这对我来说很有意义。这是在GLKViewController::viewWillAppear选择器中添加的。

这真的是所有的魔法。所以我有一个覆盖视图,它可以托管任何 IOKit 类型的对象。我像这样添加它(更容易viewWillAppear:从我的GLKViewController子类中粘贴我的)

- (void) viewWillAppear: (BOOL) animated {
    [[[OverlayViewController shared] view] setUserInteractionEnabled:NO];
    [self.parentViewController.view addSubview: [[OverlayViewController shared] view]];
    ...
}

这基本上意味着您将看到两个视图控制器,但它们彼此“独立”。

然而,这种方法存在明显的问题,例如跟踪哪个视图当前将接受用户交互的繁琐工作,因为它们彼此重叠,因此无法处理。

话虽如此,我正在研究是否可以调度一个专用于在 GLKit 中渲染的线程。

于 2013-01-04T09:52:31.177 回答