Android图形渲染框架

Android图形渲染框架包括:Gralloc分配缓冲区,BufferQueue作为缓冲队列连接生产者与消费者,可以使用TextureView、SurfaceView和GLSurfaceView组件进行渲染。最终是渲染到Surface上,通过SurfaceFlinger或者HardwareComposer硬件混合渲染器合成到WindowManager提供的屏幕上,由VSync提供帧同步。

Android图形组件

图形组件包括图像生产者与图像消费者,具体数据流链路如下图1所示:

图1—Android图形框架

1、图像生产者

图像生产者可以是生成图形缓冲区以供消费的任何内容。比如:Canvas、视频解码器等。

2、图像消费者

图像消费者最常见的是surfaceFlinger,该系统服务会消费当前可见的Surface,并使用WindowManager提供的信息将它们合成到屏幕。SurfaceFlinger使用OpenGL或Hardware Composer来合成一组Surface。其他OpenGL应用也可以消费图像流,比如相机应用消费预览图像流。非OpenGL应用也可以作为消费者,比如ImageReader。

3、硬件混合渲染器

硬件混合渲染器HWC是显示系统的硬件抽象实现。SurfaceFlinger可以将某些合成工作委托给HWC,以分担OpenGL和CPU的工作量。

4、数据流

关于Android图形管道的描述,如下图2所示。主屏幕、状态栏和系统桌面作为图像生产者,经过BufferQueue传输,由SurfaceFlinger合成。

图2—Android图形管道 

图形缓冲区

1、BufferQueue

BufferQueue是Android图形组件的粘合剂。作为缓冲队列,可以调节从生产方到消费方的周期。关于BufferQueue通信过程,如下图所示:

图3—BufferQueue通信过程 

 BufferQueue是将缓冲区池与队列结合的数据结构,使用Binder在进程间传递数据。生产方接口为IGraphicBufferProducer。BufferQueue有三种不同工作模式:

类同步模式:BufferQueue默认在类同步模式下运行。在该模式下,每个来自生产方的缓冲区都会在消费方消耗,不会丢弃任何缓冲区。如果生产速度快于消费速度,会阻塞等待释放缓冲区。

非阻塞模式:BufferQueue在非阻塞模式下,如果生产速度快于消费速度导致缓冲区满,会抛出异常而不是等待释放缓冲区。此模式也不会丢弃任何缓冲区。这有助于应用程序无法理解图形框架复杂依赖关系导致潜在死锁。

丢弃模式:如果缓冲区已满,会丢弃后面的缓冲区而不是抛出异常。比如,如果需要对纹理视图进行快速渲染绘制,会选择性丢弃缓冲区。

2、Gralloc

Gralloc内存分配器负责图形缓冲区分配,通过两个特定于供应商的 HIDL 接口来进行实现( hardware/interfaces/graphics/allocator/ 和 hardware/interfaces/graphics/mapper/)。

Gralloc 分配器 HAL层 hardware/libhardware/include/hardware/gralloc.h 通过用法标志执行缓冲区分配。用法标志包括以下属性:

  • 从软件 (CPU) 访问内存的频率
  • 从硬件 (GPU) 访问内存的频率
  • 是否将内存用作 OpenGL ES (GLES) 纹理
  • 视频编码器是否会使用内存

如果生产方的缓冲区格式指定 RGBA_8888 像素,并且生产方指明将从软件访问缓冲区,则 Gralloc 将按照 R-G-B-A 的顺序为每个像素创建 4 个字节的缓冲区。如果情况相反,生产方指明仅从硬件访问其缓冲区且缓冲区作为 GLES 纹理,Gralloc 可以执行 GLES 驱动程序所需的任何操作(比如 BGRA 排序、非线性布局和替换颜色格式)。允许硬件使用其首选格式可以提高性能。Gralloc 返回的句柄可以通过 Binder 在进程之间进行传递。

3、受保护的缓冲区

Gralloc 使用标记 GRALLOC_USAGE_PROTECTED 允许仅通过受硬件保护的路径显示图形缓冲区。这些叠加平面是显示 DRM 内容的唯一途径(SurfaceFlinger 或 OpenGL ES 驱动程序无法访问受 DRM 保护的缓冲区)。

