| 跨平台高性能地图渲染技术研究 |
2. 北京超图软件股份有限公司,北京,100015
2. SuperMap Software Co., Ltd., Beijing 100085, China
手机地图软件和手机导航软件的大范围使用,强化了公众对地图的认识,也带动了地理信息系统(geographic information system,GIS)的发展,GIS的运行设备,从最开始的PC机发展到了现在的服务器、PC、平板电脑、手机、专业手持机、WEB端等,硬件和操作系统呈多样化发展,这就要求在不同的平台下都有相匹配的地图渲染引擎[1]。SuperMap最初的产品架构体系采用插件式架构,地图数据解析引擎和地图渲染引擎设计为插件模式,在这种体系下,虽然在技术上可以实现地图渲染引擎的扩展开发,但问题是针对每一款操作系统,都需要开发一款相应的地图渲染引擎,地图渲染引擎采用操作系统提供的图形库。如Windows操作系统多采用GDI(graphics device interface),Linux操作系统多采用XLib、GTK、QT,移动设备Android采用Skia, iOS采用Quartz。随着移动端硬件及操作系统的增多,这一问题愈加突出。
笔者曾于2006年开发出一款位图式地图渲染引擎,自行实现了相关的图形图像算法,这款地图渲染引擎解决了对操作系统图形库的依赖,解决了跨操作系统的问题。但随着手持机等设备具备图形加速硬件GPU和WEB端应用呈爆发式增长的需求发展,位图式地图渲染引擎不能借助GPU进行地图渲染加速,存在位图引擎性能低、不支持Web浏览器上的地图渲染等问题。
针对这两个问题,本文提出一种跨平台的高性能地图渲染技术,基于OpenGL(open graphics library)图形库研发了一款跨平台高性能地图渲染引擎(GL引擎),实现对矢量数据、栅格数据高性能、跨平台渲染的成果,且保持在不同平台下,地图渲染风格的一致性。创新了相关的渲染算法和方法,研发出高性能、跨平台地图渲染引擎。针对三角剖分出现的问题,提出了一种全新的蒙板式绘制机制,数量级式提高了多边形的剖分性能,解决了三角剖分对自相交多边形和岛洞多边形剖分错误的问题。采用纹理字典缓存技术,解决了文本绘制时,字体数据在内存与缓存中大量交换的问题,极大提高了文本的渲染性能,实现了高性能的沿线注记文本。
1 跨平台图形库研究地图要素的渲染,可以分解为点要素、线要素、多边形区域要素、文本要素、图像要素等。这些要素,在操作系统的图形界面库中都会提供,但不同的操作系统提供的图形库算法及接口不同,这就给地图绘制带来了很大的不便。作为GIS产品全球领先的供应商Esri公司,由于其产品ArcGIS长期基于Windows操作系统运行,其地图渲染引擎一直基于Windows系统提供的GDI图形库,为其后继的跨平台发展带来很大的困扰。随着跨平台产品需求的提升,ArcGIS Runtime SDK产品针对不同的操作系统实现了不同的地图渲染引擎,不利于地图渲染效果的一致性[2]及产品维护工作。
要实现跨平台的地图绘制,需要实现一款跨平台的图形库支持。目前比较流行的跨平台图形库有Ugraphics、AGG、QT、OpenGL等,本文对现行的跨平台图形库特性进行研究对比,以找到适合现行地图渲染的图形库。
1.1 UGraphics(通用图形库)UGraphics是笔者于2006年设计研发的一款跨平台图形库,此图形库采用C++语言开发,实现了位图式绘制缓存、画笔(UPen)、画刷(UBrush)、字体(UFont)、区域(URgn)、调色板(UPalette)、图像(UImage)等绘制工具和算法,并采用反走样算法实现了线几何对象和面几何对象的反走样功能。由于采用C++语言开发,UGraphics提供了很好的跨平台特性,已成功应用于Windows、Windows CE、Linux、ArmLinux、Symbian等平台。在iOS系统推出时,采用Object-C适配,成功在iOS系统进行地图渲染; 在Android系统推出时,采用JNI模式,导出为Java开发语言,成功在Android系统进行地图渲染。UGraphics在超图软件移动端产品、组件产品、桌面产品中被采用,虽然它可以实现跨平台图形渲染,但存在不能利用图形加速硬件、不能渲染三维图形、不支持Web端图形渲染等问题。
1.2 AGGAGG是一个开源的二维图形引擎。它提供一套结合了亚像素(subpixel accuracy)技术与反走样(anti-aliasing)技术的图形算法,实现高效率、高质量的二维图形处理功能。AGG采用C++和标准的C运行时函数(standard C runtime function)进行编写,这赋予了AGG良好的跨平台能力。AGG的另一个特点在于它极大的灵活性。其作者将它描述为“创建其它工具的工具”。AGG提供一系列松耦合的算法,而且其所有类均采用模板(template)进行描述,开发者可以自由地组合、改写、替换其中部分或全部算法,以满足其具体的图形操作需求。但AGG存在采用的模板过于复杂,难于扩展开发、缺乏对GPU图形加速的支持、对移动端缺乏支持、对Web端缺乏支持、缺乏对三维渲染的支持等问题[3]。
1.3 QTQT是由Trolltech公司开发的一款跨平台的C++图形用户接口软件,QT的设计采用面向对象的思想,使功能更好的封装和模块化,开发者在使用过程能够轻松地使用和扩展。QT具有良好的跨平台性,支持Windows、Linux、Mac、Android、iOS等操作系统[4]。QT的Qpainter提供了丰富的绘制API函数,如drawArc、drawChord、drawEllipse、drawImage、drawLine、drawText等,还对Path、颜色渐变、平面坐标的变换都能很好的支持,这对复杂图形的绘制提供保障。QT是基于FrameBuffer进行渲染的,有专门的服务将帧数据拷贝到显卡中,因此,QT的绘制效率是比较高的。QT为了提高绘制的质量,提供反锯齿的功能,使绘制的图形效果更舒适。对于3D图形绘制,QT基于OpenGL来实现。但QT应用到地图渲染引擎存在以下问题:对商业版应用收取授权费、不能使用GPU图形加速、对移动端支持弱、缺乏对三维绘制的支持、缺乏对Web应用的支持等。
1.4 OpenGLOpenGL是一个跨语言、跨平台的应用程序编程接口(API),用于绘制二维和三维矢量图形。API通常用于与图形处理单元(GPU)交互,以实现硬件加速绘制。OpenGL规范描述了用于绘制二维和三维图形的抽象API。虽然API完全可以在软件中实现,但它的设计主要还是在硬件上实现。API被定义为客户端程序可以调用的一组函数,以及一组命名的整数常量。虽然函数定义表面上与编程语言C相似,但它们与语言无关。因此,OpenGL有许多语言绑定,其中最值得注意的是JavaScript绑定WebGL(基于OpenGL ES 2.0的API,用于在Web浏览器中进行3D渲染)、C绑定(WGL、GLX和CGL)、由IOS提供的C绑定以及由Android提供的Java和C绑定。除了独立于语言之外,OpenGL也是跨平台的。该规范没有提到获取和管理OpenGL上下文的问题,而是将其作为底层窗口系统的一个细节。OpenGL具有纯粹关注渲染、支持跨平台图形渲染、可以利用图形加速硬件、支持Web端图形渲染(WebGL)、支持移动端图形渲染(OpenGL ES)、提供免费的商业使用授权等特性[5-9]。
1.5 图形库选择通过表 1的对比结果,本文选择以OpenGL图形库为基础,研发跨平台高性能地图渲染引擎。
| 表 1 图形库特性对比 Tab.1 Drawing Library Properties Comparison |
![]() |
2 GL地图渲染引擎结构 2.1 跨平台实现机制
GL地图渲染引擎基于OpenGL图形库,实现了对地图各元素的渲染,在进行地图渲染时,先分层实现各图层的渲染,再将渲染后的图层进行叠加渲染,最终绘制出完整的地图,呈现在视觉窗口。
GL地图渲染引擎实现了统一的地图元素绘制方法,并提供统一的地图数据对接API。地图渲染引擎把地图要素拆分成基础的图形要素,在不同的平台下,只需要调用不同系统的OpenGL图形库,进行基础图形元素的绘制,便可形成统一风格的地图,达到了在不同平台下,实现统一的地图渲染风格,具体的技术架构如图 1所示。
![]() |
| 图 1 GL地图渲染引擎跨平台原理 Fig.1 Cross Platform Principle of GL Map Rendering Engine |
2.2 GL地图渲染引擎架构
GL引擎的模块包括地图模块、事件处理模块、GL渲染模块、数据处理模块。数据处理模块负责将地图数据解析为OpenGL可识别数据,主要负责对空间几何数据进行三角剖分,将矢量地图数据中的位置、颜色等信息编码成为OpenGL可渲染的形式RO(render objects)。GL渲染模块调用OpenGL图形渲染库,将数据渲染为可视化数据,即解析RO数组,通过调用API操作OpenGL状态机,控制渲染管线渲染出地图。地图结果将通过交互模块的宿主系统窗体显示到屏幕。
交互模块负责将渲染结果渲染至显示设备及接受用户的交互操作,交互模块提供了OpenGL的显示窗体,并提供包括手势在内的各种用户交互,处理用户交互操作产生事件,它采用两种方式来响应事件:一种是添加数据处理任务,通常是范围比例尺变化的事件,需要显示新的数据;另一种是地图的重绘操作。
2.3 GL地图渲染引擎渲染流程宿主环境地图窗口发生变化时,会激发地图的渲染操作,地图窗口的变化主要包含地图初始加载或其他应用窗口对地图窗口的遮盖,另一种变化是地图的交互操作,如缩放地图、漫游地图、编辑地图等。
地图的渲染流程如图 2所示,当地图变化事件被激发时,地图便进入渲染流程。地图渲染模块会根据当前窗口的大小范围,将地图划分为9个格网空间,然后将格网空间的内地图交由子线程进行绘制。
![]() |
| 图 2 GL引擎渲染流程 Fig.2 GL Engine Rendering Process |
子线程池中的任务将依次处理,分别是:从数据集读取数据,判断数据是否在可见范围内,裁剪、组织数据形成渲染RO。子线程处理完成后会回调重绘操作,重绘操作是把处理好的RO通过GL函数渲染,形成像素矩阵并渲染到屏幕上。
3 地图元素的渲染在矢量地图数据的高性能渲染过程中,影响GL引擎性能的部分包括点几何对象的渲染、线几何对象的渲染、面几何对象的渲染、文本的渲染等。
3.1 点几何对象渲染点几何对象的空间要素主要是位置要素,坐标分别用经度与纬度来表示,经度与纬度各用double类型8字节存储。地图中的兴趣点等相关对象主要存储为点几何对象类型。
点渲染为圆形形状,中间以实色填充,可改变圆的半径大小及填充颜色。绘制时将圆拆分为多个三角面片,调用OpenGL的GL_TRIANGLE_FAN模式进行渲染;为提升地图展示效果,地图中的点几何对象通常用栅格符号来展示,本渲染引擎在绘制栅格地图符号时,先将符号库加载至显存中,形成整幅纹理,类似文字中的字典,然后采用纹理贴图方式,将符号渲染至地图相应的位置,从而提升了符号的渲染性能及美观性。
3.2 线几何对象渲染线图层可分为3类:单线图层、宽线图层和符号线图层。对于单线要素,GL地图渲染引擎直接使用OpenGL支持的API即可快速绘制。但对于宽线,GL引擎首先将其拆分为矩形,再将矩形拆分为三角图元的组合,再进行渲染,如图 3所示。
![]() |
| 图 3 宽线三角剖分 Fig.3 Wide Line Triangulation |
将矩形拆分为三角形,采用Delaunay三角剖分算法。余杰等[10]归纳总结了现有Delaunay三角网构建研究中的3类方法:逐点插入法、三角网生长法和分治法, 并且提出优化的方向为混合构建方法。
结合GIS数据体量大、要求绘制性能高等特点,本文采用逐点插入算法进行宽线的三角剖分操作。同时,为了避免线端拐角处剖分复杂带来性能低的情况[11],本文以在线段交接处补充画圆的方式来替代线段交接处的三角剖分工作,极大地提升了宽线的绘制性能。符号线处理与复合点图层相似,都是被拆分成基本点、线、面、文字的组合后,被处理到多个RO中。
3.3 面几何对象渲染面要素采用三角剖分法绘制过程为:表达面要素的几何多边形被分割成为多个三角形的组合,三角网要完全覆盖多边形且无相交边,然后在显存进行渲染。问题在于,三角剖分算法时间复杂度为O(n2),当面边界很复杂时,尤其是对于含有岛、洞的面,耗时指数级增长。而且三角剖分算法对异形面支持不好,特别对于自相交面会出现明显的绘制错误。
地理信息绘制中的多边形绝大多数都是复杂的凹多边形,但是OpenGL不支持直接填充凹多边形[12], 尤其是还存在大量的岛洞多边形,针对此种情况,本文提出一种蒙板算法的绘图机制,多边形的绘制以此种方式替代了传统的三角剖分方案,将运算的复杂度降为O(n)。GL地图渲染引擎提出面要素的蒙板绘制技术,将面要素渲染分为两步:①在OpenGL的模板缓冲区中刻画面的形状,形成颜色缓冲区上的遮罩;②在颜色缓冲区中绘制面的外包矩形,即可得到最终的渲染结果。类似于在画布上盖一张带镂空形状的纸,面要素渲染就是先在纸(模板缓冲区)上镂空出面的形状,再给整个画布(颜色缓冲区)上色,当纸拿走后面要素的形状就印在了画布上。OpenGL借助GPU的计算能力,可以保证该方法的绘制效率[13, 14]。模板缓冲区操作方式见图 4。
![]() |
| 图 4 多边形蒙板绘制过程 Fig.4 Polygon Mask Drawing Process |
3.4 文本渲染
OpenGL渲染文字的方式是将FreeType在内存中生产的字形Buffer拷贝到显存纹理后再进行渲染。这种方法存在的问题是,每渲染一个文字都要进行内存和显存的内容交换,效率低,渲染速度慢。若以POI为单位管理字形,为所有POI数据建立纹理显存缓存,相同POI直接复用缓存渲染文字,无需重复使用FreeType渲染出文字,可在一定程度上缓解渲染效率低的问题,但无法实现海量POI高性能渲染。此外,该方法由于采用大量纹理,会占用大量显存空间。
GL引擎在OpenGL基础上,提出基于字典方式的文字缓存方案,如图 5所示,其核心思想是将一次渲染用到的相同字体、字号的文字字形图像按每16×16个为一组,拷到显存中的纹理页,多张页组成该字体在该字号下的字典。当渲染单个文字时,纹理被绑定为文字对应的字典页,通过纹理映射即可渲染出文字。同一字典只需要进行局部纹理的更新即可在多次渲染中复用。采用该方案,地图全屏的文字渲染可在0.1 s内完成。
![]() |
| 图 5 字典结构 Fig.5 Dictionary Structure |
4 引擎渲染性能
为测试GL地图渲染引擎性能,本文采用同一份全国地图数据(小于1∶100万比例尺采用全国范围数据;大于1∶100万比例尺采用北京区域数据),全要素地图数据,共含268个图层。采用苹果公司12.9英寸iPad Pro(32 GB/WIFI版)移动设备,设备参数为:2.26 GHz主频,12.9英寸屏幕,2 732×2 048像素屏幕分辩率,4 GB系统内存,32 GB存储容量。图 6和图 7分别采用GL地图渲染引擎、MapBox地图渲染引擎(UGraphics)进行对比测试,GL地图渲染引擎性能为MapBox地图渲染引擎性能的1.75倍,如表 2所示。
![]() |
| 图 6 GL地图渲染效果 Fig.6 GL Map Rendering Effect |
![]() |
| 图 7 MapBox地图渲染效果 Fig.7 MapBox Map Rendering Effect |
| 表 2 GL地图渲染引擎与MapBox地图渲染引擎性能对比 Tab.2 Performance Comparison of Map Rendering Engine Between GL and MapBox |
![]() |
将同样的地图数据编译为超图软件GL、MVT矢量切片格式,分别用GL和MapBox地图渲染引擎对比,GL地图渲染引擎的性能为MapBox性能渲染的81倍, 如表 3所示。
| 表 3 GL地图渲染引擎与MapBox地图渲染引擎绘制矢量切片性能对比 Tab.3 Performance Comparison of Map Rendering Engine in Rendering Vector Slices Between GL and MapBox |
![]() |
5 结束语
本文提出的跨平台高性能地图渲染技术,研发了GL地图渲染引擎,解决了地图不能跨全平台渲染的问题,采用图形加速硬件、创新图形渲染算法,实现了地图的高性能渲染,采用统一的地图渲染调色算法,实现了在不同平台下的地图渲染风格一致性[15]。
GL地图渲染引擎目前已集成到超图软件平台软件的组件产品、桌面产品、服务器产品和移动终端产品中,代替已经在产品中应用长达十年之久的通用图形渲染引擎,数量级提升了地图渲染性能。
虽然GL地图渲染引擎实现了高性能跨平台地图渲染,但随着技术的发展,还有以下的技术关键点有待探索:①与AR功能相适应的倾斜角度地图渲染;②三维模型地图高性能渲染;③在线传输切片地图实时高性能渲染;④流式地图数据实时高性能渲染;⑤与GL地图渲染引擎特性相匹配的地图数据存储格式。
| [1] |
芦文峰, 王凯, 吴亚非, 等. 图形绘制引擎的效率和跨平台研究[J]. 计算机工程与设计, 2016, 37(5): 1400-1404. |
| [2] |
高祥涛, 苏中滨, 严士超. 在ArcGIS中C/S结构多客户端渲染不一致问题的研究[J]. 计算机应用与软件, 2011, 28(2): 100-102. DOI:10.3969/j.issn.1000-386X.2011.02.031 |
| [3] |
鲁力, 李欣. 基于AGG算法库的通用图形接口设计[J]. 微计算机信息, 2009, 25(6): 266-267. |
| [4] |
万广通. 基于QT的跨平台地图符号框架设计和应用研究[D]. 徐州: 中国矿业大学, 2014
|
| [5] |
王亚美, 鲁田. 基于OpenGL ES的二三维地图可视化客户端设计与实现[J]. 计算机应用与软件, 2013, 30(9): 77-80. DOI:10.3969/j.issn.1000-386x.2013.09.023 |
| [6] |
赵玮丹, 江文萍, 李鸣. 数字地貌晕渲的信息量度研究[J]. 测绘地理信息, 2016, 41(3): 64-67. |
| [7] |
孙伟, 李瑞豹, 丁伟, 等. 基于OpenGL ES的移动终端三维地图可视化[J]. 计算机应用与软件, 2017, 34(3): 154-159. DOI:10.3969/j.issn.1000-386x.2017.03.028 |
| [8] |
马娟, 邓富亮, 刘春影. 快速高质量地质灾害地图渲染引擎的设计与实现[J]. 安全与环境工程, 2014, 21(3): 21-27. DOI:10.3969/j.issn.1671-1556.2014.03.005 |
| [9] |
周小军, 夏青, 蒋秉川. OpenGL多线程电子地图显示研究[J]. 测绘科学, 2010, 35(6): 105-106. |
| [10] |
余杰, 吕品, 郑昌文. Delaunay三角网构建方法比较研究[J]. 中国图象图形学报, 2010, 15(8): 1158-1167. |
| [11] |
吴明光, 郑培蓓, 闾国年. 线对象的惯性函数描述与三角剖分方法[J]. 测绘学报, 2016, 45(3): 372-378. |
| [12] |
徐泽骅, 李胜, 汪国平. 基于OpenGL的地图渲染引擎设计与实现[J]. 地理信息世界, 2015, 22(6): 32-36. DOI:10.3969/j.issn.1672-1586.2015.06.005 |
| [13] |
郁剑伟. 基于QT的电子地图子系统的设计与实现[D]. 成都: 电子科技大学, 2012
|
| [14] |
王建安, 李少林, 金晶. 基于QT/Embedded与Mitab库的嵌入式电子地图[J]. 计算机系统应用, 2015, 24(5): 47-51. |
| [15] |
刘楠, 李欣. 跨平台高质量二维图形库设计与实现[J]. 计算机工程与设计, 2010, 31(7): 1599-1602. |
2021, Vol. 46











