离屏渲染在车载导航中的应用

导读

与手机导航不同,高德地图的车机版(AMAP AUTO)直接面对各大车厂和众多设备商。这些B端用户采用的硬件参数参差不齐,提出的业务需求涉及到渲染中诸多复杂技术的应用,这对渲染性能提出了极高的要求。

最初车机版沿用手机版的当前屏渲染模式,每一帧都需要实时的将地图元素渲染出来。但在业务实践过程中,我们发现在多屏渲染和多视图渲染场景下,CPU负载急剧增高。以鹰眼图场景为例,在鹰眼图场景下,地图存在多视图渲染的状态:一张是主地图,一张是鹰眼小地图,因此渲染引擎同时渲染了两个地图实例对象,下图右下角即为鹰眼图:

鹰眼图绘制后,平均帧率下降了2帧,如下图所示:

针对上述情况,除了对渲染细节、批次和纹理等进行常规优化外,我们还需要寻找一种全局性的技术优化手段,大幅度提升引擎的渲染性能。为此,我们深入地研究了离屏渲染技术,并结合导航业务,提出了一种基于离屏渲染技术对特定地图的视图进行性能优化的方法。

优化原理

在OpenGL的渲染管线中,几何数据和纹理通过一系列变换和测试,最终被渲染成屏幕上的二维像素。那些用于存储颜色值和测试结果的二维数组被称为帧缓冲区。当我们创建了一个供OpenGL绘制用的窗体后,窗体系统会生成一个默认的帧缓冲区,这个帧缓冲区完全由窗体系统管理,且仅用于将渲染后的图像输出到窗口的显示区域。我们也可以使用在当前屏幕缓冲区以外开辟一个缓冲区进渲染操作。前者即为当前屏渲染,后者为离屏渲染。

与当前屏渲染相比,离屏渲染:

  • 在变化的场景下,因为离屏渲染需要创建一个新的缓冲区,且需要多次切换上下文环境,所以代价很高;
  • 在稳定的场景下,离屏渲染可以采用一张纹理进行渲染,所以性能较当前屏渲染有较大提升。

从上述对比可以看出,在稳定场景下使用离屏渲染的优势较大。但因为地图状态随时都在变化,所以地图渲染通常处于前台动态渲染状态。那么有没有相对稳定的场景呢?答案是肯定的,我们将地图的状态分为沉浸态和非沉浸态。顾名思义,在地图处于变化状态的称为非沉浸态,进入稳定状态称为沉浸态。

进入沉浸态的地图,为我们使用离屏渲染提供了条件。经过统计,地图处于前台状态的场景下,沉浸态时间基本上和非沉浸态时间相当,这样我们采用一张纹理,即可将处于非沉浸态场景下的地图渲染出来,大大降低了系统开销。在鹰眼图,矢量路口大图等特定的视图场景下,地图基本上均处于沉浸态。所以这些视图下采用离屏渲染技术进行优化,取得的收益将是巨大的。

工程实践

将以上的技术优化原理,代入到实际的导航应用中,流程如下:

离屏渲染通常使用FBO实现。FBO就是Frame Buffer Object,它可以让我们的渲染不渲染到屏幕上,而是渲染到离屏Buffer中。但是通常的离屏渲染FBO对象不具备抗锯齿能力,因此开启了全屏抗锯齿能力的OpenGL应用程序,如果采用离屏渲染FBO对象进行离屏渲染,会出现锯齿现象。而在非沉浸态地图的状态下,是开启全屏抗锯齿能力的,所以我们必须使用具备抗锯齿能力的离屏渲染技术来进行地图渲染技术优化。

抗锯齿离屏渲染技术简述

本节以iOS系统为例,对抗锯齿能力的离屏渲染技术进行简述。iOS系统对OpenGL进行了深度定制,其抗锯齿能力就是建立在FBO基础上的。如下图所示,IOS基于对抗锯齿的帧缓存(FBO)对象进行操作,从而达到全屏抗锯齿的目的:

