我的主视图控制器包含许多子视图。一个这样的子视图是链接到GLKViewController的GLKView。GLKViewController似乎负责更新GLKView的显示,自动调用主线程上的更新函数。
这个主视图控制器中的另一个视图是UITableView。当用户与表视图交互时,GLKView停止更新。
我承认,我是OGL ES编程的新手,所以我不确定该怎么做。我需要拿到GLKViewController的
- (void)glkView:(GLKView *)view drawInRect:(CGRect)rect;方法将在独立于主线程的线程上调用,因此我可以在用户与其他元素交互时保持GLKView的动画效果。
发布于 2013-08-09 23:58:25
GLKViewController正在使用CADisplayLink以与您的显示刷新率匹配的频率调用更新/绘制。当你的tableview/scrollview开始跟踪一个触摸时,run循环开始给它所有的优先级。您可能需要拆分自己的GLKView和CADisplayLink (而不是使用GLKViewController),以便修改CADisplayLink的运行循环模式,以便即使tableview/scrollview正在跟踪触摸,它也会继续运行。有关更多信息,请参阅此discussion:
发布于 2013-01-04 17:52:31
这很棘手,我没有找到一个好的方法来做它,我相信有更好的方法,但对我来说性能不是一个大问题,所以我解决了它。我没有一个完整的解决方案,它不是像你要求的那样用解决这个问题(例如,通过线程渲染),但也许至少值得一看。如果我能想出一个更好的解决方案,我会更新它,但目前这是我的全部。
我这样做的方式是,我实际上在glkViewController的“上面”有了一个透明的ViewController,任何我想在GLKViewController上交互的东西(比如tablesViews、按钮和几乎所有的UI东西)都会被添加到上面。
我这样做的方式是,我的视图控制器有一个名为OverlayViewController的单例对象,我发现它很有帮助,因为我想从任何地方轻松地访问它,不知道这是否适合您的设计,但它对我来说很有意义。这将被添加到GLKViewController::viewWillAppear选择器中。
这就是所有的魔力。所以我有一个覆盖视图,它承载着任何IOKit类型的对象。我像这样添加它(只需从我的GLKViewController子类粘贴我的viewWillAppear: )
- (void) viewWillAppear: (BOOL) animated {
[[[OverlayViewController shared] view] setUserInteractionEnabled:NO];
[self.parentViewController.view addSubview: [[OverlayViewController shared] view]];
...
}这基本上意味着将有两个视图控制器,你可以看到,但它们是彼此“独立”的。
然而,这种方法有一些明显的问题,比如跟踪哪个视图当前将接受用户交互的繁琐工作,因为它们是在彼此之上的,这是不能处理的。。
所以说到这里,我正在研究是否有可能在GLKit中调度一个专门用于渲染的线程。
https://stackoverflow.com/questions/13653113
复制相似问题