在我的Android應用程序中,我收到專有格式的遠程視頻流。當新的網絡數據包到達時,我會自行解碼並獲取位圖。在UI中,該位圖通過setImageBitmap()
方法顯示在ImageView控件中。如何在Android中優化位圖繪製?
我能夠處理12至14幀每秒。我想知道是否有方法來優化這方面的表現。如果可能的話,也許我可以使用硬件加速。
在我的Android應用程序中,我收到專有格式的遠程視頻流。當新的網絡數據包到達時,我會自行解碼並獲取位圖。在UI中,該位圖通過setImageBitmap()
方法顯示在ImageView控件中。如何在Android中優化位圖繪製?
我能夠處理12至14幀每秒。我想知道是否有方法來優化這方面的表現。如果可能的話,也許我可以使用硬件加速。
爲什麼不使用VideoView
已經爲你做了所有這些事情?
但是:
我認爲你應該使用SurfaceView
而不是ImageView
。隨着SurfaceView
你有你自己的專用線程,只是負責繪製在畫布上。因此重繪速度更快。
我想你是在一個完全正常的異步線程中編碼單個幀位圖。但是你應該考慮如何並行化。基本上使用ThreadPool
或類似的東西,將您的視頻解碼爲單個位圖。把它們放在一個Buffer
中,它可以是Fifo
,List
或Queue
或其他什麼,但是請記住,一個線程可以比另一個更快,所以你最好給每個解碼任務一個訂單號,以便你可以添加編碼後的位圖正確的訂單到Buffer
。 SurfaceView
下一個應該總是從緩衝區中取出第一個圖像並將其顯示在屏幕上。
安排SurfaceView
重繪線程以達到每秒60幀。因此,請不要在while-loop
中反覆重複考慮更智能(預定)的解決方案。
如果Buffer
包含足夠的圖像(您必須通過自己或谷歌確定緩衝區中的圖像數量),僅重繪。否則顯示「加載/緩衝」動畫
垃圾收集可能需要一些時間,因此儘量減少垃圾收集運行的時間。位圖關聯可能會消耗大量內存,因此垃圾回收器需要經常運行以查找下一個位圖的可用內存。因此,如果您可以以更適合智能手機的寬度/高度投放視頻源文件(可能針對不同顯示尺寸的不同文件),請考慮視頻源文件。考慮如何減少內存消耗。 BitmapFactory
有各種選項可用於減少內存消耗(減少運行垃圾回收),如inSampleSize
或inBitmap
,這似乎是一個不錯的選擇,因爲所有位圖應具有相同的寬度/高度。看看here。您還可以使用BitmapConfig.RGB_565
來減少位圖質量。
您可以使用自定義視圖與自定義繪圖,這種方式沒有必要一次又一次地創建臨時位圖 – pskink