最近,我正在研究GPUImage的源代码,以提高我的OpenGL ES技能。当我阅读GPUImageContext
类的代码时,我发现它存储了对queue
的引用,该引用已在库的其他部分中使用。
例如,在GPUImageView.m
中,队列在commonInit
中与runSynchronouslyOnVideoProcessingQueue
一起使用,以执行与上下文不直接相关的某些操作(例如向着色器添加属性)。
我的问题是,为什么开发人员决定在“辅助”队列上执行这些操作,将这个队列存储到GPUImageContext
这样的类中的好处是什么。
我知道这个问题与GPUImage框架严格相关,但是我认为这可能是一个很好的机会,可以了解像Brad Larson这样的熟练开发人员如何决定构建iOS中最著名的图像处理库之一。
P.s.
我希望我不要因为好奇而冒犯作者。
最佳答案
这样做的原因是为了提供一定程度的线程安全性。一次只能从一个线程安全地访问OpenGL ES上下文。为此,我使用了与OpenGL ES上下文相关联的串行调度队列,并调度了与该队列上的上下文相关的所有事件。
使用串行调度队列是确保一次只接触一件事的有效方法。它避免了昂贵的锁带来的开销,并使在非主线程上执行处理操作变得容易。
您可以选择仅在主线程上执行所有这些操作,这是我最初所做的,但是这样做有一些缺点。缓慢的处理可能会阻塞UI。在后台线程上执行OpenGL ES渲染具有显着的性能优势,范围甚至从单核设备提高了10%,到多核iOS硬件提高了40%以上。您还可以防止使用该框架的开发人员从非主线程访问该实例的情况。
关于ios - GPUImage:EAGLContext和线程队列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18687656/