Android模糊影象教程(4)

hanson發表於2014-05-05

在本系列的前面部分,我們已經看過使用RenderScript來模糊一張圖片,並通過一個效能分析技巧解決了此過程的瓶頸。我們發現使用RenderScipt時,實際的模糊操作得非常快。但還是無法避免Java記憶體空間與RenderScript記憶體空間之間點陣圖編碼(Marshalling)帶來的開銷。在這篇文章裡,我們將不通過記憶體空間編碼來實現模糊的功能,看看是否可以得到更好的效果。

首先必須承認,對於各種模糊演算法的Java實現,我並沒有做過詳細的測試。所以很有可能一些其它演算法比我挑選的更有效率。我挑選的演算法來自StackOverflow上Yahel Bouaziz的回答,他很清楚地相關的模型,並且聲稱此演算法特別快速。有評論說這個演算法比其它的方法快得多。

我不會在這裡重複這個方法,具體的實現可以參考這個資源
裡了。我也不會對不同的模糊演算法進行說明,解釋Yahel的程式碼是如何工作的,或者與其它實現進行比較。這些不是實現模糊系列文章的重點。如果想了解更多的資訊,這裡有一個很好的Java image Processing指南,它使用AWT libraries實現。雖然不要直接在Android上使用,但卻是學習不同模糊演算法一個不錯的起點。

我們使用一種不同的方法來對Yahel的方法進行封裝,包括一個TimingLogger。這樣可以方便地評估實現效果:

執行後能夠得到以下效果:

part4

必須同意Yehel的說法,效果看起來好多了。所有關鍵的執行效果表現如何呢?

使用之前執行RenderScript模糊影象的同一臺裝置進行測試,確保程式使用同一個基準測試。在節省了RenderScipt記憶體空間的編碼開銷後,單是模糊操作的時間就比包括訊號編碼RenderScript方法操作時間長了兩到三倍。但這並不表明Yehel的方法不高效,這是由於沒有直接在GPU上執行,而GPU恰好適合執行這種繁重的計算任務。

這個結果清晰地表明瞭當執行這類操作時,RenderScript非常有希望帶來實現效果的顯著提升。而當記憶體之間的解碼開銷很大時,由此得到的效果會讓人相信這裡的開銷相當值得。在下一篇文章裡,我們將深入討論當執行動畫時的幀速率,並探究是否可以讓模糊背景的過程更加流暢。

本文的原始碼可以在這裡找到。

相關文章