接下来具体介绍抗锯齿FBO的创建步骤:

  • 创建FBO并绑定:
GLuint sampleFramebuffer;
glGenFramebuffers(1, &sampleFramebuffer);
glBindFramebuffer(GL_FRAMEBUFFER, sampleFramebuffer);
  • 创建一个颜色帧缓冲区,在显存中开辟一个具有抗锯齿能力的对象,并将颜色缓冲区挂载到开辟的对象上。创建一个深度模版渲染缓冲区,开辟具有抗锯齿能力的显存空间,并和帧缓冲区进行绑定:
GLuint sampleColorRenderbuffer, sampleDepthRenderbuffer;
glGenRenderbuffers(1, &sampleColorRenderbuffer);
glBindRenderbuffer(GL_RENDERBUFFER, sampleColorRenderbuffer);
glRenderbufferStorageMultisampleAPPLE(GL_RENDERBUFFER, 4, GL_RGBA8_OES, width, height);
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, sampleColorRenderbuffer);glGenRenderbuffers(1, &sampleDepthRenderbuffer);
glBindRenderbuffer(GL_RENDERBUFFER, sampleDepthRenderbuffer);
glRenderbufferStorageMultisampleAPPLE(GL_RENDERBUFFER, 4, GL_DEPTH_COMPONENT16, width, height);
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, sampleDepthRenderbuffer);
  • 测试创建的环境是否正确,避免如显存空间不足等造成创建失败的可能:
GLenum status = glCheckFramebufferStatus(GL_FRAMEBUFFER) ;
if(status != GL_FRAMEBUFFER_COMPLETE) {return false;
}

至此,一个具备抗锯齿能力的离屏FBO已创建好,下面将应用这个FBO,步骤如下:

  • 先清除抗锯齿帧缓存空间重的内容:
glBindFramebuffer(GL_FRAMEBUFFER, sampleFramebuffer);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glViewport(0, 0, framebufferWidth, framebufferHeight);
  • 开始进行一系列的渲染函数操作,比如准备顶点数据,纹理数据,VBO,IBO,矩阵,状态等,并执行一系列的渲染指令,选择指定的shader,及其传输数据状态;
  • FBO不是一个具备直接渲染能力的帧缓存空间,在执行完2的操作之后,需要将抗锯齿的FBO内渲染的内容通过合并每个像素,转换到屏幕渲染所在的帧缓存空间去。原理如下图所示:

代码如下:

glBindFramebuffer(GL_DRAW_FRAMEBUFFER_APPLE, resolveFrameBuffer);
glResolveMultisampleFramebufferAPPLE();
glBindFramebuffer(GL_READ_FRAMEBUFFER_APPLE, sampleFramebuffer);
  • 以上操作完成后,需要进行一些Discard步骤, 将一些原先在当前帧缓存中的内容忽略掉:
glBindRenderbuffer(GL_RENDERBUFFER, colorRenderbuffer);
[context presentRenderbuffer:GL_RENDERBUFFER];

Android系统基本思路一致,需要采用gles3.0接口提供的抗锯齿能力来进行渲染,在此不做展开。

优化对比

优化前的鹰眼图渲染耗时火焰图如下:

优化后的鹰眼图渲染耗时火焰图如下:

从前后对比图可以看出,鹰眼图渲染的耗时,几乎已经消失不见。

从系统的渲染帧率上进一步得到验证。从下图可以看出帧率已经恢复到与不显示鹰眼图的情况相当:

需要注意的是,全屏抗锯齿损耗资源,除了增加额外的显存空间,抗锯齿过程中也会产生一定的耗时。所以在取得收益的同时,也需要衡量其产生的代价,需要具体问题具体分析。在本案例中,如对比结果所示,采用抗锯齿离屏渲染技术的优化产生的收益远远高于付出的代价。


原文链接
本文为云栖社区原创内容,未经允许不得转载。

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

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

相关文章

打造大数据和AI能力底座 联通大数据深度参与“新基建”

