GPUImage:EAGLContext和线程队列

时间:2013-09-08 19:20:00

标签: ios coding-style opengl-es-2.0 gpuimage

最近我正在提高我的OpenGL ES技能,查看GPUImage的源代码。当我正在阅读GPUImageContext类的代码时,我得到它存储对queue的引用,它在库的其他部分中使用。

例如,在GPUImageView.m中,commonInit中的队列与runSynchronouslyOnVideoProcessingQueue一起使用,以执行与上下文不直接相关的一些操作(例如向着色器添加属性)。

我的问题是开发人员决定在“辅助”队列上执行这些操作的原因,这就是将此队列存储到类GPUImageContext之类的好处。

我知道这个问题与GPUImage框架严格相关,但我认为这可能是一个很好的机会来理解像Brad Larson这样熟练的开发人员如何决定构建iOS中最着名的图像处理库之一。

P.S。 我希望我没有以好奇心冒犯作者。

1 个答案:

答案 0 :(得分:5)

这样做的原因是提供一定程度的线程安全性。只能从一个线程一次安全地访问OpenGL ES上下文。为此,我使用一个与OpenGL ES上下文关联的串行调度队列,并调度触及该队列上的上下文的任何内容。

使用串行调度队列是确保一次只能触摸资源的有效方法。它避免了昂贵的锁的开销,并且可以很容易地在非主线程上执行处理操作。

你可以选择只在主线程上做这一切,这是我最初做的,但是有一些缺点。缓慢处理可能会阻止UI。在后台线程上执行OpenGL ES渲染具有显着的性能优势,从甚至单核设备上的10%加速到多核iOS硬件上的超过40%的加速。您还可以防止使用该框架的开发人员从非主线程访问它的实例。