multithreadingGLKView绘图

我的主视图控制器包含许多子视图。 一个这样的子视图是GLKView链接到一个GLKViewControllerGLKViewController似乎是负责更新GLKView的显示,而GLKView正在主线程上调用该更新函数。

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

我承认,我是OGL ES编程的新手,所以我不知道如何处理这个问题。 我需要得到GLKViewController

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

方法在主线程的一个单独的线程上调用,所以我可以保持GLKViewanimation,而用户正在与其他元素交互。

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

这是棘手的,我没有find一个好办法,我相信有更好的办法,但对我来说,performance并不是一个大问题,所以我为此妥协了。 我没有一个完整的解决scheme ,它不是 以你所要求的方式 (即通过线程化渲染) 解决问题,而是可能是至less值得关注的东西。 如果我能想出一个更好的解决scheme,我会更新它,但现在这是我所有的。

我这样做的方式是,我实际上有一个透明的ViewController在glkViewController “顶部”,任何我想在GLKViewController之上进行交互的东西(比如tablesViews,buttons和几乎UI的东西)被添加到那。

我这样做的方式是我有一个单独的对象我的视图控制器称为OverlayViewController ,我发现很有帮助,因为我想从任何地方轻松访问它,不知道这是否适合您的devise,但它对我来说是有意义的。 这是添加在GLKViewController::viewWillAppearselect器。

而这真的是所有的魔法。 所以我有一个覆盖视图,它正在播放任何IOKittypes的对象。 我像这样添加(更容易粘贴我的viewWillAppear:从我的GLKViewController子类)

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

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

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

所以说,我正在调查是否有可能派遣一个专门在GLKit呈现的线程。