LBS 开发微课堂|Polyline绘制优化:效果更丰富,性能更佳!

为了让广大的开发者

更深入地了解

百度地图开放平台的技术能力

轻松掌握满满的技术干货

更加简单地接入

开放平台的服务

我们特别推出了

“位置服务(LBS)开发微课堂”

系列技术案例

第一期的主题是

《Polyline 绘制优化升级》

你还想了解哪些技术内容?

快来评论区留言告诉我们吧!

cut-off

Polyline(线段)绘制,作为地图绘制的基础,凝聚着工程师们的巧思与智慧。百度地图开放平台持续对地图 SDK 的 Polyline 绘制技术进行优化,努力为开发者提供更好的开发体验。

百度地图最新版本的地图 SDK 在基础性能、渲染效果以及场景化应用等方面都有了明显的突破,让地图绘制更流畅,绘制效果更丰富。

(向上发光效果呈现出的围栏视觉效果)

(司乘同显:乘客端小车平滑移动效果)

今天,让我们一起来看看这些技术提升背后的秘密,体验一下百度地图在 Polyline 绘制方面的过人之处吧!


1 Polyline渲染优化

新版地图 SDK 的 Polyline 绘制功能采用了记录法向量的方式,有效解决了线宽变化导致的顶点数据重复计算的问题,使得开发者在调用相关功能进行开发时,能够显著降低CPU的占用率。

1.1 顶点数据优化方案

旧版 SDK:在线的每一段的顶点处,垂直当前线段做垂线,再沿垂线各取二分为一线宽长度计算出上下两个顶点的位置坐标。

新版 SDK:在线的每一段的顶点处,垂直当前线段做两个相反方向的射线,记录顶点位置点及射线的方向向量,绘制时传入线宽。

以两个点的线段为例:

旧版本(图 1)在 CPU 阶段根据线宽计算顶点位置 a1、a2、b1、b2 和纹理坐标 st 。

新版本(图 2)中直接记录原始 A、B 和 an1、an2、bn1、bn2 方向信息。

顶点偏移量计算 delta= an1*lineWidth*线宽缩放比例,等同于 shader 中的 vec4 delta= vec4(a_normal.xy * u_line_width * v_direction, 0, 0) 。

线宽缩放比例在正常直线时为 1,拐角连接处根据拐角类型(jointype)计算需要的缩放比例。比如:圆角为 1,尖角为向量 AB 的法向量与 AB、BC 法向量相加的向量的点乘结果(有最大值限制)。

1.2 顶点数据差异对比

图 3(旧版本)

图 4(新版本)

旧版中(图 3):a_position 中 xyz 代表位置,a_texCoord 中 st 代表纹理坐标。

新版中(图 4):a_position 中 xyz 代表位置,w 代表累计长度(纹理坐标及 Track 动画时使用);射线方向向量在 a_nomal 中,xy 代表法向量,z 的正负代表法向量的正逆,用于纹理计算;z 的绝对值代表线宽缩放比例,用于顶点偏移量计算。

1.3 Shader数据处理实现

图 5( 旧版本)

图 6( 新版本)

旧版中(图 5):gl_Position 数据由传入的顶点数据经过 MVP 矩阵转化后得到;纹理坐标直接传递给片段着色器。

新版中(图 6):gl_Position 数据由传入的顶点数据+线宽对应的顶点偏移量计算后再经过 MVP 矩阵转化后得到;纹理坐标也在顶点着色器 Shader 中计算后传递给片段着色器。

gl_Position 根据线宽在顶点着色器 Shader 中计算:

// 线宽缩放比例,直线时为1,拐角处根据拐角类型计算得出
float v_direction = abs(a_normal.z);
// 线宽对应的顶点偏移
vec4 delta= vec4(a_normal.xy * u_line_width * v_direction, 0, 0);
gl_Position = u_MVPMatrix * vec4(a_position.xyz, 1) + u_MVPMatrix * delta;

纹理坐标在顶点着色器 Shader 中计算(以repeat方式为例):

float s = 0.5 + a_normal.z * 0.5;
// u_gl_to_pixel不同地图缩放层级的坐标像素比例
// u_tex_height0为纹理高度
float t = a_position.w * u_gl_to_pixel / u_tex_height0;
v_tex_coord0 = vec2(s, t);
另外还内置其他纹理坐标计算方式:拉伸中间部分,纹理整数倍平铺、0~0.5 部分拉伸、单纹理拉伸、纹理等比缩放等。

路线走过擦除、置灰场景,走过和未走过路线样式的处理,是根据顶点着色器 Shader 中传递的累计长度(v_acculength)在片段着色器 Shader 中控制并渲染。

v_accuLength = a_position.w;
if (v_accuLength >= u_progressLength) { // progress forward
gl_FragColor = u_color1;
} else { // progress backward
gl_FragColor = u_color0;
}

1.4 性能对比

同等 26,050 个点数据路线绘制(乌鲁木齐-深圳),新旧版本性能对比,可以看到 CPU 占用率下降超 50%,GPU 性能没有明显改变。

图 7(旧版本)

图 8(新版本)

2 发光效果优化

