GPUImage
GPUImage
13 May 2013(翻譯自 NSHispter,原文鏈接:http://nshipster.com/gpuimage/)
在 NSHipster,我們一直在研究 Objective-C 不為人知的一面來了解我們每天面對的系統(tǒng)。一般來說,這意味著仔細研究 Apple 的框架和語言特性(畢竟每天要用 Obective-C 工作)。不過,有些時候,看看成堆的第三方庫和框架也蠻好的(而且里面有些真的很好),還可以看一下 Cupertino 外面有什么新東西。
本周我們來看一下你能找到的最厲害的一個開源項目:GPUImage。系好安全帶,NSHipster 們,一不小心你讀完這篇文章就造出一個相機 app 了。
GPUImage 作者是?Brad Larson,以 BSD 協(xié)議放出,能夠在圖像、實時攝像頭影像和視頻上使用 GPU 加速的濾鏡和其他效果。
GPU vs. CPU
每只 iPhone 都有兩個處理器:一個?CPU,也就是中央處理器,和一個?GPU,也就是圖形處理器。每個處理器都有它自己的優(yōu)勢,現(xiàn)代芯片架構(例如 AppleA4)把 CPU 和 GPU 集成在一個物理封裝里。
在 Xcode 里面寫 C 和 Objective-C 的時候,產生的指令絕大部分會被 CPU 執(zhí)行。相對地,GPU 是一枚專用芯片,專門用來做獨立的小操作,例如圖形渲染。GPU 執(zhí)行的指令和 CPU 是有很大區(qū)別的,因此用特殊的語言來編寫:OpenGL(特別地,在 iPhone 和 iPad 上使用?OpenGL ES)
如果想學習 OpenGL ES 和渲染管線相關的知識,可以參考?Jeff LaMarche's GLProgram OpenGL ES 2.0 book
比較一下 GPU 渲染和 CPU 渲染的性能,區(qū)別還是蠻大的:
CPU vs. GPU 幀率對比 (FPS 越高越好)| Thresholding ? 1 | 60.00 | 4.21 | 14.3? |
| Thresholding ? 2 | 33.63 | 2.36 | 14.3? |
| Thresholding ? 100 | 1.45 | 0.05 | 28.7? |
"哦,這貨是 Instagram?"
好吧,我們這么說:
Instagram : GPUImage :: 拍立得 : NASA 空間光學制造中心換種說法,用 GPUImage 的 API 可以做出數(shù)千種相機 app,只需要把濾鏡正確地組合起來,外加一小點想象力。
這張表包含了 GPUImage 內置的 125 種濾鏡:(譯者:你想翻譯死我嗎?)
|
|
|
|
認真說,GPUImage 代碼里帶的這個?濾鏡展示示例 app?能在 AppStore 賣 3.99 刀。要是再加上 twitter 集成和一些聲音效果,賣個 6.99 刀不成問題。
渲染管線
GPUImage 從本質上來說是一個渲染管線的 Objective-C 抽象。從相機、網絡或者磁盤上加載的源圖像,在經過一系列濾鏡處理后,最終輸出到了 view、graphics context 或是數(shù)據(jù)流中。
例如說,攝像頭中的圖像可以應用一個 Color Levels 濾鏡,來模擬各種色盲效果,然后實時顯示在一個 view 中。
GPUImageVideoCamera *videoCamera = [[GPUImageVideoCamera alloc]initWithSessionPreset:AVCaptureSessionPreset640x480cameraPosition:AVCaptureDevicePositionBack]; videoCamera.outputImageOrientation = UIInterfaceOrientationPortrait;GPUImageFilter *filter = [[GPUImageLevelsFilter alloc] initWithFragmentShaderFromFile:@"CustomShader"]; [filter setRedMin:0.299 gamma:1.0 max:1.0 minOut:0.0 maxOut:1.0]; [filter setGreenMin:0.587 gamma:1.0 max:1.0 minOut:0.0 maxOut:1.0]; [filter setBlueMin:0.114 gamma:1.0 max:1.0 minOut:0.0 maxOut:1.0]; [videoCamera addTarget:filter];GPUImageView *filteredVideoView = [[GPUImageView alloc] initWithFrame:self.view.bounds)]; [filter addTarget:filteredVideoView]; [self.view addSubView:filteredVideoView];[videoCamera startCameraCapture];或者,結合不同的顏色混合模式,圖像效果和一些調整,你可以把靜止圖像轉變成可以分享給你時髦的朋友們看看的精美圖像(例子來自基于 GPUImage 的FilterKit)。
GPUImageFilterGroup *filter = [[FKGPUFilterGroup alloc] init];GPUImageSaturationFilter *saturationFilter = [[GPUImageSaturationFilter alloc] init]; [saturationFilter setSaturation:0.5];GPUImageMonochromeFilter *monochromeFilter = [[GPUImageMonochromeFilter alloc] init]; [monochromeFilter setColor:(GPUVector4){0.0f, 0.0f, 1.0f, 1.0f}]; [monochromeFilter setIntensity:0.2];GPUImageVignetteFilter *vignetteFilter = [[GPUImageVignetteFilter alloc] init]; [vignetteFilter setVignetteEnd:0.7];GPUImageExposureFilter *exposureFilter = [[GPUImageExposureFilter alloc] init]; [exposureFilter setExposure:0.3];[filter addGPUFilter:exposureFilter]; [filter addGPUFilter:monochromeFilter]; [filter addGPUFilter:saturationFilter]; [filter addGPUFilter:vignetteFilter];看完了 GPUImage 的功能,一定很興奮吧。GPUImage 非常簡單,可以馬上開始使用(不需要了解 OpenGL),性能上也足夠完成你想要的一切。不止是這樣,它還自帶了非常多的積木一樣的部件 -- 色彩調整,混合模式,你能想到的想不到的一切視覺效果。
GPUImage 是開源社區(qū)少有的好東西,我們 Mac 和 iOS 開發(fā)者非常幸運的能擁有它。用 GPUImage 做些牛逼的東西,向其他人展示一個嶄新的世界。
譯者吐槽時間
我自己也用過一點 GPUImage,方便是很方便,不光是省掉了 AVFoundation 的許多煩人的 setup 代碼,還內置了許多濾鏡效果。不過它也有不少坑,我遇到的一個就是占用太多內存,一段時間后就 crash 掉了,畢竟是處理視頻,需要不少內存,iPhone 的內存又不太多,就要更加注意。我當時是加了一個 @autoreleasepool 就好多了。
總結
- 上一篇: What’s the Differenc
- 下一篇: B树、B+树、AVL树、红黑树