@@ -2,13 +2,21 @@ SurfaceView与TextureView
22===
33
44
5- ## SurfaceView
5+ Android系统中图形系统是相当复杂的,包括WindowManager、SurfaceFlinger、OpenGL等。
6+
7+ 其中SurfaceFlinger(表面合成器或表面渲染器)作为负责绘制应用UI的核心。
8+
9+ 但是不论使用什么渲染API,所有的东西最终都渲染到Surface上,Android平台所创建的Window都由Surface所支持,所有可见的Surface渲染到显示设备都是通过SurfaceFlinger来完成。
10+
11+
12+
613
7- 在说SurfaceView之前,需要先说一下几个相关的部分。
814
915### ` Surface ` 简介
1016
11- - ` Surface ` 就是“表面”的意思,可以简单理解为内存中的一段绘图缓冲区。在` SDK ` 的文档中,对` Surface ` 的描述是这样的:“` Handle onto a raw buffer that is being managed by the screen compositor ` ”,
17+ - ` Surface ` 就是“表面”的意思,可以简单理解为内存中的一段绘图缓冲区。
18+
19+ 在` SDK ` 的文档中,对` Surface ` 的描述是这样的:“` Handle onto a raw buffer that is being managed by the screen compositor ` ”,
1220 翻译成中文就是“由屏幕显示内容合成器` (screen compositor) ` 所管理的原生缓冲器的句柄”, 这句话包括下面两个意思:
1321
1422 - 通过` Surface ` (因为` Surface ` 是句柄)就可以获得原生缓冲器以及其中的内容。就像在` C ` 语言中,可以通过一个文件的句柄,就可以获得文件的内容一样;
@@ -19,6 +27,9 @@ SurfaceView与TextureView
1927- ` Surface ` 是一个用来画图形的地方,但是我们知道画图都是在一个` Canvas ` 对象上面进行的,* ` Surface ` 中的` Canvas ` 成员,是专门用于提供画图的地方,就像黑板一样,其中的原始缓冲区是用来保存数据的地方,
2028 ` Surface ` 本身的作用类似一个句柄,得到了这个句柄就可以得到其中的` Canvas ` 、原始缓冲区以及其他方面的内容,所以简单的说` Surface ` 是用来管理数据的(句柄)* 。
2129
30+
31+ Surface是一个绘制目标,可以被系统的SurfaceFlinger直接合成显示在屏幕上。
32+
2233### ` SurfaceView ` 简介
2334
2435- 简单的说` SurfaceView ` 就是一个有` Surface ` 的` View ` 里面内嵌了一个专门用于绘制的` Surface ` ,` SurfaceView ` 控制这个` Surface ` 的格式和尺寸以及绘制位置。
@@ -84,16 +95,40 @@ TextureView是一个可以把内容流作为外部纹理输出在上面的View,
8495
8596### SurfaceTexture
8697
87- SurfaceTexture是Surface和OpenGL ES(GLES)纹理的组合。SurfaceTexture用于提供输出到GLES 纹理的Surface。SurfaceTexture是从Android 3.0开始加入,与SurfaceView不同的是,它对图像流的处理并不直接显示,而是转为GL外部纹理,因此用于图像流数据的二次处理。比如Camera的预览数据,变成纹理后可以交给GLSurfaceView直接显示,也可以通过SurfaceTexture交给TextureView作为View heirachy中的一个硬件加速层来显示。首先,SurfaceTexture从图像流(来自Camera预览、视频解码、GL绘制场景等)中获得帧数据,当调用updateTexImage()时,根据内容流中最近的图像更新SurfaceTexture对应的GL纹理对象。
98+ SurfaceTexture 是一种 纹理对象,可以作为 OpenGL ES 纹理(OES 纹理)进行处理。它不会直接显示在屏幕上,而是可以将内容传递给 OpenGL 进行进一步处理或绘制。
99+
100+ SurfaceTexture用于提供输出到GLES 纹理的Surface。SurfaceTexture是从Android 3.0开始加入,与SurfaceView不同的是,它对图像流的处理并不直接显示,而是转为GL外部纹理,因此用于图像流数据的二次处理。比如Camera的预览数据,变成纹理后可以交给GLSurfaceView直接显示,也可以通过SurfaceTexture交给TextureView作为View heirachy中的一个硬件加速层来显示。
101+
102+ 在Android系统重,SurfaceTexture是一个特殊的类,它将来自硬件纹理缓冲区(如相机预览流或视频解码输出)的图像数据转换为OpenGL ES可以直接使用的纹理。
103+
104+ updateTexImage()方法是SurfaceTexture类的核心方法之一,此方法的主要作用是从SurfaceTexture内部特有的图像缓冲区中取出最新一帧,
105+ 并将其内容复制到与SurfaceTexture关联的OpenGL纹理上。
106+
107+ 这对于实时图形渲染、视频播放以及从相机捕获并实时处理图像等场景至关重要。
88108
89109
90110
91111SurfaceTexture 包含一个应用是其使用方的BufferQueue。当生产方将新的缓冲区排入队列时,onFrameAvailable() 回调会通知应用。然后,应用调用updateTexImage(),这会释放先前占有的缓冲区,从队列中获取新缓冲区并执行EGL调用,从而使GLES可将此缓冲区作为外部纹理使用。
92112
113+
114+ ##### Surface与SurfaceTexture的关系
115+
116+ - SurfaceTexture是一个OpenGL纹理对象,用于GPU处理视频流或相机数据,它不会直接显示在屏幕上,需要OpenGL渲染后才能看到。
117+ - Surface是一个绘制目标,可以直接用于屏幕渲染,它可以基于SurfaceTexture创建,这样Surface就可以间接获取SurfaceTexture的数据。
118+
119+ 例如相机使用OpenGL的渲染过程:
120+
121+ - 在相机预览时,Camera可以将相机数据输出到SurfaceTexture上,然后
122+ - SurfaceTexture采集相机数据,并将其存储到OpenGL纹理中(OES纹理)
123+ - SurfaceTexture触发onFrameAvailable()回调,通知OpenGL纹理更新。
124+ - OpenGL使用该纹理进行渲染,最终显示在GLSurfaceView或TextureView上。
125+
126+
93127## SurfaceView vs TextureView
94128
95129
96130
131+
97132简单地说,SurfaceView是一个有自己Surface的View。它的渲染可以放在单独线程而不是主线程中。其缺点是不能做变形和动画。SurfaceTexture可以用作非直接输出的内容流,这样就提供二次处理的机会。与SurfaceView直接输出相比,这样会有若干帧的延迟。同时,由于它本身管理BufferQueue,因此内存消耗也会稍微大一些。TextureView是一个可以把内容流作为外部纹理输出在上面的View。它本身需要是一个硬件加速层。事实上TextureView本身也包含了SurfaceTexture。它与SurfaceView+SurfaceTexture组合相比可以完成类似的功能(即把内容流上的图像转成纹理,然后输出)。区别在于TextureView是在View hierachy中做绘制,因此一般它是在主线程上做的(在Android 5.0引入渲染线程后,它是在渲染线程中做的)。而SurfaceView+SurfaceTexture在单独的Surface上做绘制,可以是用户提供的线程,而不是系统的主线程或是渲染线程。
98133
99134
@@ -123,4 +158,5 @@ SurfaceTexture 包含一个应用是其使用方的BufferQueue。当生产方将
123158---
124159
125160- 邮箱 :charon.chui@gmail.com
126- - Good Luck!
161+ - Good Luck!
162+
0 commit comments