我的主视图控制器包含许多子视图。一个此类子视图是与GLKView
相关联的GLKViewController
。 GLKViewController
似乎是负责更新GLKView
显示的人,而自动化的东西是在主线程上调用该更新函数。
此主视图控制器中的其他一个视图是UITableView
。当用户与表视图交互时,GLKView
将停止更新。
我承认,我对OGL ES编程很陌生,所以我不知道如何解决这个问题。我需要获得GLKViewController
的
- (void)glkView:(GLKView *)view drawInRect:(CGRect)rect;
在主线程的单独线程上调用的方法,因此我可以在用户与其他元素交互时保持GLKView
动画。
答案 0 :(得分:2)
GLKViewController使用CADisplayLink以与您的显示刷新率匹配的频率调用更新/绘制。当您的tableview / scrollview开始跟踪触摸时,运行循环开始为其提供所有优先级。您可能必须拆分自己的GLKView和CADisplayLink(而不是使用GLKViewController),以便修改CADisplayLink的运行循环模式,以便即使tableview / scrollview正在跟踪触摸它也会继续运行。有关详细信息,请参阅此discussion:
答案 1 :(得分:0)
这很棘手,我没有找到一个很好的方法,我确信有更好的方法,但对我来说,表现并不是一个大问题,所以我选择了它。 我没有一个完整的解决方案而没有解决问题你要求的方式(即通过线程渲染)但是也许至少可能值得一看的东西。如果我能提出更好的解决方案,我会更新它,但现在这就是我所拥有的。
我这样做的方式是我实际上在glkViewController
的顶部有一个透明的ViewController,以及我想在GLKViewController之上进行交互的任何东西(例如tablesViews,button和pretty)添加了很多UI东西。
我这样做的方法是我的视图控制器名为OverlayViewController
我有一个单例对象,我觉得很有用,因为我想从任何地方轻松访问它,不知道这是否适合你的设计但这对我来说很有意义。这会添加到GLKViewController::viewWillAppear
选择器中。
这真的是神奇的。所以我有一个覆盖视图,它可以播放任何IOKit类型的对象。我这样添加(更容易从我的viewWillAppear:
子类粘贴我的GLKViewController
)
- (void) viewWillAppear: (BOOL) animated {
[[[OverlayViewController shared] view] setUserInteractionEnabled:NO];
[self.parentViewController.view addSubview: [[OverlayViewController shared] view]];
...
}
这基本上意味着你会看到两个视图控制器,但它们彼此“独立”。
这种方法存在明显的问题,例如,跟踪哪个视图当前将接受用户交互的繁琐工作,因为它们彼此叠加,这不会被处理。
因此,我说我正在调查是否可以调度专用于在GLKit中渲染的线程。