受 DRM 保护的视频只能在叠加平面上呈现。支持受保护内容的视频播放器必须使用 SurfaceView 实现。在不受保护的硬件上运行的软件无法读取或写入缓冲区;受硬件保护的路径必须显示在硬件混合渲染器HWC叠加层上(也就是说,如果硬件混合渲染器切换到 OpenGL ES 合成,受保护的视频将从屏幕中消失)。

渲染组件

1、SurfaceView

SurfaceView 结合 Surface 和 View。SurfaceView 的 View 组件由 SurfaceFlinger合成,从而可以通过单独的线程渲染,并与应用界面渲染隔离。创建Surface时进行打洞,在attachToWindow回调请求设置透明区域requestTransparentRegion,从而不遮挡父类Window。另外,SurfaceView使用到双缓冲,即前台后台交替。

2、GLSurfaceView

GLSurfaceView结合SurfaceView与GLThread,提供单独渲染线程,管理eglContext上下文,使用OpenGL进行渲染,有两种渲染模式:RENDERMODE_CONTINUOUSLY(连续渲染)和RENDERMODE_WHEN_DIRTY(调用requestRender才进行渲染)。

3、SurfaceTexture

SurfaceTexture 将 Surface 和 GLES 纹理相结合来创建 BufferQueue。当生产方将新的缓冲区放入队列时,onFrameAvailable() 回调会通知应用。然后,应用调用 updateTexImage(),这会释放先前占用的缓冲区,从队列中获取新缓冲区并执行 EGL 调用,从而使 GLES 可将此缓冲区作为外部纹理使用。Android 7.0 添加了对安全纹理视频播放的支持,以便对受保护的视频内容进行 GPU 后处理。其中,外部 GLES 纹理 (GL_TEXTURE_EXTERNAL_OES) 与传统 GLES 纹理 (GL_TEXTURE_2D) 的区别如下:

  • 外部纹理直接在从 BufferQueue 接收的数据中渲染纹理多边形。
  • 外部纹理渲染程序的配置与传统的 GLES 纹理渲染程序不同。
  • 外部纹理不一定可以执行所有传统的 GLES 纹理活动。

外部纹理的主要优势是它们能够直接从 BufferQueue 数据进行渲染。SurfaceTexture 实例在为外部纹理创建 BufferQueue 实例时将使用方用法标志设置为 GRALLOC_USAGE_HW_TEXTURE,以确保 GLES 可以识别该缓冲区中的数据。

使用到SurfaceTexture的典型案例是Grafika 的连续拍摄,涉及从设备相机录制帧并在屏幕上显示帧。 要录制帧,请使用 MediaCodec 类的 createInputSurface方法创建 Surface,并将该 Surface 传递给相机。要显示帧,请创建 SurfaceView 的实例并将 Surface 传递给 setPreviewDisplay。相机的数据传输路径如下图4所示:

图4—Grafika连续拍摄

4、TextureView

TextureView结合View和SurfaceTexture。TextureView 对 SurfaceTexture 进行包装,并负责响应回调以及获取新的缓冲区。TextureView 优点:具有View属性,支持旋转、缩放、移动、Alpha;缺点:缓存一定数量帧数据,延时100ms左右。SurfaceView 优点:性能好、占用内存少、延时低;缺点:不具有View属性。

SurfaceFlinger与WindowManager

1、SurfaceFlinger

SurfaceFlinger 接受两种缓冲区:BufferQueue和SurfaceControl,对它们进行合成,然后发送到屏幕。WindowManager 为 SurfaceFlinger 提供缓冲区和窗口元数据。SurfaceFlinger 可通过两种方式接受缓冲区:通过 BufferQueue 和 SurfaceControl。当应用进入前台时,它会从 WindowManager 请求缓冲区。

在屏幕处于两次刷新之间时,屏幕会向 SurfaceFlinger 发送 VSYNC 信号。VSYNC 信号表明可对屏幕进行刷新而不会产生撕裂。当 SurfaceFlinger 接收到 VSYNC 信号后,SurfaceFlinger 会遍历其层列表,以查找新的缓冲区。如果 SurfaceFlinger 找到新的缓冲区,SurfaceFlinger 会获取缓冲区;否则,SurfaceFlinger 会继续使用上一次获取的那个缓冲区。在收集可见层的所有缓冲区之后,便会询问硬件混合渲染器 (HWC) 应如何进行合成。如果 HWC 将层合成类型标记为客户端合成,则 SurfaceFlinger 将合成这些层。然后,SurfaceFlinger 会将输出缓冲区传递给 HWC。

