最近我正在提高我的OpenGL ES技能,查看GPUImage的源代码。当我正在阅读GPUImageContext
类的代码时,我得到它存储对queue
的引用,它在库的其他部分中使用。
例如,在GPUImageView.m
中,commonInit
中的队列与runSynchronouslyOnVideoProcessingQueue
一起使用,以执行与上下文不直接相关的一些操作(例如向着色器添加属性)。
我的问题是开发人员决定在“辅助”队列上执行这些操作的原因,这就是将此队列存储到类GPUImageContext
之类的好处。
我知道这个问题与GPUImage框架严格相关,但我认为这可能是一个很好的机会来理解像Brad Larson这样熟练的开发人员如何决定构建iOS中最着名的图像处理库之一。
P.S。 我希望我没有以好奇心冒犯作者。
答案 0 :(得分:5)
这样做的原因是提供一定程度的线程安全性。只能从一个线程一次安全地访问OpenGL ES上下文。为此,我使用一个与OpenGL ES上下文关联的串行调度队列,并调度触及该队列上的上下文的任何内容。
使用串行调度队列是确保一次只能触摸资源的有效方法。它避免了昂贵的锁的开销,并且可以很容易地在非主线程上执行处理操作。
你可以选择只在主线程上做这一切,这是我最初做的,但是有一些缺点。缓慢处理可能会阻止UI。在后台线程上执行OpenGL ES渲染具有显着的性能优势,从甚至单核设备上的10%加速到多核iOS硬件上的超过40%的加速。您还可以防止使用该框架的开发人员从非主线程访问它的实例。