2.1 性能优化

得益于顶点数据优化方案,新版的Polyline绘制实现了发光与非发光效果的顶点数据共享同一份数据Buffer,开发者在调用相关功能的过程中,可以显著降低内存的占用量。

2.2 模糊发光

旧版的发光效果逻辑中,需要用到离屏渲染,绘制比原polyline宽度更宽的线,然后进行多次模糊处理,生成一张模糊图片绘制到原来的Polyline下方,实现发光效果。所以旧版SDK的发光效果就需要两倍的时间、空间去计算和储存点信息,还要离屏渲染,不仅要申请额外的帧缓冲空间,多次模糊的处理还增加了GPU的耗时时间。

针对模糊效果的离屏渲染问题,我们在新版SDK的Shader中采用了模糊函数进行替代,避免了相关问题。模糊程度可通过系数灵活控制。

代码片段:

if (uniforms.u_bloom == 1) {
// 透明度渐变发光
// uniforms.u_speed衰减速度
weight = pow(weight, uniforms.u_speed);
} else if (uniforms.u_bloom == 2) {
// 模糊发光
// uniforms.u_times代表模糊程度
// r = 根号2 = 1.414,σ为 r/3 = 0.471
// 2.0*σ方 = 2.0 * 0.471 * 0.471 =  0.443682
weight = 1.0 - exp( - (weight * weight ) / float(uniforms.u_times) * 0.443682);
}

新、旧版模糊发光效果对比:

2.3 发光方向

通过记录方向向量的方案,发光效果拥有了更多的自由度:新版SDK的发光效果不仅可以实现正常的向两侧发光,还支持单侧发光和向上发光。Polygon边线、Circle的边线、弧线、大地曲线也采用了类似Polyline的处理技术。

多方向发光效果:

图 11 线段

图 12 圆边线

图 13 Polygon 边线

2.4 参数接口

Polyline的发光效果功能为开发者提供了高度灵活且可配置的参数接口,从而可以实现更加丰富和吸引人的用户体验,助力开发者打造出更具竞争力的应用。

渐变线多方向不同发光参数动态更新效果:

3 Track 动画

3.1 场景分析

在司乘同显场景中,旧版 SDK 在司乘同显组件中对路线和小车数据进行绑路计算,每次动画结束需要更新 Polyline 的点数据集,每次更新变化就会产生大量的计算。然而大部分的情况下整体路线信息是没有变化的,只是随着行程进度进行路线擦除或置灰。类似的还有轨迹回放,小车平滑移动等场景。为了解决以上问题,Polyline绘制引入了Track 动画。

3.2 Track 动画

在新版 SDK 中,Polyline 新增的 Track 动画能力,可以根据行程进度对路线进行动画处理;除了按进度进行动画,还内置了绑路逻辑,开发者可以直接传入小车行进的位置和方向信息,由 SDK 自动绑路后进行动画;另外除了正常(Nomal)样式,还新增了走过和未走过路线样式,实现 Polyline 走过和未走过路线的自定义绘制。对比旧版的 BMKTraceOverlay,在性能、效果、易用性和灵活性方面都有较大提升。

历史轨迹回放:

图 15

走过路线擦除:

图 16

新旧版本特性对照:

新版效果将于 9 月份在官网发布的 Android 地图 SDK V7.6.3 和 iOS 地图 SDK V6.6.3 版本中呈现,敬请期待!

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

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

相关文章

vulhub:Apache解析漏洞CVE-2017-15715

Apache HTTPD是一款HTTP服务器,它可以通过mod_php来运行PHP网页。其2.4.0~2.4.29版本中存在一个换行解析漏洞,在解析PHP时,1.php\x0A将被按照PHP后缀进行解析,导致绕过一些服务器的安全策略。 #启动靶机 cd /Vulnhub/vulhub-mast…

程序员的魔法石!

本文由 ChatMoney团队出品 AI自己写代码,这只是传说?还是摸鱼新指南? AI出现之前,从来都是老板或产品经理提需求,程序员熬夜加班吭哧吭哧写代码或者是从Github,Stackoverflow上controlc,control…

JavaFX布局-GridPane

JavaFX布局-GridPane 常用实行alignmenthgapvgappaddinggridLinesVisible 实现方式Java实现fxml实现 使用行和列来组织其子节点将节点放置在二维网格中的任何单元格,同时也可以设置跨越行、跨越列 常用实行 alignment 对齐方式,设置内容居中&#xff0…

数据库文件管理

数据库文件与普通文件区别: 1.普通文件对数据管理(增删改查)效率低 2.数据库对数据管理效率高,使用方便 常用数据库: 1.关系型数据库: 将复杂的数据结构简化为二维表格形式 大型:Oracle、DB2 中型:MySql、SQLServer 小型:Sqlite 2.非关…

第三十一天 chrome调试工具

打开调试工具 页面空白处右击 检查 或者F12 使用调试工具 ctrl滚轮改变代码大小 左边是html 右边是css css可以直接改动数值左右箭头或者直接输入 查看颜色 ctrl0 复原浏览器大小 点击元素右侧出现样式引入 没有的话 说明类名或者样式引用错误 这里的.new-left是存在的 如果类…

