最近想用node 试试基于gl 的矢量数据渲染,服务器端渲染效果如何,实际上应该类似于把mapbox-gl 用到了headless 的浏览器内核中去做渲染。当然gl-native 应该是调用的OpenGL,而我们把js 放到headless 去用webgl 渲染,性能上也许会有差异。但至少API 会简易一些。
几个坑
首先我用的 mapbox-gl-native-nodev3.5.4 基于node-v4.7, mapbox-gl-native 项目地址,C++写的,给安卓,IOS,node等各平台暴露了接口。看到这里,实际上这类C++ 的库,比如GDAL 也是这么操作的,有各类语言的binding.
第一个问题: node-pre-gyp install ...|| make node
会遇到拿不到 aws 上的资源,实际上可以拿到,只要网速好,多等一等。。因为node-gyp 安装node 的C++ 扩展模块,是需要拉取代码到本地并且用本地gcc去编译对应平台(本文是linux)的node文件。
var mbgl = require('../../lib/node-v' + process.versions.modules + '/mbgl')
这句话,在js 脚本层面是 require 一个文件模块,实际上是加载.so 的可执行模块,如果在windows 上应该是 .dll 文件。本文采用的是 node v4.7.3,所以会去查找lib 下node-v46 下的.node 文件。如果我们采用的是mapbox-gl-native v4.1, 那我们应该采用至少 node v6 以上版本,对应的运行时回去查找 lib/node-v48 下面的.node 文件。
总结下:
- mapbox-gl-native v.3.5 请用 node v 4.7
- mapbox-gl-native v.4.1 请用 node v 6.x
第二个问题: gcc 版本,导致glibc过低
拿到关键的 gl-native.node binary 之后,运行时,可能会遇到gcc 版本过低的问题, 这个就找个repository,升级gcc到4.9 以上。
sudo add-apt-repository ppa: ubuntu-toolchain-r/test
apt-get install g++-4.9 gcc-4.9
然后软连接替换掉 /usr/bin/ 中默认的g++ 即可,
第三问题,运行时错误。
由于nodejs 加载运行C++ 扩展模块,会需要一些依赖,比如直接跑该项目的 test case 可能会报错
libEGL 错误针对这类问题,有的时候还不能直接装apt install libEGL,可能不叫这个名字。 经验就是
apt search libegl
然后会列出 源里面所有相关的包,
apt search result
所以我们就选第一个 runtime 版本的包安装一下就好了。图中所示是另外一个依赖包,关于OpenGL 的
zlib 版本问题
参考这个博客
下载最新zlib, 从源码编译 安装即可
最终可以服务器端随意渲染了,把渲染结果利用sharp 库写成位图文件.
倾斜30度的一份pbf 矢量数据node render.js
关键的.node 文件和 render.js 代码都放到了 github 项目
后面可以试着做更复杂的渲染,批量,多线程等等。
最后贴一个也可以实现后台渲染数据的gl 项目
https://github.com/stackgl/headless-gl ,之前很火,现在不维护了。
网友评论