Android SurfaceTexture

一、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层新的图像数据可用了。

  • 22
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值