一文了解surface,surfaceview,surfaceTexture,GLsurfaceView

目录

1 基础知识
2 surface使用
3 surfaceTexture 结构分析
4 surfaceTexture 源码分析
5 QA
6 参考与附录

正文

Android画图两个模块,opengl和surface(buffer)。

1 基础知识

1) 画家:程序员.参数gl=手.画布:TexureView。OpenGL ES(render):画笔。SurfaceTexture:作品。Surface: 画纸。Graphic Buffer:画板。SurfaceFlinger显示。

  1. Surface、SurfaceView和SurfaceHolder 搞清楚这3个核心概念就搞懂了surface
    surface是buffer.surface==eglsurface=framebuffer;
    surfaceview是view.它是xml中的config,是屏幕显示size即surface中的图片的显示大小。可以说surfaceview是surface的前端。
    surfaceholder=surface,实际是surface的listener。任何surface变化都会调用surfaceholder。surface consumer 是双缓冲.
  2. SurfaceTexture和TextTexture都是把内容流上的图像转成纹理,然后输出.
    SurfaceTexture是buffer.SurfaceTexture 绑定surface.SurfaceTexture 是jave view 层,surface 是 native层。
    TextTexture=SurfaceView+SurfaceTexture。SurfaceView在主线程,SurfaceTexture在渲染线程
  3. Glsurfaceview,egl, render,opengl ,drawer,关系?
    GLsurfaceview=surfaceview+surfaceTexture+Opengl+egl。直接使用最上层即可.
    数据流:Glsurfaceview.setRender->render.ondrawFrame(display)->opengl->eglsurfaceC->屏幕Glsurfaceview.
  4. Egl,Surface,Opengl什么关系
    egl=context+surface+display. egl因为被封装在GLsurfaceview中,所以应用层看不到它的存在.
    context可以绑定多个surface,实现share context(eg:绑定codec surface和屏幕surface consumer).
    surface->display:双缓冲.swapbuffer将backbuffer 上的filter渲染发送到frontbuffer 即display


    一文了解surface,surfaceview,surfaceTexture,GLsurfaceView_第1张图片
    image

2 surface使用

scenario1: surface与camera:采集callback:调用setOnFrameAvailableListener()函数将VideoDumpRenderer(实现SurfaceTexture.OnFrameAvailableListener接口)作为SurfaceTexture的Listener.
scenario2: surface与filter: 一个surface一个filter texture

一文了解surface,surfaceview,surfaceTexture,GLsurfaceView_第2张图片
http://img2.sycdn.imooc.com/5da1a82d0001d31c06560380.jpg

示意图说明: 左边:主线程GLSurfaceView,使用渲染线程GLRender,GLRender使用主线程surface。右边surfaceholder和左边surface是一个。左边是新用法,右边是过去用法.

Surface实例分析: 参见:Android音视频(六) 使用OpenGL ES 3.0预览Camera https://juejin.cn/post/6844903962248740871

3 surfaceTexture 设计

3.1 surfaceTexture 是什么?
surfaceTexture是buffer .但是,它又不是简单的一个buffer,而是由两个buffer queue组成 .
这个整体结构图给力。把数据流向,输入输出,模块组成和作用说的很清楚.


一文了解surface,surfaceview,surfaceTexture,GLsurfaceView_第3张图片
image
image.gif

surfaceTexture=surfaceTexture product +surfaceTexture consumer queue+中间控制.
不同于一个buffer,只有生产者,消费者。它有生产者,中间商和消费者。
SurfaceTexture核心是BufferQueue.
3.2 surfaceTexture 数据流程:

  1. 上面中黑色部分是标准的surfaceTexture数据流程.
  2. 黑色部分+蓝色虚线段是本地渲染数据流程:camera->surface1P->filter Textbuf/fbo->surface1C->view(display)
  3. 黑色部分+蓝色虚线段+棕色部分是surfaceTexture share context数据流程:即实现了一个输入同时两个输出。
    在2)的基础上增加了camera->surface1P->filter Textbuf/fbo->Codec surface2->codec.
    主播推流就是采用3)的流程
    更详细的内容,参考附录

4 SurfaceTexture源码分析

Android图形系统之SurfaceTexture http://www.zyiz.net/tech/detail-135826.html

QA:

surfaceTexture与opengl textureid buffer的关系.why 要texturebuffer,而不是直接在gpu上run qsurface呢? GPU需要自己的内存。
surfaceTexture update之后就可以读下一张图片product了,理解为上一张处理完 在consmer中。
camera preview,codec,surfaceview的surface是同一个吗?no. codec surface 单独,camera preview is surfaceP,surfaceview的surface is surfaceviewC

参考:

1 Android 5.0(Lollipop)中的SurfaceTexture,TextureView, SurfaceView和GLSurfaceView:https://blog.csdn.net/jinzhuojun/article/details/44062175。
文章说明: 内容较好:

  1. 下文中的uml图和时序图很好,将类的结合,类的框架画的很清楚。
    2)surfaceview的底层实现是bufferqueue. 时序图说明了消息流程.
  2. 说明了java-jni-native 4) 说明了render线程.
    缺点:介绍过多,重点不突出,没有小节.

附录:

1) 此图只是surfaceTexture内部更详细一步.(不需要掌握):

一文了解surface,surfaceview,surfaceTexture,GLsurfaceView_第4张图片
image

2) 下面blog更详细到了框架源码中的底层(不需要掌握):

Android图形系统分析与移植--四、Surface Manager(Surface Flinger简介):https://blog.csdn.net/louiswangbing/article/details/6606810
blog说明1、Surface manager架构分析:camera->Surface manager Client端(filter)->Surface manager Server端(SurfaceFlinger:back buffer)->(eglswapbuffer)->front buffer ->Display. "3Surface Flinger的基本组成框架以下" 不需要看,过于详细(Flinger内部介绍&dispay还有一个硬件buffer(graphicplane->nativewindow->framenativewindow->hardware buffer).

一文了解surface,surfaceview,surfaceTexture,GLsurfaceView_第5张图片
image

你可能感兴趣的:(一文了解surface,surfaceview,surfaceTexture,GLsurfaceView)