年初至今,国家关于“新基建”的政策持续发布,引起社会各界广泛关注。目前来看,官方定义的新型基础设施主要包括信息基础设施、融合基础设施、创新基础设施三方面内容。疫情过后,新型基础设施建设将承担起经济复苏的使命&#xff0…

技术人如何通过了解业务,获取晋升机会?

伐薪是阿里巴巴高级技术专家,14年初入阿里时,没有过多地思考业务痛点和了解业务策略。后来,经历过晋升,当晋升评委,主动学习业务,最后,完成了从技术专家向综合性 TL 转变。这一路下来&#xff0…

adb-获取包名/界面名、获取app启动时间、卸载app、退出app、查看所有进程、查看所有包名

获取包名/界面名 Mac/Linux: adb shell dumpsys window windows | grep mFocusedApp adb shell dumpsys window windows | grep mCurrentFocus adb shell dumpsys window | grep mCurrentFocusWindows: adb shell dumpsys window windows | findstr mCurrentFoc…

记一次代码重构

单一职责 功能单一 功能单一是SRP最基本要求,也就是你一个类的功能职责要单一,这样内聚性才高。 比如,下面这个参数类,是用来查询网站Buyer信息的,按照SRP,里面就应该放置查询相关的Field就好了。 Data…

​如何成为一个更好的 React 开发者?

作者 | Siradji Awoual译者 | 苏本如,责编 | 屠敏头图 | CSDN 下载自东方 IC出品 | CSDN(ID:CSDNnews)大家好!希望你们在疫情期间平平安安。今天,我想在这里谈谈不同的内容。我想分享一些React的开发技巧和…

前后端敏感数据加密方案及实现_02

文章目录1. 环境2. vue部分3. 控制层4. 工具类1. 环境 组件版本springboot2.4.0后端框架3.0.0前端框架vue-router4.0.0-0ant-design-vue2.0.0-rc.3vuex4.0.0-0 2. vue部分 <template><a-layout-header class"header"><div class"logo">…

蚂蚁金服 3 个项目进入 CNCF 云原生全景图 | 开源

2019 年 6 月 25 日&#xff0c;全球知名开源组织云原生计算基金会 CNCF 宣布&#xff0c;蚂蚁金服正式成为 CNCF 黄金会员&#xff0c;蚂蚁金服表示将持续加大对开源项目的支持&#xff0c;包括 Kubernetes&#xff0c;ServiceMesh&#xff0c;Serverless&#xff0c;安全容器…

Knative 初体验:CICD 极速入门

Knative 社区很早就在讨论用 Tekton 替换 Build 模块的事宜。Knative Build 官方已经正式说明不再建议使用 Knative Build 了。 如果你知道 Knative Build 是什么相信你理解起 Tekton 就是很容易的一件事了。 Knative Build 对自己的一句话概述是&#xff1a;A Kubernetes-na…

关于 Docker ,你必须了解的核心都在这里了!

来源 | fysuccess来源 | CSDN博客&#xff0c;责编 | Carol头图 | CSDN 下载自视觉中国Docker引擎Docker Engine是具有以下主要组件的客户端-服务器应用程序&#xff1a;服务器是一种长期运行的程序&#xff0c;称为守护程序进程&#xff08; dockerd命令&#xff09;。REST AP…

如何在视频里任意抠图?阿里工程师做到了!

阿里妹导读&#xff1a;现在的我们在手机上花费了越来越多的时间&#xff0c;其中&#xff0c;视频又格外地吸引我们的注意力。有很多好玩的视频&#xff0c;需要把前景物体从视频中分割出来&#xff0c;这需要花费创作者99%以上的时间。今天&#xff0c;阿里资深算法专家任海兵…

启动vue项目失败,报错Failed at the node-sass@4.14.1 postinstall script.

