多线程GLKView绘图

7
我的主视图控制器包含许多子视图。其中一个子视图是链接到GLKViewControllerGLKView。似乎GLKViewController负责更新GLKView的显示,并且某些自动化程序会在主线程上调用该更新函数。
我主视图控制器中的另一个视图是UITableView。当用户与表视图交互时,GLKView停止更新。
我承认,我对OGL ES编程还比较新手,所以我不知道如何解决这个问题。我需要获取GLKViewController的...
- (void)glkView:(GLKView *)view drawInRect:(CGRect)rect;

需要在主线程以外的单独线程上调用的方法,以便用户与其他元素交互时可以保持GLKView的动画。


这个问题在于苹果设置了所有的GLES调用都必须来自主线程...所以...不知道啊...我之前从没尝试过在GLES上使用表格 :-/ 如果我有时间的话会去研究一下的! - Matthew Clark
他们与UITableView进行了哪些交互?处理这些输入需要很长时间吗? - Liron
@Liron 当用户开始滚动表视图时,GLKView 直到表停止滚动后才会更新。 - Dan F
@DanF 嗯,我会稍后再考虑一下。目前还没有什么想法。 - Liron
你有在这方面取得进展吗? - user3344977
很抱歉,@user3344977,我已经离开那家公司了。 - Dan F
2个回答

2

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


0
这很棘手,我没有找到一个好的方法来解决它,我相信有更好的方法,但对于我来说,性能不是一个巨大的问题,所以我就选择了这种方式。我没有完整的解决方案,也没有按照你要求的方式(即通过线程渲染)来解决问题,但或许值得一看。如果我能想出更好的解决方案,我会更新的,但现在这就是我所拥有的。
我的做法是,在glkViewController上面实际上有一个透明的视图控制器,任何我想要与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中进行渲染。


不确定这如何解决更新问题。它似乎只是管理交互性,而我完全没有遇到这个问题。我的GLKViewUITableView在屏幕上完全分离,我没有任何问题让它们彼此独立地交互。问题是一旦我开始与表视图交互,drawInRect就停止在我的GLKViewController上调用,因此,我的旋转模型停止旋转。 - Dan F

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接