【Android Studio】UI 布局

文章目录 view布局LinearLayout view 在Android开发中,View是一个非常重要的概念,它是所有用户界面组件的基类。View类及其子类构成了Android应用中的用户界面。每个View都占用屏幕上的一个矩形区域,并可以响应用户输入(如触摸、按…

鸿蒙(API 12 Beta2版)NDK开发【JSVM-API使用规范】

JSVM-API使用规范 生命周期管理 【规则】 合理使用OH_JSVM_OpenHandleScope和OH_JSVM_CloseHandleScope管理JSVM_Value的生命周期,做到生命周期最小化,避免发生内存泄漏问题。 每个JSVM_Value属于特定的HandleScope,HandleScope通过OH_JSV…

MySQL精简笔记

基础类型 bit,tinyint,smallint,int,bigintfload,double(M:整数小数的位数,D:小数的位数)decimal,numeric(M,D)&#xff0…

大模型分布式训练之DeepSpeed优化器并行(ZeRO)原理

由于大模型参数量非常庞大,所以我们常常需要用到分布式训练来解决训练过程中计算资源不足的问题,现在也出现了很多大模型相关的分布式训练框架,但是使用的比较多的还是deepspeed的数据并行,那么deepspeed是怎么实现数据并行的呢 文…

【Unity】web gl inputFied 中文输入,同时支持TextMeshInputFied,支持全屏

同时支持TextMeshInputFied,支持全屏。 使用github包【WebGLInput】:https://github.com/kou-yeung/WebGLInput 需要资源的在这里也可以下载 https://download.csdn.net/download/weixin_46472622/89600795 用于unity web gl 中文输入,只需…

【人工智能】边缘计算与 AI:实时智能的未来

💎 我的主页:2的n次方_ 💎1. 引言 随着物联网设备数量的爆炸性增长和对实时处理需求的增加,边缘计算与人工智能(Edge AI)成为一个热门话题。Edge AI 通过在本地设备上运行 AI 算法,减少对云计…

大数据-61 Kafka 高级特性 消息消费02-主题与分区 自定义反序列化 拦截器 位移提交 位移管理 重平衡

点一下关注吧!!!非常感谢!!持续更新!!! 目前已经更新到了: Hadoop(已更完)HDFS(已更完)MapReduce(已更完&am…

Python酷库之旅-第三方库Pandas(062)

目录 一、用法精讲 241、pandas.Series.view方法 241-1、语法 241-2、参数 241-3、功能 241-4、返回值 241-5、说明 241-6、用法 241-6-1、数据准备 241-6-2、代码示例 241-6-3、结果输出 242、pandas.Series.compare方法 242-1、语法 242-2、参数 242-3、功能 …

最新小猫咪PHP加密系统源码V1.4_本地API接口_带后台

简介: 最新小猫咪PHP加密系统源码V1.4_完全本地化加密API接口_带后台 小猫咪PHP加密系统历时半年,它再一次迎来更新,更新加密算法(这应该是最后一次更新加密算法了,以后主要更新都在框架功能上面了)&…

Python 爬虫项目实战(一):破解网易云 VIP 免费下载付费歌曲

前言 网络爬虫(Web Crawler),也称为网页蜘蛛(Web Spider)或网页机器人(Web Bot),是一种按照既定规则自动浏览网络并提取信息的程序。爬虫的主要用途包括数据采集、网络索引、内容抓…

代码随想录27天|贪心

455.分发饼干 代码随想录 第一想法 将孩子胃口值g[i] 按从小到达的顺序排列,饼干尺寸也按照从小到大的顺序去排列。 优先将大尺寸喂给大胃口孩子。如果满足不了胃口那么久试着分给下一个孩子。 要尽量满足更多的孩子,那么大尺寸的饼干就不能喂给小胃口…

【多线程】线程状态与并发三大特性的细节剖析

这篇文章主要用于对于多线程的一些查缺补漏。 一、 线程的状态 1,操作系统层面,线程的5种状态 关于线程有几种状态,有多种说法,5、6、7都有。 首先对于操作系统来说,只有5种状态,状态如下新建&#xff…

浅谈KMP算法(c++)

目录 前缀函数应用【模板】KMP题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1 提示样例 1 解释数据规模与约定 思路AC代码 本质不同子串数 例题讲解[NOI2014] 动物园题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1 提示思路AC代码 [POI2006] OKR-Periods of …

智慧水务项目(一)django(drf)+angular 18 通过pycharm建立项目

一、环境准备 windows 10 pycharm python3.11 二、pycharm 创建django项目 三、建立requirements.txt 在根目录创建requirements.txt,也就是与manage.py同一目录下,先放下面几个依赖 Django djangorestframeworkpip install -r .\requirements.txt 更新下pip python…

ShardingSphere实战(1)- 分库分表基础知识

一、为什么要分库分表 分库分表是一种数据库优化策略,主要用于解决大型应用或高并发场景下数据库性能瓶颈的问题。具体来说,分库分表可以带来以下好处: 提高性能: 减少单个数据库实例的负载,避免单点性能瓶颈。当数据…