多线程GLKView绘图

Dan*_*n F 7 multithreading ios glkit

我的主视图控制器包含许多子视图.一个这样的子视图是一个GLKView链接到a GLKViewController.在GLKViewController似乎是一个负责更新的GLKView的显示,以及一些自动魔法是调用主线程上更新功能.

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

我承认,我对OGL ES编程很新,所以我不知道如何处理这个问题.我需要得到GLKViewController

- (void)glkView:(GLKView *)view drawInRect:(CGRect)rect;
Run Code Online (Sandbox Code Playgroud)

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

qri*_*kko 0

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

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

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

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

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

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

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

因此,我正在研究是否可以分派专用于 GLKit 中渲染的线程。