1. 程式人生 > >視訊畫面幀的展示控制元件SurfaceView及TextureView對比

視訊畫面幀的展示控制元件SurfaceView及TextureView對比

轉載請把頭部出處連結和尾部二維碼一起轉載,本文出自逆流的魚yuiop:http://blog.csdn.net/hejjunlin/article/details/58582919 

  • SurfaceView是什麼 ?

  • SurfaceView優點及缺點?

  • SurfaceView中雙緩衝?

  • TextureView是什麼?

  • TextureView優點及缺點?

  • 兩者的效能相比如何?

  • 播放器應該選擇誰?



SurfaceView是什麼?


它繼承自類View,因此它本質上是一個View。但與普通View不同的是,它有自己的Surface。有自己的Surface,在WMS中有對應的WindowState,在SurfaceFlinger中有Layer。我們知道,一般的Activity包含的多個View會組成View hierachy的樹形結構,只有最頂層的DecorView,也就是根結點檢視,才是對WMS可見的。這個DecorView在WMS中有一個對應的WindowState。相應地,在SF中對應的Layer。而SurfaceView自帶一個Surface,這個Surface在WMS中有自己對應的WindowState,在SF中也會有自己的Layer。雖然在App端它仍在View hierachy中,但在Server端(WMS和SF)中,它與宿主視窗是分離的。這樣的好處是對這個Surface的渲染可以放到單獨執行緒去做,渲染時可以有自己的GL context。這對於一些遊戲、視訊等效能相關的應用非常有益,因為它不會影響主執行緒對事件的響應。但它也有缺點,因為這個Surface不在View hierachy中,它的顯示也不受View的屬性控制,所以不能進行平移,縮放等變換,也不能放在其它ViewGroup中,一些View中的特性也無法使用。


SurfaceView優點及缺點


優點:可以在一個獨立的執行緒中進行繪製,不會影響主執行緒

          使用雙緩衝機制,播放視訊時畫面更流暢

缺點:Surface不在View hierachy中,它的顯示也不受View的屬性控制,所以不能進行平移,縮放等變換,也不能放在其它ViewGroup中。SurfaceView 不能巢狀使用


SurfaceView中雙緩衝


雙緩衝:在運用時可以理解為:SurfaceView在更新檢視時用到了兩張Canvas,一張frontCanvas和一張backCanvas,每次實際顯示的是frontCanvas,backCanvas儲存的是上一次更改前的檢視,當使用lockCanvas()獲取畫布時,得到的實際上是backCanvas而不是正在顯示的frontCanvas,之後你在獲取到的backCanvas上繪製新檢視,再unlockCanvasAndPost(canvas)此檢視,那麼上傳的這張canvas將替換原來的frontCanvas作為新的frontCanvas,原來的frontCanvas將切換到後臺作為backCanvas。例如,如果你已經先後兩次繪製了檢視A和B,那麼你再呼叫lockCanvas()獲取檢視,獲得的將是A而不是正在顯示的B,之後你講重繪的C檢視上傳,那麼C將取代B作為新的frontCanvas顯示在SurfaceView上,原來的B則轉換為backCanvas。


TextureView是什麼


在4.0(API level 14)中引入,與SurfaceView一樣繼承View,     它可以將內容流直接投影到View中,它可以將內容流直接投影到View中,可以用於實現Live preview等功能。和SurfaceView不同,它不會在WMS中單獨建立視窗,而是作為View hierachy中的一個普通View,因此可以和其它普通View一樣進行移動,旋轉,縮放,動畫等變化。值得注意的是TextureView必須在硬體加速的視窗中。它顯示的內容流資料可以來自App程序或是遠端程序。從類圖中可以看到,TextureView繼承自View,它與其它的View一樣在View hierachy中管理與繪製。TextureView過載了draw()方法,其中主要SurfaceTexture中收到的影象資料作為紋理更新到對應的HardwareLayer中。SurfaceTexture.OnFrameAvailableListener用於通知TextureView內容流有新影象到來。SurfaceTextureListener介面用於讓TextureView的使用者知道SurfaceTexture已準備好,這樣就可以把SurfaceTexture交給相應的內容源。Surface為BufferQueue的Producer介面實現類,使生產者可以通過它的軟體或硬體渲染介面為SurfaceTexture內部的BufferQueue提供graphic buffer。


