在项目临近交付时,将软件部署到甲方的机房环境中,发生软件无法运行的问题。
一、甲方机房的运行环境
软件运行环境为KVM虚拟系统,虚拟系统为Win7 SP1 64位专业版。
启动运行项目软件的操作系统都是虚拟系统,终端机为千元左右的低配NUC主机,通过终端机访问服务器的KVM虚拟系统实现对系统和软件的操作。
二、项目软件描述
项目软件为C/S架构,客户端主要使用了Qt、osgEarth、libEvent、log4cplus的二次开发。
三、项目软件遇到的问题
软件安装到甲方的KVM虚拟系统中,启动软件就会崩溃,无法启动。提示错误信息qt.qpa.gl: Unable to disable rotation.
四、排查问题
经过几天的问题定位与排查,发现甲方KVM虚拟系统的openGL版本为1.0,osgEarth不能支持openGL 1.0版本。
五、尝试过的解决方案
失败解决方案1-Mesa3D:在甲方虚拟系统中安装Mesa 3D实现软件模拟高版本openGL版本,项目软件可以正常启动,但是3D Gis不能显示地图,3D 地球变成一个大黑球。
失败解决方案2-挂载GPU:甲方的虚拟系统可以挂载GPU,向甲方协调使用挂载GPU的虚拟系统,检测发现挂载GPU的虚拟系统openGL版本为4.5。在挂载GPU的虚拟系统启动项目软件,osgEarth提示无法检测到OpenGL版本。提示错误信息为Error: OpenGL version test failed, requires valid graphics context
失败解决方案3-使用NUC主机:向甲方协调,在甲方机房的终端机NUC主机系统中运行软件。NUC主机的显卡为集成显卡HD3000,系统OpenGL版本为1.0,通过查询和尝试,没有合适的HD3000驱动将系统openGL升级为3.3以上版本。
六、办不到的解决方案
解决方案1-在终端机加装独立显卡 不可能的,现场的NUC小主机,长和宽也就15cm左右,高度就几公分。甲方也不同意的。
解决方案2-不使用虚拟系统 不可能的,甲方的其他很多配套工具和软件都运行在云虚拟系统中,软件交付后,甲方就是在云虚拟系统中使用项目软件。
七、最后的解决方法
使用2D Gis替代3D Gis 与甲方协调,甲方同意换用2D Gis。
但是公司并没有2D Gis模块,软件3D Gis开发人员不在甲方现场,在其他城市做项目开发,不能支援甲方现场。距离项目最终交付仅剩一个月。
逼得我没办法了,作为一个对Gis完全不懂的人,用了二十天左右的时间从零开发了一个2D Gis,使用Qt的QGraphicsView实现了对Shp地图文件的读取显示,并且2D Gis接口与3D Gis接口完全相同。实现了画航路、画圆形、画矩形、画多边形、雷达扇形扫描、多圆融合、圆环显示、测距、多图标显示、信息流曲线、地图比例尺、地图缩放、鹰眼图等功能。
幸好项目软件对于2D Gis的功能要求并不多。
八、反思和总结
在项目前期,一定要明确甲方的软件运行环境,确认是否能支持软件运行。在甲方环境中运行一下项目软件Demo,做环境运行验证。
osgEarth的运行,需要独立显卡和高版本OpenGL,而且不能良好运行在虚拟系统中。
这次项目,也让我对仅依赖OpenGL的3D开发充满了不信任。在网络上查找资料时,发现有其他人做VTK等3D开发时,也碰到过GPU的openGL检测失败的情况。
甲方的虚拟系统中,可以运行unity3D开发的3D程序,推测原因为unity3D可依赖于direct3D,但是依赖OpenGL的osgEarth就崩溃了。
下次有3D Gis开发的机会的话,我希望试试虚幻4。