421 字
2 分钟
RTS 最硬的两块骨头:寻路与战争迷雾
寻路:几百个单位同时找路
OpenRA.Mods.Common/Pathfinder/ 是独立模块。RTS 寻路的难点从来不是单个 A*,而是:
- 量大:框选 50 个坦克点一下右键,50 条路径同时算
- 动态:友军自己就是障碍物,路要边走边修
- 分层:步兵能过桥、坦克不能下水,地形对不同移动类型是不同的图
OpenRA 的做法是分层抽象 + 增量修路,一帧摊一点,不让寻路卡住主循环。Activities/ 里的 Move 行为只管“沿着路径走”,路径本身由寻路系统异步供给——寻路与移动解耦,这个分工值得抄。
战争迷雾:看不见的艺术
ShroudExts.cs + AffectsShroud Trait:每个单位自带视野半径,迷雾是全图一张逐格状态(可见 / 曾见 / 未见)。建筑、步兵、飞机的视野各不相同,叠加计算。
迷雾不只是“黑布一盖”,它直接参与玩法:看不见就不能选中、不能攻击,侦察单位因此有了战术价值。
联机:指令同步而非状态同步
OpenRA.Server/ 是独立的专用服务器。RTS 联机的经典方案是只同步玩家指令、各端确定性模拟,流量极小,launch-dedicated.sh 一键就能开服。代价是模拟必须完全确定性——随机数、浮点都要管住,这也是引擎里随处可见定点数的原因。
打游戏时觉得“这波操作变形了”,现在知道可能是寻路在修路;觉得“视野被压制”,背后是一张逐格计算的迷雾表。懂引擎之后,看比赛都更香了。