导读

与手机导航不同,高德地图的车机版(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,步骤如下:

先清除抗锯齿帧缓存空间重的内容:

GLenum status =glCheckFramebufferStatus(GL_FRAMEBUFFER) ;if(status !=GL_FRAMEBUFFER_COMPLETE) {return false;

}

开始进行一系列的渲染函数操作,比如准备顶点数据,纹理数据,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接口提供的抗锯齿能力来进行渲染,在此不做展开。

优化对比

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

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

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

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

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

关注高德技术,找到更多出行技术领域专业内容

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

  1. 关闭加速渲染_“瀑布屏”旗舰 摩托罗拉Edge+渲染图曝光,Moto G8正式发布

    摩托罗拉旗下多款新机近来频繁出现在爆料信息中,现在摩托罗拉正式带来了被多次曝光的新机--摩托罗拉Moto G8.据外媒报道,摩托罗拉现已正式发布了这款新机.消息显示,Moto G8采用了打孔屏设计,打 ...

  2. java浏览器渲染_优化浏览器渲染

    优化浏览器渲染 资源被下载到客户端后,浏览器仍需加载,解释,并渲染HTML.CSS和Javascript代码.只需利用现有浏览器的特性简单地编排你的代码和页面,就可以提升客户端的性能. 使用高效率的C ...

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

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

  4. c3520 宝骏凯立德地图_凯立德2018车载导航地图-2018年05月凯立德高清优化版C2939-C7M05-3H21J22最新版 - 极光站...

    2018年05月凯立德高清优化版C2939-C7M05-3H21J22是凯立德2018车载导航地图!经常使用凯立德的,可以下载最新版本.3H21J22春季版,非常不错.在这里,小编为你提供懒人包百度网 ...

  5. java浏览器渲染_浏览器的渲染机制

    一.前言 我们熟知的浏览器的主要功能就是向服务器发送请求,然后显示服务器返回的资源. 而这里的资源一般指的就是HTML文档. (当然资源还包括xml.图片) 那浏览器是如何将一个HTML文档解析为我们 ...

  6. java地图瓦片_百度地图瓦片层级范围对照表

    最近搞地图搞的多,因为项目要求需要做个离线地图来添加覆盖物,网上有篇博客教我们怎么下载瓦片的,对应的是java代码,但是每次操作去看console里的层级和范围超级麻烦,而网上有提供软件下载,感觉有点 ...

  7. vantabs多页渲染_选择引擎渲染页面

    X-UA-Compatible是针对ie8新加的一个设置,对于ie8之外的浏览器是不识别的,这个区别与content="IE=7"在无论页面是否 包含指令,都像是使用了 Windo ...

  8. java 地图坐标转换_百度地图坐标和高德地图坐标转换代码 Java实现

    最近做项目需要百度地图坐标转换到高德地图坐标,高德官方也给出了转换接口(百度地图也给出了转换接口) http://lbs.amap.com/api/javascript-api/reference/l ...

  9. java 地图坐标转换_百度地图经纬度和地址互转(Java代码)

    这是基于springmvc+mybatis 的一个controller.如果不是这个框架,可以把方法实体抽到自己写的一个类中,然后再测试 package com.uwitec.controller.s ...

  10. java地图代码_如何在Java中生成地图?

    为了在不使用矩阵的情况下生成这样的地图,我建议从中心图块开始,然后使用修改后的广度优先搜索算法向外填充地图.首先,我们需要一些比相邻瓷砖列表更好的东西.您可以简单地拥有四个变量,一个用于存储下一个图块 ...

最新文章

  1. HTML5 canvas处理图片的各种效果,包括放大缩小涂鸦等
  2. Google Capture The Flag 2018 (Quals) - Beginner's Quest - Reverse - Firmware
  3. 【Linux】一步一步学Linux——ncat命令(159)
  4. 台式计算机由哪些硬件组成,台式电脑硬件是由哪些组成的 - 卡饭网
  5. 阿里巴巴对Java编程【命名风格】的规约
  6. hrsc2016 下载 数据集_PIoU Loss:倾斜目标检测专用损失函数,公开超难倾斜目标数据集Retail50K | ECCV 2020 Spotlight...
  7. 怎样用CDN防篡改、抗攻击、控内容?一份CDN安全指南请查收
  8. 【JVM】类的生命周期【转+整理】
  9. 目标检测——YOLOv5的学习笔记
  10. 信息熵--决策树的建立算法ID3中使用
  11. 串口通讯(DMA模式)
  12. 一体机or复合机?企业文印设备该怎么选
  13. 使用SpringSecurity 实现 OAuth2 资源服务器认证服务器分离( 注册码模式)
  14. python 比对两个excel表数据_如何使用python比对两个excel表中的不同?
  15. PLC通讯实现-C#实现欧姆龙以太网通讯FINS UDP(三)
  16. 根据设计稿,用JS计算rem的值
  17. 删除win10 qaa输入法
  18. 如何使服务器信号加强,增强路由器信号的操作方法
  19. 闲置kindle改为电子墨水屏时钟——本地静态页面无需联网
  20. javascript动态生成按钮并绑定点击事件

热门文章

  1. 验证是否精通Redis,从这八个问题开始
  2. requests模块介绍
  3. 线程池ThreadPoolExecutor里面4种拒绝策略
  4. AngularJS的基础元素应用
  5. angular 和 backbone 区别
  6. Linux下,如何安装有互相依赖关系的RPM包[转]
  7. .net小插件:indent guides
  8. 理论物理专题讲义(量子力学与统计物理部分)
  9. android string-array xml 引用,如何把数据动态地写进array.xml的string-array里?
  10. Execution failed for task :Test:lintVitalRelease/Lint found fatal errors while assembling a release