Mapbox源码分析(4)地图渲染
简介:
通过源码,我们来一步步分析Mapbox地图引擎如何进行不同数据源的地图渲染的,这里是基于5.3.0的版本.
首先,我们找到地图的核心类,MapView,这个view就是用来显示地图的,它是在mapbox.mapboxsdk.maps包下,看到它的初始化之后,发现它有这么一个方法,叫做initialiseDrawingSurface(),从名字上看可以看出这是一个初始化画布的方法,我们看下它的实现.
这里我们可以看出来,它首先根据选项区分使用TextureView作为view载体,还是GLSurfaceView作为view载体,然后分别讲TextureView和GLSurfaceView通过自定义的两个渲染器TextureViewMapRenderer和GLSurfaceViewMapRenderer的构造方法传递进去进行绑定.这里我们看GLSurfaceViewMapRenderer这个类.
从这个源码我们可以看出来它并未做什么工作,只是在构造方法里做了一些基础配置,和绑定了GLSurfaceView.Renderer渲染器.其它都丢到TextureViewMapRenderer和GLSurfaceViewMapRenderer共同的父类MapRenderer里了,这里我们看下MapRenderer又做了什么
我们看到MapRenderer也声明了onSurfaceCreated(),onSurfaceChanged(),onDrawFrame()方法,并加上@CallSuper注解用于子类必须调用父类这三个方法,但是我们看到他们也并未做什么,而是分别调用了native***()将实现放入底层,这样性能会更好一些,一般onSurfaceCreated()是进行一些初始化配置的工作,onSurfaceChanged()执行画面有改变的时候,onDrawFrame()执行绘制的工作.这里我们跟踪onDrawFrame()内调用的nativeRender()方法
这里我们看到与MapRenderer对应的实现底层文件map_renderer.cpp,这里我们看到它的registerNative()
这里我们看到它将上层的nativeRender()方法和自己的render()方法进行绑定,我们接着看它的render()方法
这里我们看到了这么一行代码renderer->render(*params);它将有关更新数据传入底层Renderer类中的render()方法,继续往下看,这里我们看到它将实现都放到它的Impl实现类,即renderer_impl文件里.这里我们看到render()方法中这行代码
这里通过RenderSource.startRender()方法开始渲染,其startRender()方法是虚函数,其子类RenderAnnotationSource,RenderGeoJSONSource,RenderRasterSource,RenderVectorSource,RenderImageSource分别继承并实现了它.