SurfaceView、TextureView、GLSurfaceView 和 SurfaceTexture

SurfaceView


SurfaceView 是一個能夠在子線程中更新 UI 的 View,且不會影響到主線程微信


它爲本身建立了一個窗口(window),就好像在視圖層次(View Hierarchy)上穿了個「洞」,讓繪圖層(Surface)直接顯示出來。app


可是,和常規視圖(view)不一樣,它沒有動畫或者變形特效,一些 View 的特性也沒法使用。編輯器


歸納:學習

  • SurfaceView 獨立於視圖層次(View Hierarchy),擁有本身的繪圖層(Surface),但也沒有一些常規視圖(View)的特性,如動畫等。flex

  • SurfaceView 的實現中具備兩個繪圖層(Surface),即咱們所說的雙緩衝機制。咱們的繪製發生在後臺畫布上,並經過交換先後臺畫布來刷新畫面,可避免局部刷新帶來的閃爍,也提升了渲染效率。動畫

  • SurfaceView 中的 SurfaceHolder 是 Surface 的持有者和管理控制者。google

  • SurfaceHolder.Callback 的各個回調發生在主線程。url


GLSurfaceView


GLSurfaceView 繼承 SurfaceView,除了擁有 SurfaceView 全部特性外,還加入了 EGL(EGL 是 OpenGL ES 和原生窗口系統之間的橋樑) 的管理,並自帶了一個單獨的渲染線程。spa


歸納:.net

  • 繼承自 SurfaceView,擁有其全部特性。

  • 加入了 EGL 管理,是 SurfaceView 應用 OpenGL ES 的典型場景。

  • 有單獨的渲染線程 GLThread。

  • 單獨出了 Renderer 接口負責實際渲染,不一樣的 Renderer 實現至關於不一樣的渲染策略,使用方式靈活(策略模式)。


SurfaceTexture


Android 3.0(API 11)新加入的一個類,不一樣於 SurfaceView 會將圖像顯示在屏幕上,SurfaceTexture 對圖像流的處理並不直接顯示,而是轉爲 GL 外部紋理


歸納:

  • SurfaceTexture 能夠從圖像流(相機、視頻)中捕獲幀數據用做 OpenGL ES 外部紋理(GL_TEXTURE_EXTERNAL_OES),實現無縫鏈接

  • 咱們能夠很方便的對這個外部紋理進行二次處理(如添加濾鏡等)。

  • 輸出目標是 Camera 或 MediaPlayer 時,能夠用 SurfaceTexture 代替 SurfaceHolder,這樣圖像流將把全部幀傳給 SurfaceTexture 而不是顯示在設備上。

  • 使用 updateTexImage() 方法更新最新的圖像。


TextureView


TextureView 是 Android 4.0(API 14)引入,它必須使用在開啓了硬件加速的窗體中。


除了擁有 SurfaceView 的特性外,它還能夠進行像常規視圖(View)那樣進行平移、縮放等動畫


歸納:

  • 必須開啓硬件加速(這個默認就是開啓的)。

  • 能夠像常規視圖(View)那樣使用它,包括進行平移、縮放等操做

  • TextureView 重載了 draw() 方法,主要是使用 SurfaceTexture 中收到的圖像數據做爲紋理更新到對應的 HardwareLayer 中。

  • 經過 SurfaceTextureListener 接口讓使用者知道 SurfaceTexture 的各類狀態。


SurfaceView 對比 TextureView



SurfaceView TextureView
內存 較低 較高
繪製 及時 1-3 幀延遲
耗電 較低 較高
動畫和截圖 不支持 支持


本文連接:https://blog.csdn.net/afei__/article/details/100023701

做者:阿飛__


-- END --


進技術交流羣,掃碼添加個人微信:Byte-Flow



獲取視頻教程和源碼



推薦:

Android OpenGL 渲染圖像讀取哪家強?

字節流動 OpenGL ES 技術交流羣來啦

FFmpeg + OpenGL ES 實現 3D 全景播放器

FFmpeg + OpenGLES 實現視頻解碼播放和視頻濾鏡

一文掌握 YUV 圖像的基本處理

Android OpenGL ES 從入門到精通系統性學習教程

OpenGL ES 實現動態(水波紋)漣漪效果


以爲不錯,點個在看唄~

本文分享自微信公衆號 - 字節流動(google_developer)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。