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