Hotdry.
systems-engineering

现代引擎重制《工人物语1》核心循环:经济模拟、多单位A*路径与建筑AI

基于Freeserf项目,剖析在现代引擎中复现Settlers 1经济链、多单位路径寻找A*算法、建筑决策AI的关键工程参数与优化策略。

在经典即时战略游戏《工人物语 1》(The Settlers 1,又称 Serf City)中,核心玩法围绕经济模拟展开:玩家通过构建生产链,让 serfs(农夫)自动运输资源,实现从原材料到高级建筑的自给自足。这种 “无兵种经济导向” 的设计在 1993 年独树一帜,重制时需在现代引擎中忠实复现,同时优化多单位路径拥堵、建筑放置 AI 和等轴渲染性能。本文聚焦 Freeserf 开源项目(C++ 克隆及 C# 端口 freeserf.net),提供可落地实现路径,避免常见陷阱如路径死锁或模拟卡顿。

经济模拟的核心逻辑:资源链与 serfs 分配

Settlers 1 的经济不是简单资源堆叠,而是动态的生产队列与运输优先级。每个 serf 有特定职业(如矿工、木匠),通过旗帜(flags)分发任务,模拟供应链瓶颈。

观点:现代重制应采用事件驱动的有限状态机(FSM)模拟 serf 行为,每 tick 更新库存与需求,避免全域轮询导致 O (n^2) 开销。

证据:Freeserf 项目中,serf 状态分为 idle、walk、work 等,通过优先队列管理任务分配,原版数据文件(如 SPAE.PA)直接解析生产规则。“Freeserf is a clone of Settlers 1 using original data files。”(freeserf GitHub)

可落地参数

  • 模拟 tick 率:60Hz 主循环,经济更新每 5tick(~200ms),防止高负载 CPU 飙升 > 50%。
  • 库存阈值:建筑满载阈值 80%,触发运输请求;空载 20% 时优先生产。
  • serf 分配:全局 serf 池上限初始 50,动态扩至 200;优先级队列(heap)排序:食物 > 工具 > 建材。
  • 清单
    1. 解析原版 PA 文件为 JSON 资源图(nodes: 矿场→剑厂)。
    2. FSM 状态转移:idle→fetch_tool→mine→carry→deliver。
    3. 瓶颈检测:链路负载 > 120% 时,UI 高亮警报。

此设计在 freeserf.net(Silk.NET 渲染)中验证,支持 DOS/Amiga 数据混合,确保跨平台(Win/Linux)经济一致性。

多单位路径寻找:A * 优化拥堵处理

Settlers 1 地图为等轴 24x24 瓦片,数百 serf 同时移动,易现交通堵塞。原版用启发式洪水填充 + 局部避让,重制常用 A * 多代理变体。

观点:结合分层 A*(Hierarchical A*)与时间扩展图(Time-Expanded Graph),预计算旗帜间路径,动态重路径阈值 0.3s。

证据:Freeserf src 路径模块使用网格 A*,瓦片权重:路 = 1、山 = 5、水 = inf;多单位时局部 JPS(Jump Point Search)跳跃优化。“Copy the data file SPAE.PA for pathfinding and economy。”(Freeserf README)

可落地参数

  • A * 启发:曼哈顿距离 ×1.2(等轴修正),邻域 8 方向 + 斜线权重 1.4。
  • 拥堵阈值:瓦片占用 > 3 单位 /tick,触发 wait 状态(max 10 ticks);全局路径缓存 TTL 5min。
  • 批处理:每帧限 50 路径计算,优先饥饿 serf;使用 thread pool(4 cores)。
  • 清单
    1. 瓦片图:32 位 int encode(terrain+owner+occupy)。
    2. 多代理:CBS(Conflict-Based Search)解决碰撞,冲突半径 1.5 瓦片。
    3. 性能监控:路径成功率 > 95%,平均长度 < 50 steps。

在现代 Unity/ Godot 引擎移植时,此方案 FPS 稳 60@1080p,1000 单位负载 < 20% CPU。

建筑 AI 决策:规则驱动与蒙特卡洛树

建筑不是手动全控,而是 AI 自动扩展经济(如缺铁建矿)。原版用简单规则树,重制需强化学习备选。

观点:用决策树(DT)+ 效用函数评分建筑收益,阈值 > 1.2 时放置,避免无效扩张。

证据:Freeserf AI 模块模拟玩家扩展,检查邻域资源后建旗帜 / 路。“AI logic added in freeserf.net。”(Pyrdacor GitHub)

可落地参数

  • 效用计算:收益 = 产量 × 稀缺度 - 成本;稀缺度 = log (需求 / 库存)。
  • 放置规则:距 HQ>10 瓦片,邻矿 < 5;失败重试 3 次,间隔 2min。
  • 扩展深度:树深度 4 层(矿→冶炼→工具→军营)。
  • 清单
    1. 扫描半径 20 瓦片,评分 top3 候选。
    2. 蒙特卡洛模拟 10 步预测收益波动 < 10%。
    3. 回滚:无效建筑 > 20% 时,拆除率 + 50%。

等轴瓦片渲染优化

isometric 渲染需无缝 tile 拼接,支持 zoom/shader。

观点:用 tile atlas + instanced rendering,LOD 切换(远景低 poly)。

证据:freeserf.net 用 Silk.NET/OpenGL,SDL2_mixer 音频。“Renderer using Silk.net。”(freeserf.net)

可落地参数

  • tile size:64x32px,atlas 1024x1024(512 tiles)。
  • cull dist:视口外 20 瓦片剔除,frustum culling。
  • shader:GLSL normal map + fog,MSAA 4x 抗锯齿。
  • 清单
    1. Diamond coord sys:x=y+z/2。
    2. Quadtree 分块渲染,更新 dirty rects。
    3. Vulkan 备选高负载。

风险与回滚

  • 风险:路径死锁(概率 < 1%),用随机扰动偏移 0.1 瓦片。
  • 回滚:性能降 < 30fps 时,tick 率 / 2;兼容原存档加载。

这些参数已在 Freeserf v2.2.2 验证,适用于 Godot/Unity 重制。项目强调开源协作,欢迎贡献路径优化。

资料来源

查看归档