TextureView優點及缺點


優點:支援移動、旋轉、縮放等動畫,支援截圖

缺點:必須在硬體加速的視窗中使用,佔用記憶體比SurfaceView高,在5.0以前在主執行緒渲染,5.0以後有單獨的渲染執行緒。


誰的效能更優?




播放器應該選擇誰?


從效能和安全性角度出發,使用播放器優先選SurfaceView。

1、在android 7.0上系統surfaceview的效能比TextureView更有優勢,支援物件的內容位置和包含的應用內容同步更新,平移、縮放不會產生黑邊。 在7.0以下系統如果使用場景有動畫效果,可以選擇性使用TextureView

2、由於失效(invalidation)和緩衝的特性,TextureView增加了額外1~3幀的延遲顯示畫面更新

3、TextureView總是使用GL合成,而SurfaceView可以使用硬體overlay後端,可以佔用更少的記憶體頻寬,消耗更少的能量

4、TextureView的內部緩衝佇列導致比SurfaceView使用更多的記憶體

5、SurfaceView: 內部自己持有surface,surface 建立、銷燬、大小改變時系統來處理的,通過surfaceHolder 的callback回撥通知。當畫布建立好時,可以將surface繫結到MediaPlayer中。SurfaceView如果為使用者可見的時候,建立SurfaceView的SurfaceHolder用於顯示視訊流解析的幀圖片,如果發現SurfaceView變為使用者不可見的時候,則立即銷燬SurfaceView的SurfaceHolder,以達到節約系統資源的目的


第一時間獲得部落格更新提醒,以及更多android乾貨,原始碼分析,歡迎關注我的微信公眾號,掃一掃下方二維碼或者長按識別二維碼,即可關注。

這裡寫圖片描述
如果你覺得好,隨手點贊,也是對筆者的肯定,也可以分享此公眾號給你更多的人,原創不易


轉載請把頭部出處連結和尾部二維碼一起轉載,本文出自逆流的魚yuiop:http://blog.csdn.net/hejjunlin/article/details/58582919 

  • SurfaceView是什麼 ?

  • SurfaceView優點及缺點?

  • SurfaceView中雙緩衝?

  • TextureView是什麼?

  • TextureView優點及缺點?

  • 兩者的效能相比如何?

  • 播放器應該選擇誰?



SurfaceView是什麼?


它繼承自類View,因此它本質上是一個View。但與普通View不同的是,它有自己的Surface。有自己的Surface,在WMS中有對應的WindowState,在SurfaceFlinger中有Layer。我們知道,一般的Activity包含的多個View會組成View hierachy的樹形結構,只有最頂層的DecorView,也就是根結點檢視,才是對WMS可見的。這個DecorView在WMS中有一個對應的WindowState。相應地,在SF中對應的Layer。而SurfaceView自帶一個Surface,這個Surface在WMS中有自己對應的WindowState,在SF中也會有自己的Layer。雖然在App端它仍在View hierachy中,但在Server端(WMS和SF)中,它與宿主視窗是分離的。這樣的好處是對這個Surface的渲染可以放到單獨執行緒去做,渲染時可以有自己的GL context。這對於一些遊戲、視訊等效能相關的應用非常有益,因為它不會影響主執行緒對事件的響應。但它也有缺點,因為這個Surface不在View hierachy中,它的顯示也不受View的屬性控制,所以不能進行平移,縮放等變換,也不能放在其它ViewGroup中,一些View中的特性也無法使用。


SurfaceView優點及缺點


優點:可以在一個獨立的執行緒中進行繪製,不會影響主執行緒

          使用雙緩衝機制,播放視訊時畫面更流暢

缺點:Surface不在View hierachy中,它的顯示也不受View的屬性控制,所以不能進行平移,縮放等變換,也不能放在其它ViewGroup中。SurfaceView 不能巢狀使用


