做了这么多年三维电子沙盘,被问得最多的一个问题是:你们为什么不用 UE 或 Unity?现成的引擎不香吗?
说实话,香。但不适合我们。
这篇文章不讲高深的图形学算法,也不贴代码,就从产品和业务视角,聊聊我们为什么要从零自研一套三维 GIS 渲染引擎,以及 AI3DGIS 3.0 这套引擎到底是怎么搭起来的。
一、先说说为什么不能直接用 UE/Unity
UE(虚幻引擎)和 Unity 是游戏行业的两大神器,画面效果拉满,生态成熟,很多三维可视化项目都基于它们做二次开发。但在我们这个领域,用商业游戏引擎有三个绕不过去的坑:
第一,授权和供应链风险。 UE 和 Unity 都是国外商业引擎,授权条款说变就变,价格说涨就涨。更关键的是,我们的客户很多要求全栈自主可控------ 操作系统要国产、CPU 要国产、渲染引擎也要国产。用国外引擎,这一条直接就过不了。
第二,GIS 能力不是游戏引擎的强项。 游戏引擎擅长的是 "精心设计的场景"------ 美术做好的模型、调好的光照、烘焙好的贴图。但 GIS 场景是 "全球级的真实世界":卫星影像、高程数据、矢量地图、倾斜摄影模型,动辄几十 GB 上百 GB,还要支持无级缩放、全球漫游。游戏引擎加载这种数据,要么卡成 PPT,要么需要做大量定制改造,改到最后还不如自己写。
第三,极端环境适配难。 我们的系统要跑在国产操作系统(麒麟、统信)、国产 GPU、各种尺寸的触控大屏上,还要支持完全离线部署。游戏引擎对这些环境的适配非常薄弱,很多底层接口根本不开放,出了问题只能等官方更新。
所以结论很简单:不是 UE/Unity 不好,而是它们解决的问题和我们要解决的问题,根本不是一回事。
二、自研引擎的整体架构:四层搭起来
AI3DGIS 3.0 的渲染引擎从零开始写,整体分了四层,每一层只干一件事:
第一层:数据层 ------ 把真实世界 "搬" 进电脑
这一层负责处理所有原始地理数据:全球卫星影像、DEM 高程数据、矢量电子地图、无人机倾斜摄影模型、BIM 建筑模型。核心工作是两件事:切片 和流式加载。
切片就是把一张巨大的卫星影像切成很多小块,像地图 App 那样,放大看高清、缩小看缩略。流式加载就是用户看到哪里加载哪里,不需要把整个地球的数据都读进内存。这一层做好了,全球漫游才不会卡。
第二层:渲染层 ------ 把数据画到屏幕上
这是引擎的核心。基于图形 API(OpenGL/Vulkan),把数据层送来的纹理、网格、地形、模型,按照正确的空间位置画出来。包括地形渲染、影像贴图、模型绘制、光照计算、大气效果(雾、体积光、辉光)等。
我们没有用任何第三方渲染中间件,从绘制调用到着色器全部自己写。好处是完全可控,想优化哪里优化哪里;坏处是前期踩坑无数,这个后面说。
第三层:交互层 ------ 让人能 "操作" 这个数字世界
包括视角控制(平移、缩放、旋转、倾斜)、拾取(点选某个模型或坐标)、手势操作(单指平移、双指缩放旋转)、标绘交互(在三维场景里画军标、注记、路线)。
这一层看起来简单,实际上细节极多。比如在球面上画一条线,怎么保证它贴地不飘?旋转视角时标绘符号怎么保持正确朝向?这些都需要大量的空间几何计算。
第四层:应用层 ------ 把能力封装成业务功能
这一层面向具体业务场景:态势标绘、路径规划、通视分析、剖面分析、时序推演、多端协同。把底层的渲染和交互能力,组合成用户能用的功能模块。
四层之间通过明确的接口解耦,底层改了不影响上层,上层加功能也不用动底层。这是我们踩了很多坑之后才定下来的架构。

三、自研路上踩过的三个大坑
说几个印象最深的,不懂技术也能看懂的那种。
坑一:全球级地形渲染,一放大就糊。
早期版本,缩小看全球还行,一放大到城市级,地形就变成了 "乐高方块",锯齿严重。原因是高程数据的精度和纹理分辨率不匹配。后来我们做了多 LOD(细节层次)调度------ 远的地方用低精度,近的地方自动切换高精度,再加上地形平滑算法,才解决这个问题。现在从全球视角放大到某一栋楼,全程流畅不糊。
坑二:倾斜摄影模型太大,加载慢到崩溃。
一个城市的倾斜摄影模型动辄几十 GB,直接加载内存直接爆。我们的方案是做了模型轻量化 + 动态卸载:把原始模型转换成流式格式,边看边加载;离开视野的模型自动卸载释放内存。优化完,同样的硬件,原来加载一个区都卡,现在加载整个城市还能保持流畅。
坑三:国产 GPU 适配,画面全是黑的。
第一次把引擎移植到国产 GPU 上,运行起来一片漆黑,排查了一周才发现是某个着色器语法的兼容性问题。国产 GPU 的驱动和主流显卡有差异,很多 "标准" 写法在上面不工作。后来我们建立了一套跨平台适配层,把不同 GPU 的差异封装在底层,上层代码不用改。现在麒麟 + 统信 + 国产 GPU 的组合,引擎可以稳定运行。

四、自研引擎带来了什么?
三年自研,最大的收获不是 "我们有了一个引擎",而是三个实实在在的能力:
第一,完全自主可控。 从底层渲染到上层应用,每一行代码都是自己的,不依赖任何国外商业引擎。客户问 "你们核心技术是不是自己的",我们可以很肯定地说是。这在很多领域是准入门槛。
第二,极致的性能优化空间。 因为底层完全可控,我们可以针对 GIS 场景做深度优化。比如全球漫游的帧率、大数据量加载速度、内存占用,这些都可以一点点抠。AI3DGIS 3.0 在普通办公电脑上加载全球三维场景,能稳定在 60 帧。
第三,灵活的定制能力。 客户要加一个特殊的分析功能、要适配一种特殊的硬件、要对接一套特殊的数据格式,因为引擎是自己的,改起来很快。如果用 UE/Unity,很多需求根本做不了,或者成本极高。
五、写在最后
从零自研渲染引擎,不是一条容易走的路。前期投入大、踩坑多、见效慢,很多团队走到一半就放弃了,转而用 UE/Unity 做快速开发。
但我们坚持下来了,因为我们相信:在专业领域,核心技术必须攥在自己手里。 别人的引擎再好,也是别人的;授权说收回就收回,生态说封闭就封闭。只有自己的引擎,才能跟着客户的需求一起成长,才能在国产化的大趋势下站得住脚。
AI3DGIS 3.0 不是终点,我们还在持续迭代。下一步是把 AI 能力更深地融入渲染引擎 ------ 让三维场景不只是 "看得见",还能 "看得懂" 和 "算得准"。
这条路很长,但方向是对的。