2、WindowManager

WindowManager 会控制窗口对象,它们是用于容纳视图对象的容器。窗口对象始终由 Surface 对象提供支持。WindowManager 会监督生命周期、输入和聚焦事件、屏幕方向、转换、动画、位置、变形、Z 轴顺序等。

可以到GitHub一起学习音视频:GitHub - xufuji456/FFmpegAndroid: android端基于FFmpeg实现音频剪切、拼接、转码、编解码;视频剪切、水印、截图、转码、编解码、转Gif动图;音视频合成与分离,配音;音视频解码、同步与播放;FFmpeg本地推流、H264与RTMP实时推流直播;FFmpeg滤镜:素描、色彩平衡、hue、lut、模糊、九宫格等;歌词解析与显示​​​​​​​

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/58094.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Unity | HDRP高清渲染管线学习笔记:Post-processing后处理效果

目录 一、后处理效果顺序 二、16个后处理效果 1. Tonemapping(色调映射) 2.White Balance(白平衡) 3. Bloom(泛光) 3.1 Quality 3.2 Bloom 3.2.1 Threshold(临界值) 3.2.2 I…

tp渲染模板方法

渲染其他方法的模板 渲染其他控制器下模板 跨模块渲染模板 指定前端文件路径渲染

Unity数据可视化图表插件XCharts( 一款基于UGUI的数据可视化图表插件)

一、前言 今天,我在GitHub上看到一个屌炸天的Unity插件:XCharts,,XCharts插件是一款基于Unity3D的UGUI系统的插件,可以绘制折线图、曲线图、饼状图、雷达图、散点图、热力图等等,功能强大 二、Unity数据可…

热力图在echarts渲染地图上实现

自律给你自由 需求 今天公司有一个小需求,将热力图显示在地图上,由于没有精准的世界地图数据,也没有对接百度/高德的地图数据,仅仅使用geojson渲染出一个大致的世界地图,然后将热力图根据坐标显示在这个echarts渲染的…

使用组件来渲染图片切换

<div id"box"><h2 click"booltrue">猫</h2><h2 click"boolfalse">狗</h2><com-cat :cats cat v-showbooltrue></com-cat><com-dog :dogs dog v-showboolfalse></com-dog><!-- <d…

泡泡 shader graph unity

#shader graph 案例学习 泡泡 shader graph 制作 之前在Youtube看到的一个教程&#xff0c;比较老&#xff0c;如果全部照做效果出不来。对此改进了一下 效果图&#xff1a;不同角度颜色不一样 源码&#xff1a; 贴图原图&#xff1a; cubemap

【技术美术图形部分】关于前向渲染和延迟渲染

学习参考 【技术美术百人计划】图形 3.4 延迟渲染管线介绍 《Unity Shader 入门精要》 1 Unity的渲染路径 关于渲染路径&#xff0c;我在图形渲染管线1.0中就提过了&#xff0c;但只是初步的了解了渲染路径有前向渲染、延迟渲染、Forward等等&#xff0c;也了解到了前向渲染…

art-template数据渲染的问题

问题 当使用art-template渲染数据的时候&#xff0c;经常会出现这种错误&#xff0c; 错误&#xff1a;说未定义title&#xff0c;明明从数据库里查出来的数据&#xff0c;为何会未定义&#xff0c;其实主要的原因是&#xff0c;先加载了art-template语句&#xff0c;而这时候…

如何选择好用的效果图渲染平台

在现代的建筑设计、室内设计、电影动画等行业中&#xff0c;效果图已经成为了一个重要的工具&#xff0c;能够帮助设计师和制作人员更好地呈现他们的想法和概念。而要制作出高质量的效果图&#xff0c;一个好用的效果图渲染平台是非常必要的。 如何选择好用的效果图渲染平台呢…

计算机专业开题报告这么写,有效有用还能过

