Logo
項目介紹:
GPUImage是Brad Larson在github托管的開源項目。
GPUImage是一個基於GPU圖像和視頻處理的開源iOS框架,提供各種各樣的圖像處理濾鏡,並且支持照相機和攝像機的實時濾鏡; 基於GPU的圖像加速,因此可以加速對實時攝像頭視頻、電影以及image的濾鏡和其它效果處理,並且能夠自定義圖像濾鏡。另外, GPUImage支持ARC。
使用GPUImage處理圖片比Core Image更簡單,只需要將過濾器賦給圖片對象即可,不用考慮context或者設備等其他問題。GPUImage提供了除高斯模糊外的其他幾種不同效果的模糊,雖然Core Image也提供了幾種模糊效果,但目前在iOS上能用的就只有高斯模糊,而GPUImage可用的有FastBlur, GaussianBlur, GaussianSelectiveBlur 和 BoxBlur。此外,作為開源框架的GPUImage還支持自定義的過濾器。
開發語言:Objective-C
License:
BSD 3-clause "New" or "Revised" License
鏈接:
-
項目主頁: http://www.sunsetlakesoftware.com/2012/02/12/introducing-gpuimage-framework
-
項目托管地址:
- GitRepository: git://github.com/BradLarson/GPUImage.git
- github項目地址: https://github.com/BradLarson/GPUImage
- CODE鏡像地址: https://code.csdn.net/mobiledevelopOS/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]。