SurfaceView中雙緩衝


雙緩衝:在運用時可以理解為:SurfaceView在更新檢視時用到了兩張Canvas,一張frontCanvas和一張backCanvas,每次實際顯示的是frontCanvas,backCanvas儲存的是上一次更改前的檢視,當使用lockCanvas()獲取畫布時,得到的實際上是backCanvas而不是正在顯示的frontCanvas,之後你在獲取到的backCanvas上繪製新檢視,再unlockCanvasAndPost(canvas)此檢視,那麼上傳的這張canvas將替換原來的frontCanvas作為新的frontCanvas,原來的frontCanvas將切換到後臺作為backCanvas。例如,如果你已經先後兩次繪製了檢視A和B,那麼你再呼叫lockCanvas()獲取檢視,獲得的將是A而不是正在顯示的B,之後你講重繪的C檢視上傳,那麼C將取代B作為新的frontCanvas顯示在SurfaceView上,原來的B則轉換為backCanvas。


TextureView是什麼


在4.0(API level 14)中引入,與SurfaceView一樣繼承View,     它可以將內容流直接投影到View中,它可以將內容流直接投影到View中,可以用於實現Live preview等功能。和SurfaceView不同,它不會在WMS中單獨建立視窗,而是作為View hierachy中的一個普通View,因此可以和其它普通View一樣進行移動,旋轉,縮放,動畫等變化。值得注意的是TextureView必須在硬體加速的視窗中。它顯示的內容流資料可以來自App程序或是遠端程序。從類圖中可以看到,TextureView繼承自View,它與其它的View一樣在View hierachy中管理與繪製。TextureView過載了draw()方法,其中主要SurfaceTexture中收到的影象資料作為紋理更新到對應的HardwareLayer中。SurfaceTexture.OnFrameAvailableListener用於通知TextureView內容流有新影象到來。SurfaceTextureListener介面用於讓TextureView的使用者知道SurfaceTexture已準備好,這樣就可以把SurfaceTexture交給相應的內容源。Surface為BufferQueue的Producer介面實現類,使生產者可以通過它的軟體或硬體渲染介面為SurfaceTexture內部的BufferQueue提供graphic buffer。


TextureView優點及缺點


優點:支援移動、旋轉、縮放等動畫,支援截圖

缺點:必須在硬體加速的視窗中使用,佔用記憶體比SurfaceView高,在5.0以前在主執行緒渲染,5.0以後有單獨的渲染執行緒。


誰的效能更優?




播放器應該選擇誰?


從效能和安全性角度出發,使用播放器優先選SurfaceView。

1、在android 7.0上系統surfaceview的效能比TextureView更有優勢,支援物件的內容位置和包含的應用內容同步更新,平移、縮放不會產生黑邊。 在7.0以下系統如果使用場景有動畫效果,可以選擇性使用TextureView

2、由於失效(invalidation)和緩衝的特性,TextureView增加了額外1~3幀的延遲顯示畫面更新

3、TextureView總是使用GL合成,而SurfaceView可以使用硬體overlay後端,可以佔用更少的記憶體頻寬,消耗更少的能量

4、TextureView的內部緩衝佇列導致比SurfaceView使用更多的記憶體

5、SurfaceView: 內部自己持有surface,surface 建立、銷燬、大小改變時系統來處理的,通過surfaceHolder 的callback回撥通知。當畫布建立好時,可以將surface繫結到MediaPlayer中。SurfaceView如果為使用者可見的時候,建立SurfaceView的SurfaceHolder用於顯示視訊流解析的幀圖片,如果發現SurfaceView變為使用者不可見的時候,則立即銷燬SurfaceView的SurfaceHolder,以達到節約系統資源的目的


第一時間獲得部落格更新提醒,以及更多android乾貨,原始碼分析,歡迎關注我的微信公眾號,掃一掃下方二維碼或者長按識別二維碼,即可關注。

這裡寫圖片描述
如果你覺得好,隨手點贊,也是對筆者的肯定,也可以分享此公眾號給你更多的人,原創不易