最近收到很多私信&#xff0c;在问我关于开题报告的问题。基本都是毕业论文题目怎样选&#xff1f;系统好不好弄&#xff1f;开题报告怎么写啊&#xff1f;啥也不会怎样办呢&#xff1f;系统运行不会&#xff1f;查重问题呀&#xff0c;要马上交开题报告了等等。 今天就来分享下…

关于学术文献推荐系统的调研报告

关于学术文献推荐系统的调研报告 1 引言 1.1 研究背景 随着大数据时代的到来&#xff0c;互联网在给人们的生活带来丰富多彩的同时&#xff0c;海量信息也导致了“信息过载”问题。对于信息使用者来说&#xff0c;如何从海量信息中找到自己需要的信息是一件越来越困难的事&am…

论文调研

一、论文部分 基于傅里叶文档恢复的鲁棒文档去锐化与识别https://www.semanticscholar.org/paper/Fourier-Document-Restoration-for-Robust-Document-Xue-Tian/64dcd0cac46b936eb413f36b462be3b5b298c75b 1. 由于这篇论文没有给代码&#xff0c;所以去参考文献查找&#xff…

毕业论文中的调查问卷怎样设计以及分析?

人文社科以及部分自然科学在进行学术研究时&#xff0c;会通过调查问卷的方式获取数据&#xff0c;如何进行问卷的设计和分析会极大的影响论文质量。很多人都写过调察问卷&#xff0c;但不一定知道如何涉设计&#xff0c;本文就针对调查问卷的涉及与分析&#xff0c;教大家如何…

百度地图api实现路线规划之步行驾车

着手做一个用户轨迹的demo&#xff0c;大概分了下步骤&#xff1a;1、过滤边缘点&#xff1b;2、分段量化聚类焦点关键点&#xff1b;3、基于关键点的百度地图api路线规划&#xff1b;4&#xff1a;路线择优 我们先看下第三点基于键点的百度地图api路线规划的方案&#xff0c;…

智慧高速 3D 可视化,构建互联协同智能交通体系

随着智能交通科技和产业的发展&#xff0c;我国正在形成一个安全可靠、便捷高效、绿色智能、开放共享的现代化综合交通运输体系。《“十四五”现代综合交通运输体系发展规划》明确提出&#xff0c;加快智能技术深度推广应用&#xff0c;坚持创新驱动发展&#xff0c;推动互联网…

数据可视化之交通可视化

一 前言 智慧城市的概念自 2008年提出以来&#xff0c;在国际上引起广泛关注&#xff0c;并持续引发了全球智慧城市的发展热潮。智慧城市已经成为推进全球城镇化、提升城市治理水平、破解大城市病、提高公共服务质量、发展数字经济的战略选择。近年来&#xff0c;我国智慧城市…

智能交通车路协同系统的应用场景和发展趋势

随着城市化进程的加速和汽车保有量的增加&#xff0c;城市交通拥堵、交通事故等问题日益突出。为了解决这些问题&#xff0c;智能交通车路协同系统应运而生。智能交通车路协同系统是一种基于车载终端、路侧设备和交通管理中心等多个组成部分构成的智能交通系统&#xff0c;可以…

一文搞定腾讯地图开发中的路线规划和小车平滑移动

前言 在网约车行业的开发者&#xff0c;需要用到LBS&#xff08;Location Based Service&#xff09;&#xff0c;即基于位置的服务&#xff0c;国内提供LBS服务的有百度地图、腾讯地图、高德地图&#xff0c;本文选取的是腾讯地图的LBS即腾讯位置服务&#xff0c;这个demo可以…

智慧城市系列之智能交通系统(ITS)

第四章 ITS的主要内容 ITS的基本功能表现在&#xff1a;减少出行时间、保障交通安全、缓解交通拥挤、减少交通污染等四个方面&#xff0c;其最终目标是建立一个实时、准确、高效的交通运输管理系统。ITS的基本功能模块包括&#xff1a;先进的出行者信息系统&#xff08;ATIS&…

基于百度、高德路线规划的出行圈获取

想获取更准确的出行圈数据该怎么办呢?这个时候,我们就可以使用百度、高德的路线规划API去实现这一点。 百度、高德的路径规划服务以海量的交通大数据为基础,综合考虑道路拥堵、红绿灯等待等实际交通情况,是一种已经过大量实际项目检验的商业级数据服务。我们常用的地图导航…