导读

与手机导航不同,高德地图的车机版(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接口提供的抗锯齿能力来进行渲染,在此不做展开。

优化对比

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

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

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

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

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

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

离屏渲染在车载导航中的应用相关推荐

  1. GM8906C 型 24 位 FPD-LINK II 接收器替代TI,DS90UR906 ,与GM8905C,DS90UR905Q,DS90UR124配对使用,应用于原车屏升级,车载导航显示设备等。

    成都振芯科技股份有限公司  24 位 FPD-LINK II 接收器 GM8906C 1 1 概述 GM8906C 型 24 位 FPD-LINK II 接收器,其主要功能是实现 24 位色 FPD- ...

  2. WebGL—实现使用FBO离屏渲染(亦同拷贝纹理)off-screen rendering的两种方式

    1.离屏渲染使用场景: 1.游戏中的小地图: 2.画中画场景: 3.游戏中观战模式的多场景场合: 4.镜像场景--比如汽车游戏当中的倒车镜,采用的就是离屏渲染技术,在倒车镜上安装一个摄像机,把摄像机渲 ...

  3. 高德车载导航Android平台DR回放技术方案

    导读 DR:(英文为Dead Reckoning,航迹推算).用于推算的传感器大致有:陀螺仪.四轮速.车速脉冲.3D加速度计等.在车载导航中,航位推算是使用先前确定的位置,通过测量移动的距离和方位,计 ...

  4. android手机改车载,到底手机导航还是车载导航好,我选择在车上加装安卓大屏...

    到底手机导航还是车载导航好,我选择在车上加装安卓大屏 2017-06-12 18:38:38 52点赞 66收藏 74评论 这几年随着国民经济和技术水平的提升,汽车早已不是以前那种高不可攀的奢侈品,不 ...

  5. 华为p40android auto怎么用,华为手机无线投屏到车载导航,华为车机互联教程

    越来越多的车机系统可以与手机互联,不同的系统连接方式不一样,我们主要以华为手机与车机互联的教程说明. 华为手机无线投屏到车载导航的方法: 车型雷克萨斯18款ES200,手机是华为MATE8,安卓7.0 ...

  6. Cesium 中的离屏渲染

    Cesium 中的离屏渲染 本文参考了众多文章,均列在了最后.先感谢各位的分享精神,如觉有冒犯,请与我联系. 部分内容来自个人理解,欢迎指正交流. 为了达到更加真实的渲染效果或其他计算需求,很多时候需 ...

  7. threejs 微信小游戏中的离屏渲染做UI和排行榜

    微信小游戏对threejs真的是一次桎酷啊...呵呵. 规定不能用html锁死了我们之前两个html标签的可能了... 不过微信还是允许了大家的离屏渲染,要不是我们在跳一跳之类的游戏中也看不到排行榜和 ...

  8. Linux车载导航程序,嵌入式Linux在车载导航系统中的应用.pdf

    湖南文理学院 课程设计报告 课程名称: 嵌入式系统课程设计 专业班级: 自动化 11102班 学号( 10) 学生姓名: 指导教师: XXX 完成时间: 2014 年 6 月 6 日 报告成绩: 评阅 ...

  9. 车载导航应用中基于Sketch UI主题定制方案的实现

    点击上方蓝字,关注高德技术! 1. 导读 关于应用的主题定制,相信大家或多或少都有接触,基本上,实现思路可以分为两类: 内置主题(应用内自定义style) 外部加载方式(资源apk形式.压缩资源.插件 ...

最新文章

  1. Android图片压缩(质量压缩和尺寸压缩)
  2. OllyDbg完全教程
  3. [云炬创业基础笔记]第十章企业的利润计划测试8
  4. IDEA2016.2 注册码
  5. 如何修改微软powerpoint模板文字
  6. dataframe 一列的不同值_python数据分析包|Pandas-02之缺失值(NA)处理
  7. System Center Technical Preview DPM(2016)对Exchange2016的灾难恢复
  8. 我最开始学dancing link的HTML5的时候
  9. har文件解析工具_嵌入式MCU也能跑AI?STM32 Cube.AI工具包使用初探
  10. (二)CXF之用CXF官方工具生成客户端Client
  11. 目标检测(二十二)--R-FCN
  12. mt4 指标 涨跌幅 颜色k线_通达信K线波段操盘指标公式
  13. 特征探索性分析Exploring_features
  14. 51单片机码表c语言编程,分享自写码表单片机程序(共阴极数码管显示)
  15. 点云粗配准之采样一致性
  16. 学生可以租的便宜云GPU-滴滴云
  17. 华为防火墙(以USG6330为例)公网直接访问问题解决
  18. (VBA)Word中对选中的行(代码行)自动编号并修改注释的颜色
  19. 【解决方案】Android开发填坑之RecyclerView刷新闪烁
  20. 区块链零知识证明:STARKs, Part II

热门文章

  1. 3d打印光固化好还是热固化好_UV专利一览(71) —天啦噜!3D打印上太空!
  2. python判断密码强度_python实现密码强度校验
  3. 【LeetCode笔记】49. 字母异位词分组(Java、字符串、哈希表)
  4. java版的中世纪战争_世界战争英雄设置-火焰纹章英雄英雄地图及AI命令设置
  5. 蓝牙版本avrcp怎么选_500元内无线蓝牙耳机测评年轻人的第一款廉价蓝牙耳机怎么选?...
  6. vim函数跳转 php,求助!! vim-gvim中如何让其显示函数及其参数!!
  7. python环境变量配置_Python的安装、认识、配置环境变量以及helloworld打印的两种方式
  8. scp复制本地文件到远程服务器,scp 本地文件到远程服务器
  9. 开源社交系统java_JAVA 开源 SNS 社交系统 JEESNS V0.8 发布
  10. # 傅立叶变换 画曲线_让你永远忘不了的傅立叶变换解析