在启动vue项目的时候报错 报错信息如下&#xff1a;npm ERR! code ELIFECYCLE npm ERR! errno 1 npm ERR! node-sass4.14.1 postinstall: node scripts/build.js npm ERR! Exit status 1 npm ERR! npm ERR! Failed at the node-sass4.14.1 postinstall script. npm ERR! This i…

DLedger —基于 raft 协议的 commitlog 存储库

尊敬的阿里云用户&#xff1a; 您好&#xff01;为方便您试用开源 RocketMQ 客户端访问阿里云MQ&#xff0c;我们申请了专门的优惠券&#xff0c;优惠券可以直接抵扣金额。请填写下您公司账号信息&#xff0c;点击上图&#xff0c;了解更多哦。 一、DLedger引入目的 在 Rocke…

不服来战!青藤发起“雷火引擎”公测赛 百万赏金寻顶尖白帽

2020年春天&#xff0c;以5G、人工智能、云计算为代表的“新基建”蔚然成风&#xff0c;着眼国家数字经济体系建设&#xff0c;打造数字经济体系底座的“新基建”&#xff0c;无疑成为中国经济整体应对未来发展的核心方案。可以说&#xff0c;没有任何一个时期比现在更能够彰显…

UI2CODE系列文章|如何批量制造高质量样本

在 UI2CODE 项目中&#xff0c;我们大量使用了深度学习方法来做一些物体检测。而深度学习模型的训练&#xff0c;避免不了需要大量的样本&#xff0c;因此如何制造大量样本&#xff0c;来满足模型训练需要是我们必须要解决的一个问题。在这篇文章中&#xff0c;我们将介绍我们如…

javax.management.InstanceNotFoundException: org.springframework.boot:type=Admin,name=SpringApplicati

控制台service端打印javax.management.InstanceNotFoundException: org.springframework.boot:typeAdmin,nameSpringApplication 那个报的就点哪个,将红圈里的对勾去掉 就ok了&#xff01;

极测未来|淘宝千人千面内容下的智能评测技术与实践

背景挑战 全面个性化、内容化的淘宝&#xff0c;构造了基于内容的丰富的导购场景&#xff0c;包括猜你喜欢、有好货、每日好店、必买清单、哇哦视频、微淘、买家秀、头条、洋葱盒子….。个性化&#xff0c;给消费者带来更精准的货品分发。内容化为消费者带来更多惊喜和好的体验…

新时代 新营销 新增长, 纷享销客重磅发布CRM7.0产品,持续赋能企业数字化未来

2020年4月26日&#xff0c;主题为“新时代 新营销 新增长”的纷享销客2020销售增长大会暨春季战略与新品发布会&#xff0c;在GMIC大会期间成功举办。纷享销客创始人&CEO罗旭发表“新时代 新营销 新增长”的主题演讲&#xff0c;同时重磅发布纷享销客连接型CRM7.0新品。 这…

python3-matplotlib基本使用(以折线图为例)

1、什么是matplotlib Matplotlib 是 Python 中最受欢迎的数据可视化软件包之一&#xff0c;支持跨平台运行&#xff0c;它是 Python 常用的 2D 绘图库&#xff0c;同时它也提供了一部分 3D 绘图接口。Matplotlib 通常与 NumPy、Pandas 一起使用&#xff0c;是数据分析中不可或…

flowable 开源项目

企业级工作流引擎开源项目 文章目录一、工作流引擎flowable1. flowable2. cims3. RuoYi-flowable4. springboot-flowable-modeler5. flowable-diagram二、工作流引擎activiti2.1. RuoYi-Vue-Process2.2. RuoYi-Process2.3. ruoyi-vue-activiti2.4. activiti7-workflow2.5. JeeS…

看!闲鱼在ServiceMesh的探索和实践

背景&#xff1a; 在阿里服务端开发以Java为主的大背景下&#xff0c;其他异构语言业务如何调用现有Java服务&#xff0c;如何与集团中间件打通&#xff0c;就成为使用非Java语言团队必须要解决的首要问题。 已有方案问题&#xff1a; 在ServiceMesh方案成熟之前&#xff0c…