android: View, SurfaceView, GLSurfaceView, TextureView 区别与联系

区别与联系android

View: 显示视图,内置画布,提供了图形绘制函数、触屏事件、按键事件函数等,必须在UI主线程内更新画面,速度较慢;函数

SurfaceView: 基于view视图进行拓展的视图类,更适合2D游戏的开发,是view的子类,使用了双缓冲机制,即:容许在子线程中更新画面,因此刷新界面速度比view快。性能

GLSurfaceView: 基于SurfaceView视图再次进行拓展的视图类,在SurfaceView基础上封装了EGL环境管理以及render线程,专用于3D游戏开发的视图。是SurfaceView的子类,openGL专用。spa

TextrueView: 前面的SurfaceView的工做方式是建立一个置于应用窗口以后的新窗口,脱离了Android的普通窗口,所以没法对其应用变换操做(平移、缩放、旋转等),而TextureView则解决了此问题,Android4.0引入。.net

 

PS: UI线程(即主线程)中更新画面有时可能会引起问题,好比你须要更新画面的时间过长,那么UI线程会被你正在画的函数阻塞,那么将没法响应按键,触屏等消息。而SurfaceView 系的API因为是在新的线程中更新画面因此不会阻塞你的UI线程。但这也带来了另一个问题,就是事件同步,涉及到线程同步。线程

 

应用场景:视频

以游戏举例:blog

1 被动更新画面的。好比棋类,这种用View就行了。由于画面的更新是依赖于 onTouch 来更新,能够直接使用 invalidate。 在这种状况下,这一次Touch和下一次的Touch须要的时间比较长些,不会产生影响。游戏

2 主动更新。好比一我的在一直跑动。这就须要一个单独的thread不停的重绘人的状态,避免阻塞main UI thread。因此显然view不合适,须要SurfaceView来控制。事件

3.对于一些3D游戏来讲,为了追求极致的性能和帧率,可使用GLSurfaceView。其自己就封装了一些OpenGL ES的API, 经过着色器能够达到不少View难以达到的效果。

4.SurfaceView窗口刷新的时候不须要重绘应用程序的窗口(android普通窗口的视图绘制机制是一层一层的,任何一个子元素或者是局部的刷新都会致使整个视图结构所有重绘一次,所以效率很是低下,不过知足普通应用界面的需求仍是绰绰有余),可是SurfaceView也有一些很是不便的限制。由于SurfaceView的内容不在应用窗口上,因此不能使用变换(平移、缩放、旋转等),因此若是是对于视频播放器或者相机应用的开发,TextureView更加适合。


参考连接: