【问题标题】:Multithreading GLKView drawing多线程GLKView绘图
【发布时间】:2012-11-19 03:21:24
【问题描述】:

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

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

我承认,我对 OGL ES 编程还很陌生,所以我不确定如何处理这个问题。我需要得到GLKViewController

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

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

【问题讨论】:

  • 这个问题是苹果设置它的方式我很确定所有 GLES 调用都必须来自主线程......所以...... IDK 人......我从来没有之前尝试在 GLES 上使用表格:-/ 如果以后有时间,我会研究一下!
  • 他们与 UITableView 进行了什么样的交互?处理他们的输入需要很长时间吗?
  • @Liron 一旦用户开始滚动表格视图,GLKView 在表格停止滚动之前不会更新
  • @DanF 嗯。稍后我会尝试更多地考虑它。什么都不会立即浮现在脑海中。
  • 你有没有在这方面取得进展?

标签: ios multithreading glkit


【解决方案1】:

GLKViewController 正在使用 CADisplayLink 以与您的显示刷新率相匹配的频率调用更新/绘制。当您的 tableview/scrollview 开始跟踪触摸时,运行循环开始赋予它所有优先级。您可能必须拆分您自己的 GLKView 和 CADisplayLink(而不是使用 GLKViewController),以便修改 CADisplayLink 的运行循环模式,以便即使 tableview/scrollview 正在跟踪触摸,它也会继续运行。请参阅此discussion 了解更多信息:

【讨论】:

    【解决方案2】:

    这很棘手,我没有找到一个好的方法,我相信还有更好的方法,但对我来说性能不是一个大问题,所以我就解决了。 我没有完整的解决方案,它没有解决您要求的方式(即通过线程渲染)的问题,但也许至少可能值得一看的东西。如果我能想出一个更好的解决方案,我会更新它,但现在我只有这些了。

    我这样做的方式是,我实际上在glkViewController 的“顶部”有一个透明的 ViewController,以及我想在 GLKViewController 顶部与之交互的任何东西(例如表格视图、按钮和几乎所有的 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 上被调用,因此,我的旋转模型停止旋转
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-21
    • 1970-01-01
    • 2019-10-27
    相关资源
    最近更新 更多