一、SurfaceTexture介绍
SurfaceTexture是Android平台上的一个类,用于在OpenGL ES中将纹理与图像进行交互。它提供了一种机制,可以将图像数据流直接传递给OpenGL ES进行渲染,而无需将图像数据复制到CPU内存中。
SurfaceTexture可以从相机、视频解码器或其他图像源中接收图像数据,并将其作为OpenGL ES纹理提供给应用程序。它还可以用于实现视频播放、相机预览和实时图像处理等功能。
SurfaceTexture的工作原理是通过创建一个与OpenGL ES共享上下文的Surface对象,并将其作为参数传递给SurfaceTexture的构造函数。然后,应用程序可以使用SurfaceTexture的getTransformMatrix()方法获取纹理坐标变换矩阵,并将其应用于OpenGL ES渲染管线中的纹理。
通过SurfaceTexture,应用程序可以实现流畅的图像渲染和处理,同时减少了CPU和GPU之间的数据复制,提高了性能和效率。
SurfaceTexture 整个显示流程如下:
二、SurfaceTexture相关类
JAVA类
SurfaceTexture
SurfaceTexture类是Android中的一个重要类,用于在图形渲染管道中提供纹理数据。它允许应用程序将图像数据作为纹理传递给OpenGL ES或其他图形渲染器。
SurfaceTexture文件路径:
frameworks/base/graphics/java/android/graphics/SurfaceTexture.cpp
SurfaceTexture定义:
public class SurfaceTexture {}
C++类
SurfaceTexture
用于在图形渲染管道中提供纹理数据。它允许应用程序将图像数据作为纹理传递给OpenGL ES或其他图形渲染器。
SurfaceTexture文件路径:
frameworks/base/native/libs/nativedisplay/surfacetexture/SurfaceTexture.cpp
frameworks/base/native/libs/nativedisplay/include/surfacetexture/SurfaceTexture.h
SurfaceTexture定义:
class ANDROID_API SurfaceTexture : public ConsumerBase {}
EGLConsumer
EGLConsumer类是Android系统中的一个重要类,用于在图形渲染中处理EGL(OpenGL ES)缓冲区的消费者。它是Android硬件加速渲染管道的一部分,用于将图像数据从生产者传递给消费者。
EGLConsumer类的主要功能是接收来自生产者的EGL缓冲区,并将其传递给消费者进行显示或其他处理。它提供了一种机制,使得多个线程可以同时访问和处理EGL缓冲区,从而实现高效的图形渲染。
EGLConsumer文件路径:
frameworks/base/native/libs/nativedisplay/surfacetexture/EGLConsumer.cpp
frameworks/base/native/libs/nativedisplay/include/surfacetexture/EGLConsumer.h
EGLConsumer定义:
class EGLConsumer {}
ImageConsumer
ImageConsumer 实现了 SurfaceTexture 中处理 HWUI 视图系统使用的图像的部分。
ImageConsumer文件路径:
frameworks/base/native/libs/nativedisplay/surfacetexture/ImageConsumer.cpp
frameworks/base/native/libs/nativedisplay/include/surfacetexture/ImageConsumer.h
ImageConsumer定义:
class ImageConsumer {}
三、SurfaceTexture相关流程分析
SurfaceTexture 创建流程
new SurfaceTexture(textureId)启动SurfaceTexture初始化,核心逻辑如下所示:
SurfaceTexture初始化后,向GLConsumer设置了JNISurfaceTextureContext监听器,该监听器会回调到Java层SurfaceTexture.postEventFromNative方法,进一步回调到注册到SurfaceTexture中的OnFrameAvailableListener监听器,用于通知业务层有新的GraphicBuffer入队了。如果业务层对最新的GraphicBuffer感兴趣,则调用updateTexImage把GraphicBuffer更新到纹理,否则啥也不做,忽略一些图形数据。
GLConsumer是BufferQueue的直接消费者,负责把GraphicBuffer转化为纹理。然后通过监听类wp<FrameAvailableListener> mFrameAvailableListener通知间接消费者消费纹理。当间接消费者是SurfaceFlinger时,监听类为Layer,Layer进一步通知SurfaceFlinger去合成所有Layer,然后上屏。当间接消费者是SurfaceTexture时,监听类为JNISurfaceTextureContext,用于通知Java层新的图像数据可用了。