顯示具有 hardwareAccelerated 標籤的文章。 顯示所有文章
顯示具有 hardwareAccelerated 標籤的文章。 顯示所有文章

2014年4月27日 星期日

Hardware Acceleration 的陷阱

最近寫了個程式,剛好要利用 Canvas 中的 clipPath() 函式來繪圖。結果是,不管我如何呼叫 Canvas.clipPath(),似乎一點作用也沒有。最後才發現,原來是 hardware acceleration (硬體加速) 這個系統功能搞的鬼。

Hardware acceleration 是從 Android 3.0 開始,Android 繪圖系統利用 GPU 支援的 OpenGL 渲染功能來加速 2D 圖像繪製的一種新功能。硬體加速?可以加速繪圖的速度,這聽起來似乎很美好。不過實際上,這個功能有很多的限制。例如,Canvas.clipPath() 在 API 17 之前就是不支援的。

這個連結中 列出所有硬體加速功能的限制。很複雜吧!更糟的是,只要你的 minSdkVersion 或是 targetSdkVersion 設定為 14 以上,這硬體加速功能,預設竟然是開啟的!

如果你的應用需要用到的 Canvas 的各式繪圖函式,而結果又出乎你預期時,我會建議你先關掉硬體加速功能,試試看是否因為這個原因所導致的。

要關閉硬體加速功能,最簡單的方法是加上 android:hardwareAccelerated="false" 這個屬性到 AndroidManifest.xml 中的 Application 標籤中。不過這個方法會讓你應用中的所有 View 的繪製都不允許硬體加速。這似乎有點極端,所以 Android 也提供 Window based 或 View based 的關閉方法。當你確定應用的不正常行為是因硬體加速功能所導致,這時你可以利用前述方法,將某些 Views 或 Windows 的硬體加速功能關掉即可。


繼續閱讀全文...