GPUImage:EAGLContext和线程队列

Mat*_*oal 1 coding-style ios opengl-es-2.0 gpuimage

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

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

我的问题是为什么开发人员决定在"辅助"队列上执行这些操作,这是将这个队列存储到像这样的类中的好处GPUImageContext.

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

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

Bra*_*son 5

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

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

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