視頻畫面幀的展示控件SurfaceView及TextureView對比
-
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,以達到節約系統資源的目的
ps : 以后發文章給順便大家分享個小視頻,幾分鐘內的,希望帶給大家多一些思考,提高自己的人生格局的思考點,而不是純粹的知識點或某個知識。不知覺得如何,如果有更好的點子,也可以給我留言分享。
今天分享受的是, 一個乞丐如何精準定位的思考, 不管身處什么環境什么崗位,努力比別人多思考一點,就是人才,就是專家。
來自:https://mp.weixin.qq.com/s?__biz=MzI2OTQxMTM4OQ==&mid=2247484652&idx=1&sn=3cae1ac74a02b161a1f0d7e975edae3e&chksm=eae1f1bedd9678a8a98f1dfe3e079d559d744212ee45cf14add53549fd928f908fff7620ded9#rd