一文了解surface,surfaceview,surfaceTexture,GLsurfaceView

目录

1 基础知识

2 surface使用

3 surfaceTexture使用

4 surfaceTexture 结构分析

5 surfaceTexture 源码分析

6 SurfaceFlinger

7 QA

8 参考与附录

正文

一##. 概述
Android系统中图形系统是相当复杂的,包括WindowManager,SurfaceFlinger,Open GL,GPU等模块。 其中SurfaceFlinger作为负责绘制应用UI的核心,从名字可以看出其功能是将所有Surface合成工作。 不论使用什么渲染API, 所有的东西最终都是渲染到”surface”. surface代表BufferQueue的生产者端, 并且 由SurfaceFlinger所消费,这便是基本的生产者-消费者模式. Android平台所创建的Window都由surface所支持,所有可见的surface渲染到显示设备都是通过SurfaceFlinger来完成的.

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


    image

2 surface使用

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


image

image
  1. 表面(Surface): Surface就是指向显存的一个物体,用来被绘制到屏幕上,所有你能看见的Window都拥有可以在上面绘制的Surface,在安卓中,系统使用Surface Flinger服务来把Surface按照正确的深度信息渲染到最终的屏幕上.Surface通常在back buffer中进行渲染,完成之后与front buffer交换,这样显示到屏幕上,以实现流畅显示的效果.
  2. 窗口(Window): 一个application通过Windows Manager来创建窗口,Windows Manager为每一个窗口(windows)创建Surface来让application在上面绘制各种物体。
  3. 视图(View):视图就窗口里的UI元素,一个窗口只拥有一个View Hierarchy,这些View Hierarchy提供了窗口里的所有表现。当一个窗口需要重新绘制时(比如一个View invalidate自己),锁定Surface,并返回一个Canvas用来在上面绘制,如上图所示,在view hierarchy树向下传递Canvas,来绘制每个view。这一切都完成后,Surface被解锁,并通过Surface Flinger交换前后Buffer来显示到屏幕上。
  4. Canvas:Canvas是Surface绘图时返回的一个接口,并提供一些绘图api,用来进行实际的绘图操作。目前Canvas可以绘制在bitmap或者openGL container上。
  5. SurfaceView: 它是View的一个特殊子类,它拥有专有的Surface,使application可以直接在上面绘制(普通的view hierarchy必须共享窗口唯一的surface)。
    原理是surfaceview请求Window Manager创建一个新窗口,并改变窗口之间的深度信息来显示。如果SurfaceView的Window显示在主窗口的后面,surfaceview将主窗口相应的位置设置成透明来使可见。
    总结一下,一个activity拥有一个window(用来绘制它的UI)-->一个Window只有一个Surface&View hierarchy来绘制=SurfaceView实质上是创建了一个新的窗口,所以拥有自己独立的Surface,可以直接绘制在上面。

surfaceView:

虽然在App端它仍在View hierachy中,但在Server端(WMS和SF)中,它与宿主窗口是分离的。这样的好处是对这个Surface的渲染可以放到单独线程去做,渲染时可以有自己的GL context。这对于一些游戏、视频等性能相关的应用非常有益,因为它不会影响主线程对事件的响应。但它也有缺点,因为这个Surface不在View hierachy中,它的显示也不受View的属性控制,所以不能进行平移,缩放等变换,也不能放在其它ViewGroup中,一些View中的特性也无法使用
Textureview和surfaceTexture连用,弥补了surfaceview的不足。但是比surfaceview慢

3 surfaceTexture使用

与opengl连用


这里写图片描述

4 surfaceTexture 设计

surfaceTexture 是什么?
surfaceTexture是buffer .但是,它又不是简单的一个buffer,而是由两个buffer queue组成 .
下面这个整体结构图给力。把数据流向,输入输出,模块组成和作用说的很清楚. 但是,仍然容易理解错误.
实际surfaceTexture=surface+一个queue, product 和consumer是两个线程,两个线程操作同一个queue.
数据流程:camera-->surfaceTexture'surface-->surfaceTexture's queue-->opengl Texture buffer-->native surface-->surfaceFinger-->eglsurface-->framebuffer
-->surfaceview/Textureview/Mediacodec
注意surfaceTexture的surface是给camera等采集端的,native的surface是给输出端的。它们是两个不同的surface.


image
  1. camera etc采集
  2. 图像流通过Surface入队到BufferQueue,并通知到GLConsumer。
  3. GLConsumer从BufferQueue获取图像流GraphicBuffer,并转换为Opengl纹理(updateTexImage)。
  4. Opengl filter 渲染(上特效) (option)
  5. 数据输出到GLsurfaceview 和Mediacode (sharecontext技术)


    image

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

5 SurfaceFlinger

[https://blog.csdn.net/fdsafwagdagadg6576/article/details/116352477]

6 SurfaceTexture源码分析

示意图说明: 左边:主线程GLSurfaceView,使用渲染线程GLRender,GLRender使用主线程surface。右边surfaceholder和左边surface是一个。左边是新用法,右边是过去用法.
Surface实例分析: 参见:Android音视频(六) 使用OpenGL ES 3.0预览Camera https://juejin.cn/post/6844903962248740871
Android图形系统之SurfaceTexture http://www.zyiz.net/tech/detail-135826.html

image

image

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.时序图说明了消息流程.
  3. 说明了java-jni-native
  4. 说明了render线程.
    缺点:介绍过多,重点不突出,没有小结.

附录:

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


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).
bufferqueue的实现:BufferQueue 学习总结(内附动态图)(https://blog.csdn.net/hexiaolong2009/article/details/99225637) 赞动图
3 ) GUI显示系统之SurfaceFlinger---章节目录
https://blog.csdn.net/xuesen_lin/article/details/8954508
4) Android图形系统之SurfaceTexture https://juejin.cn/post/6844904161645953038 -surfaceTexture 源码实现
5 Android 5.0(Lollipop)中的SurfaceTexture,TextureView, SurfaceView和GLSurfaceView
https://blog.csdn.net/jinzhuojun/article/details/44062175 介绍概念比较全,类图多但是没有流程图和代码分析,所以理解不深入,适合总结不适合分析

如对您有帮助,请随手点个赞,谢谢###

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,937评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,503评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,712评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,668评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,677评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,601评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,975评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,637评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,881评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,621评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,710评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,387评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,971评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,947评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,189评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,805评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,449评论 2 342

推荐阅读更多精彩内容