GPUImage ==> 一个基于GPU图像和视频处理的开源iOS框架

GPUImage.jpg

项目介绍:

GPUImage是Brad Larson在github托管的开源项目。ios

GPUImage是一个基于GPU图像和视频处理的开源iOS框架,提供各类各样的图像处理滤镜,而且支持照相机和摄像机的实时滤镜; 基于GPU的图像加速,所以能够加速对实时摄像头视频、电影以及image的滤镜和其它效果处理,而且可以自定义图像滤镜。另外, GPUImage支持ARC。git

使用GPUImage处理图片比Core Image更简单,只须要将过滤器赋给图片对象便可,不用考虑context或者设备等其余问题。GPUImage提供了除高斯模糊外的其余几种不一样效果的模糊,虽然Core Image也提供了几种模糊效果,但目前在iOS上能用的就只有高斯模糊,而GPUImage可用的有FastBlur, GaussianBlur, GaussianSelectiveBlur 和 BoxBlur。此外,做为开源框架的GPUImage还支持自定义的过滤器。github

开发语言:Objective-Capi

License:

BSD 3-clause "New" or "Revised" License app

连接:

附录

GPUImage frameworkspa

10大iOS开发者最喜好的类库.net

Quora上关于GPUImage的讨论

Learning OpenGL with GPUImage

 

GPUImage是如今作滤镜最主流的开源框架,没有之一。做者BradLarson基于openGL对图片处理单元进行封装,提供出GPUImageFilter基类,配合shader,经常使用滤镜都拿下不是问题。  

下面大体讲解下GPUImage里的一些基本概念,为了表达方便。已经知道请跳过

GPUImage中的几个概念

⁃ output为输出源

⁃ intput为输入源

⁃ filter为滤镜

因此一个完整的滤镜处理流程是这样的: output+X+input,X就是滤镜组(1+个滤镜)。GPUImage为了方便,新版本中提供了GPUImageFilterPipeline 这个东东,方便用户使用多个滤镜组合,不用担忧先后的链式逻辑。

GPUImage做者将图片滤镜处理和动态滤镜是分开了的,动态滤镜是按照上面那个流程,但图片处理倒是以(output+filter)*X + input这种逻辑。若是处理一张图片的效果须要用到多个滤镜组合,用一个滤镜生成一张图片output,而后传给下一个滤镜处理,这个过程当中若是滤镜叠加次数比较多,或者这个滤镜效果被调用屡次,这样消耗的内存是贴别大的,每一个滤镜处理后导出的图片output都存在内存中,若是原图特别大,那么恭喜。。估计内存要爆了。

我在作滤镜app的时候,都是以output+X+input这种模式来处理的,这样代码逻辑单一,效率高,吃内存也没那么多。看了源码知道output +X+ input ,当X为多个时,上个滤镜n处理获得的纹理,还存在GPU显存中,GPU直接将这张纹理传给了n+1做为其output,这样整个滤镜流程下来,只有一张纹理内存的占用。

以这条线来走,过程当中基本就没遇到什么问题,只是代码结构设计和封装耗时。最后滤镜模块作完实用到项目里,发现滤镜模块调用完了之后,内存上去了下不来,我遇到了这问题时,反复检查,全部GPUImage相关元素都已经释放了,那么增长的内存是哪儿来的呢?后来想到了显存,arc环境下,只负责回收oc对象的内存,显存天然须要GPUImage使用者本身来回收,这样也就容易了,翻GPUImage的api,找到了

GPUImageContext中有个framebufferCache ,就是它了

 

[[GPUImageContextsharedImageProcessingContext].framebufferCachepurgeAllUnassignedFramebuffers]。

相关文章
相关标签/搜索