1

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

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

我的问题是为什么开发人员决定在“辅助”队列上执行这些操作,而将这个队列存储到GPUImageContext.

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

Ps 希望我的好奇心没有冒犯作者。

4

1 回答 1

5

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

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

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

于 2013-09-08T23:00:04.487 回答