最近,我正在改进我的OpenGL ES技能,查看GPUImage的源代码。当我阅读GPUImageContext类的代码时,我发现它存储了对库中其他部分使用的queue的引用。
例如,在GPUImageView.m中,队列在带有runSynchronouslyOnVideoProcessingQueue的commonInit中被用来执行一些与上下文无关的操作(比如向着色器添加属性)。
我的问题是,为什么开发人员决定在“次要”队列上执行这些操作,这是将队列存储到像GPUImageContext这样的类中的好处。
我知道这个问题与GPUImage框架有着严格的联系,但我认为这可能是一个很好的机会来理解像Brad这样的技术熟练的开发人员如何决定构建iOS中最著名的图像处理库之一。
附注:我希望我没有以我的好奇心冒犯作者。
发布于 2013-09-08 23:00:04
其原因是为了提供一定程度的线程安全。一次只能从一个线程安全地访问OpenGL ES上下文。为此,我使用与OpenGL ES上下文相关联的串行调度队列,并分派任何与该队列上的上下文有关的内容。
使用串行调度队列是一种有效的方法,可以确保每次只接触一件资源。它避免了昂贵锁的开销,并使在非主线程上执行处理操作变得容易。
您可以选择只在主线程上完成这一切,这是我最初所做的,但这有一些缺点。缓慢的处理会阻止UI。在后台线程上执行OpenGL ES呈现具有显著的性能优势,从即使在单核设备上加速10%到在多核iOS硬件上加速超过40%。您还可以避免使用框架的开发人员从非主线程访问它的实例。
https://stackoverflow.com/questions/18687656
复制相似问题