ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

SurfaceView、GLSurfaceView、SurfaceTexture、TextureView 详解

2020-05-05 11:38:52  阅读:516  来源: 互联网

标签:SurfaceTexture 渲染 GLSurfaceView SurfaceView EGL GL View


  • SurfaceView
    它继承自类View,因此它本质上是一个View。但与普通View不同的是,它有自己的Surface(用来保存像素数据的保留内存区域)。

    • 优点
      它与宿主窗口是分离的。这样的好处是对这个Surface的渲染可以放到单独线程去做,渲染时可以有自己的GLContext,它不会影响主线程对事件的响应。
    • 缺点
      因为这个Surface不在View hierachy中,它的显示也不受View的属性控制,所以不能进行平移,缩放等变换,也不能放在其它ViewGroup中,一些View中的特性也无法使用。
  • GLSurfaceView
    在SurfaceView的基础上,它加入了EGL的管理,并自带了渲染线程。另外它定义了用户需要实现的Render接口,提供了用Strategy pattern更改具体Render行为的灵活性。作为GLSurfaceView的Client,只需要将实现了渲染函数的Renderer的实现类设置给GLSurfaceView即可。

    • EglHelper作用(GLSurfaceView已经包含了EGL,已经帮我们做了)
      • 管理EGL环境
        EGL既然做平台和OpenGL ES的中间件那EGL做的就肯定是和平台息息相关的事:
        • 创建绘图窗口
          也就是所谓的FrameBuffer,FrameBuffer可以显示到屏幕上(SurfaceView)
        • 创建渲染环境(Context上下文)
          渲染环境指OpenGL ES的所有项目运行需要的数据结构。如顶点、片段着色器、顶点数据矩阵。
    • OpenGL渲染一般流程
      线程创建-获取显示设备-初始化egl-选择配置-创建上下文-渲染-销毁上下文-线程销毁
    • GLThread
      渲染线程的工作
  • SurfaceTexture
    可进行图像流数据二次处理(如Camera滤镜,桌面特效等)
    和SurfaceView不同的是,它对图像流的处理并不直接显示,而是转为GL外部纹理,比如Camera的预览数据,变成纹理后可以交给GLSurfaceView直接显示,也可以通过SurfaceTexture交给TextureView作为View heirachy中的一个硬件加速层来显示。

    • 流程
      SurfaceTexture从图像流(来自Camera预览,视频解码,GL绘制场景等)中获得帧数据
      调用updateTexImage()时,根据内容流中最近的图像更新SurfaceTexture对应的GL纹理对象
      像操作普通GL纹理一样操作它
      Surface是生产者端的实现类,提供dequeueBuffer/queueBuffer等硬件渲染接口,和lockCanvas/unlockCanvasAndPost等软件渲染接口,使内容流的源可以往BufferQueue中填graphic buffer。GLConsumer继承自ConsumerBase,是消费者端的实现类。它在基类的基础上添加了GL相关的操作,如将graphic buffer中的内容转为GL纹理等操作
      在这里插入图片描述

(video camera software/hardware renderer)->(BufferQueue(surface))->(buffterQueue Consumer(GLConsumer))->(surfaceView textureview others)

  • TextureView
    它可以将内容流直接投影到View中,可以用于实现Live preview等功能。和SurfaceView不同,它不会在WMS中单独创建窗口,而是作为View hierachy中的一个普通View,因此可以和其它普通View一样进行移动,旋转,缩放,动画等变化。值得注意的是TextureView必须在硬件加速的窗口中。

标签:SurfaceTexture,渲染,GLSurfaceView,SurfaceView,EGL,GL,View
来源: https://blog.csdn.net/qq_34712399/article/details/105917950

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有