概述
本文是针对native sdk 4.0进行学习总结,以ios平台为例进行的架构总结,方便后续工作的开展。由于时间和认知原因,总结可能存在不当之处,随着后续的理解加深,将进行不断的完善和修正。
系统分层
系统分层图
如上图所示为,地图SDK的系统分层,总体上分为两层,地图内核层(图中虚线框部分)和SDK封装层(图中上部紫色框)。
- 地图内核层:是地图显示与控制功能的实现层,主要是C++实现,部分平台相关的由各平台语言实现,内核层又可以分为数据IO层、资源管理层、渲染组织层、渲染接口层、地图控制层等。
- 数据IO层:负责资源数据的加载、解析、数据缓存等,包括缓存数据和网络数据等;
- 资源管理层:负责地图资源的管理调度,资源包括地图样式、图片、文字、地图数据等;
- 渲染组织层:负责将地图数据和样式,生成渲染所需数据,渲染状态控制、渲染排序等;
- 渲染接口层:负责对渲染API(OpenGL、gles)的封装,实现渲染的跨平台性;
- 地图控制层:负责对地图的控制,包括位置、层级、风格等,负责事件的分发处理,负责对外(sdk层)接口的封装;
- SDK封装层:负责地图引擎空间部分的实现,负责根据不同平台实现不同的语言的封装,如iOS的OC封装、Android的JNI封装等。
模块说明
在本节中,将对mapbox的模块进行说明,每个模块为一个工程或者为多个类和文件的集合。
模块图关系图
如上图所示,mapbox的模块逻辑图,图中箭头代表了模块间的依赖关系(由于在实现中大量使用的Bridge模式,所以依赖关系存在一些出入)。虚线框代表上一节所述对应颜色的分层。
每个模块的功能说明如下:
- 基础库:该部分封装一些与业务无关的公共库
- Vendor:为一些第三方的开源库,如boost,geojson,sqlite等;
- util:定义实现了一些基础的功能类。如Thread,timer,geometry,image,event,task等,这些基础功能与业务无关,为上层的业务模块所调用;
- actor:任务的调度管理基础库,实现了不同的活动者(线程,或者线程池)之间的任务通知,分配以及处理机制;
2. 渲染接口
- Gfx: 对渲染环境的抽象,对渲染概念的抽象和枚举定义,该模块不依赖opengl。如深度、模板测试等等的抽象定义;
- gl:是对opengl相关对象的封装,依赖于opengl和gfx。如Vbo,Fbo,uniform等概念进行封装,真正与opengl进行交互;
- Program:是对各种渲染shader的管理模块,包括shader的管理,calldraw调用等。(源代码中将shader独立为一个单独的模块,现改造为合并到program模块中)。
3. IO
- Storage:负责数据的加载、下载、缓存等功能
- Sprite:主要负责中图片资源的下载,解析等操作
- conversion:在style模块下,负责样式文件json的解析等,包括图层、数据源、过滤器、表达式等;
- Geometry:矢量瓦片数据解析的辅助模块、DEM数据的操作,该模块没有统一的功能集合,难以归纳;
4. 资源
- Style:样式的管理模块,与样式文件相对应,包括图层(style::Layer)的管理,数据源(style::Source)的管理,各种样式组成的定义,如属性、表达式、灯光、图片等;
- Tile:瓦片数据的定义管理模块,定义了各种瓦片以及相应操作,包括栅格瓦片、矢量瓦片、地形瓦片、json瓦片等;
- Text:文字的管理模块,包括文字数据、文字纹理生成、碰撞检测等相关功能;
- Algorithm:主要是瓦片ID相关的计算操作;
5. 渲染组织
- Render:地图显示相关的在引擎的组织管理模块,包括渲染数据组织(renderlayer),渲染队列组织、渲染数据生成(bucket)、显示区域计算、渲染控制等功能;
- Layermanger:工厂模块,负责创建对象style::Layer、RenderLayer、Bucket、Layout等; <