我正在后台线程上使用与主线程不同的 EAGLContext 渲染 OpenGL 上下文。
我使用这样的东西:
- (void)renderInBackground {
EAGLContext *context = [[EAGLContext] alloc] init];
[EAGLContext setCurrentContext:context];
Rendering..
}
但是,即使这是在后台线程中执行的,当使用重型着色器时,主线程也会被阻塞并且 UI 会被卡住。
为什么后台线程会阻塞主线程? 这些方法不同步。
最佳答案
您确实有有限的 CPU 和 GPU 资源来执行所有渲染和 UI 交互,因此,如果您最大化 GPU,您将减慢应用程序中的其他所有内容。
也就是说,您应该能够在后台线程上进行渲染,而无需完全停止所有 UI 元素。我在我的开源 Molecules 中做了一些相当密集的渲染应用程序,所有这些都使用后台 GCD 队列,但您仍然可以在弹出窗口中滚动并以其他方式与界面交互。
我在this answer中描述了我使用的过程,但基本设置是一个单宽 GCD 队列,它依赖于调度信号量来防止在仍在处理帧时将额外的渲染帧排入队列。线程和 block 有一些开销,因此如果它们的触发速度快于处理速度,则可能会导致资源耗尽。信号量可以防止这种情况发生。
将与我的 OpenGL ES 上下文的所有交互包装在此队列中,可以无锁地使用此共享资源,而且我发现,与简单地在多核设备的主线程上运行这一切相比,性能得到了显着提升。正如我所说,即使在此处进行大量渲染时,我仍然能够与 UI 进行交互。
关于iphone - OpenGL ES 2.0 iPhone - 在后台线程 block 主线程上渲染,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9463800/