SurfaceView是什么 岗钩?
SurfaceView優(yōu)點及缺點纽窟?
SurfaceView中雙緩沖?
TextureView是什么兼吓?
TextureView優(yōu)點及缺點臂港?
兩者的性能相比如何?
播放器應(yīng)該選擇誰视搏?
SurfaceView是什么审孽?
它繼承自類View,因此它本質(zhì)上是一個View浑娜。但與普通View不同的是佑力,它有自己的Surface。有自己的Surface筋遭,在WMS中有對應(yīng)的WindowState打颤,在SurfaceFlinger中有Layer。我們知道漓滔,一般的Activity包含的多個View會組成View hierachy的樹形結(jié)構(gòu)编饺,只有最頂層的DecorView,也就是根結(jié)點視圖次和,才是對WMS可見的反肋。這個DecorView在WMS中有一個對應(yīng)的WindowState。相應(yīng)地踏施,在SF中對應(yīng)的Layer石蔗。而SurfaceView自帶一個Surface,這個Surface在WMS中有自己對應(yīng)的WindowState畅形,在SF中也會有自己的Layer养距。雖然在App端它仍在View hierachy中,但在Server端(WMS和SF)中日熬,它與宿主窗口是分離的棍厌。這樣的好處是對這個Surface的渲染可以放到單獨線程去做,渲染時可以有自己的GL context。這對于一些游戲耘纱、視頻等性能相關(guān)的應(yīng)用非常有益敬肚,因為它不會影響主線程對事件的響應(yīng)。但它也有缺點束析,因為這個Surface不在View hierachy中艳馒,它的顯示也不受View的屬性控制,所以不能進行平移员寇,縮放等變換弄慰,也不能放在其它ViewGroup中,一些View中的特性也無法使用蝶锋。
SurfaceView優(yōu)點及缺點
優(yōu)點:可以在一個獨立的線程中進行繪制陆爽,不會影響主線程
? ? ? ? ? 使用雙緩沖機制,播放視頻時畫面更流暢
缺點:Surface不在View hierachy中扳缕,它的顯示也不受View的屬性控制慌闭,所以不能進行平移,縮放等變換第献,也不能放在其它ViewGroup中贡必。SurfaceView 不能嵌套使用
SurfaceView中雙緩沖
雙緩沖:在運用時可以理解為:SurfaceView在更新視圖時用到了兩張Canvas,一張frontCanvas和一張backCanvas庸毫,每次實際顯示的是frontCanvas仔拟,backCanvas存儲的是上一次更改前的視圖,當使用lockCanvas()獲取畫布時飒赃,得到的實際上是backCanvas而不是正在顯示的frontCanvas利花,之后你在獲取到的backCanvas上繪制新視圖,再unlockCanvasAndPost(canvas)此視圖载佳,那么上傳的這張canvas將替換原來的frontCanvas作為新的frontCanvas炒事,原來的frontCanvas將切換到后臺作為backCanvas。例如蔫慧,如果你已經(jīng)先后兩次繪制了視圖A和B挠乳,那么你再調(diào)用lockCanvas()獲取視圖,獲得的將是A而不是正在顯示的B姑躲,之后你講重繪的C視圖上傳睡扬,那么C將取代B作為新的frontCanvas顯示在SurfaceView上,原來的B則轉(zhuǎn)換為backCanvas黍析。
TextureView是什么
在4.0(API level 14)中引入卖怜,與SurfaceView一樣繼承View, ? ? 它可以將內(nèi)容流直接投影到View中阐枣,它可以將內(nèi)容流直接投影到View中马靠,可以用于實現(xiàn)Live preview等功能奄抽。和SurfaceView不同,它不會在WMS中單獨創(chuàng)建窗口甩鳄,而是作為View hierachy中的一個普通View逞度,因此可以和其它普通View一樣進行移動,旋轉(zhuǎn)娩贷,縮放第晰,動畫等變化。值得注意的是TextureView必須在硬件加速的窗口中彬祖。它顯示的內(nèi)容流數(shù)據(jù)可以來自App進程或是遠端進程。從類圖中可以看到品抽,TextureView繼承自View储笑,它與其它的View一樣在View hierachy中管理與繪制。TextureView重載了draw()方法圆恤,其中主要SurfaceTexture中收到的圖像數(shù)據(jù)作為紋理更新到對應(yīng)的HardwareLayer中突倍。SurfaceTexture.OnFrameAvailableListener用于通知TextureView內(nèi)容流有新圖像到來。SurfaceTextureListener接口用于讓TextureView的使用者知道SurfaceTexture已準備好盆昙,這樣就可以把SurfaceTexture交給相應(yīng)的內(nèi)容源羽历。Surface為BufferQueue的Producer接口實現(xiàn)類,使生產(chǎn)者可以通過它的軟件或硬件渲染接口為SurfaceTexture內(nèi)部的BufferQueue提供graphic buffer淡喜。
TextureView優(yōu)點及缺點
優(yōu)點:支持移動秕磷、旋轉(zhuǎn)、縮放等動畫炼团,支持截圖
缺點:必須在硬件加速的窗口中使用澎嚣,占用內(nèi)存比SurfaceView高,在5.0以前在主線程渲染瘟芝,5.0以后有單獨的渲染線程易桃。
誰的性能更優(yōu)?
播放器應(yīng)該選擇誰锌俱?
從性能和安全性角度出發(fā)晤郑,使用播放器優(yōu)先選SurfaceView。
1贸宏、在android 7.0上系統(tǒng)surfaceview的性能比TextureView更有優(yōu)勢造寝,支持對象的內(nèi)容位置和包含的應(yīng)用內(nèi)容同步更新,平移锚赤、縮放不會產(chǎn)生黑邊匹舞。 在7.0以下系統(tǒng)如果使用場景有動畫效果,可以選擇性使用TextureView
2线脚、由于失效(invalidation)和緩沖的特性赐稽,TextureView增加了額外1~3幀的延遲顯示畫面更新
3叫榕、TextureView總是使用GL合成,而SurfaceView可以使用硬件overlay后端姊舵,可以占用更少的內(nèi)存帶寬晰绎,消耗更少的能量
4、TextureView的內(nèi)部緩沖隊列導(dǎo)致比SurfaceView使用更多的內(nèi)存
5括丁、SurfaceView: 內(nèi)部自己持有surface荞下,surface 創(chuàng)建、銷毀史飞、大小改變時系統(tǒng)來處理的尖昏,通過surfaceHolder 的callback回調(diào)通知。當畫布創(chuàng)建好時构资,可以將surface綁定到MediaPlayer中抽诉。SurfaceView如果為用戶可見的時候,創(chuàng)建SurfaceView的SurfaceHolder用于顯示視頻流解析的幀圖片吐绵,如果發(fā)現(xiàn)SurfaceView變?yōu)橛脩舨豢梢姷臅r候迹淌,則立即銷毀SurfaceView的SurfaceHolder,以達到節(jié)約系統(tǒng)資源的目的