GPUImage是如今iOS作濾鏡最主流的開源框架。做者BradLarson基於openGL對圖片處理單元進行封裝,提供出GPUImageFilter基類,配合shader,經常使用濾鏡都拿下不是問題。 GPUImage中的有幾個概念:api
⁃ output,輸出源框架
⁃ intput,輸入源spa
⁃ filter,濾鏡設計
因此一個完整的濾鏡處理流程是: output+X+input,X就是濾鏡組(1+個濾鏡)。GPUImage爲了方便,新版本中提供了GPUImageFilterPipeline 這個東西,方便用戶使用多個濾鏡組合,不用擔憂先後的鏈式邏輯。對象
GPUImage將圖片濾鏡處理和動態濾鏡分開了,動態濾鏡是按照上面那個流程,但圖片處理倒是以(output+filter)*X + input這種邏輯。若是處理一張圖片的效果須要用到多個濾鏡組合,用一個濾鏡生成一張圖片output,而後傳給下一個濾鏡處理,這個過程當中若是濾鏡疊加次數比較多,或者這個濾鏡效果被調用屢次,這樣消耗的內存是特別大的,每一個濾鏡處理後導出的圖片output都存在內存中,若是原圖特別大,估計內存要爆了。token
若是都是以output+X+input這種模式來處理的,這樣代碼邏輯單一,效率高,吃內存也沒那麼多。看了源碼知道output +X+ input ,當X爲多個時,上個濾鏡n處理獲得的紋理,還存在GPU顯存中,GPU直接將這張紋理傳給了n+1做爲其output,這樣整個濾鏡流程下來,只有一張紋理內存的佔用。圖片
以這條線來走,過程當中基本就沒遇到什麼問題,只是代碼結構設計和封裝耗時。項目裏,發現濾鏡模塊調用完了之後,內存上去了下不來,反覆檢查,全部GPUImage相關元素都已經釋放了。後來想到了顯存,arc環境下,只負責回收oc對象的內存,顯存天然須要GPUImage使用者本身來回收,這樣也就容易了,翻GPUImage的api,知道ip
GPUImageContext中有個framebufferCache:內存
[[GPUImageContextsharedImageProcessingContext].framebufferCachepurgeAllUnassignedFramebuffers]。圖片處理