OpenGL ES 2.0 iPhone - 在后台线程块主线程上渲染

时间:2012-02-27 10:55:16

标签: iphone opengl-es opengl-es-2.0

我在后台线程上使用与主线程不同的EAGLContext渲染OpenGL Context。

我使用这样的东西:

- (void)renderInBackground {
      EAGLContext *context = [[EAGLContext] alloc] init];
      [EAGLContext setCurrentContext:context];


       Rendering..
    }

但是,即使这是在后台线程中执行的,当使用重型着色器时,主线程也会被阻塞,并且UI会卡住。

为什么后台线程阻塞主线程? 方法不同步。

1 个答案:

答案 0 :(得分:8)

您确实拥有有限的CPU和GPU资源来执行所有渲染和UI交互,因此如果您最大化GPU,您将减慢应用程序中的所有其他内容。

也就是说,您应该能够在后台线程上呈现而不会完全停止所有UI元素。我在我的开源Molecules应用程序中进行了一些相当强烈的渲染,所有这些都使用了后台GCD队列,但你仍然可以在弹出框中滚动并以其他方式与界面交互。

我描述了我在this answer中使用的过程,但基本设置是一个单宽的GCD队列,它依赖于一个调度信号量来防止在处理一个渲染帧时排队其他渲染帧。线程和块对它们有一些开销,因此如果它们被触发的速度快于它们可以处理的速度,则可能导致资源耗尽。信号量阻止了这一点。

在此队列中包含与我的OpenGL ES上下文的所有交互提供了对此共享资源的无锁使用,并且我发现只需在多核设备上的主线程上运行此操作即可显着提升性能。正如我所说,在这里,即使是重度渲染,我仍然可以与UI进行交互。