ios - GPUImage:EAGLContext和线程队列

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

最近,我正在研究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/

相关文章:

ios - 如何防止通知设置被重复注册?

ios - StoreKit框架-更改应用内购买的iTunes商店时未调用回调

php-cs-修复程序 : need more information on using fix --level option

PHP - 过度评论?

iphone - iPhone 中的 WEBGL_depth_texture 精度太低

ios - UIImageView 子类化

ios - 在 Swift IOS 上设置 UiTextField 光标

Python - 定义仅使用一次的常量变量的最便捷方式

android - 加载均匀矩阵 1104 GL_Invalid_Operation Android OpenGLES 2.0

opengl - Tizen UI - Enlightenment Foundation 库中的 E17 和 EVAS