AI规模化:表现 LOD 不能替代 DS 模拟 LOD
自动关联目录:AI规模化:表现 LOD 不能替代 DS 模拟 LOD
核心判断:把远处 SkeletalMesh 换成低成本表示,只减少客户端渲染和部分动画成本;DS 上的感知、行为树、寻路、目标统计、Movement 和复制频率若不降级,AI 数量上升时服务器仍会先到瓶颈。
一、业务冲突:数量要形成压迫感,关键敌人不能降错
群体 PVE 需要大量远景单位制造规模,同时保证正在攻击玩家、承担任务目标或即将进入视野的单位及时响应。统一 Tick 频率浪费预算,统一远距离冻结又会破坏追击、伤害与碰撞。规模化的核心不是“所有 AI 变便宜”,而是用明确不变量决定谁可以少算、少发、少画。
二、实际实现:客户端已有表示切换,DS 降载仍未形成闭环
工程中的 AI 默认不是 AlwaysRelevant,这是控制复制范围的正确起点。客户端有组件复制当前 Mesh 表示枚举,按状态切换不同表现;另一个可见性组件复制选中的实体身份和可见集合,在本地隐藏不应显示的 Mesh。部分组件已经关闭 Tick,但 Mesh 切换组件仍注册空的每帧 Tick。
感知重要度接口虽然存在,主体逻辑实际没有落成;基础 AI 仍可保留 Actor Tick。目标选择还可能在候选排序中多次做路径查询,并为每个候选全局扫描 NPC 统计追击者。由此可见,表现 LOD 已有雏形,但 DS 的感知、决策、导航和群体查询没有进入同一预算系统。
flowchart LR
F[Gameplay facts] --> S[Significance service]
S --> D0[DS Tier 0: full combat]
S --> D1[DS Tier 1: reduced decision]
S --> D2[DS Tier 2: aggregate simulation]
D0 --> R[Replication policy]
D1 --> R
D2 --> R
R --> C0[Client full character]
R --> C1[Client reduced animation]
R --> C2[Client proxy/hidden]三、值得保留:相关性与表现表示已经不是硬绑定
非 AlwaysRelevant 让 Replication Graph 或 Iris Filter 有机会按连接裁剪;表现组件使用复制的逻辑选择而非让每端自行猜测,避免不同客户端显示互斥实体。将 Mesh 表示独立为组件,也说明“玩法 Actor”和“渲染表示”可以分层。这些是继续做双侧 LOD 的基础。
四、结构性缺陷:没有共享重要度,就会出现各系统各降各的
距离不是唯一尺度。一个远处但正在蓄力攻击玩家的 AI,渲染可以简化,决策与伤害却不能冻结;一个近处但被墙遮挡且不参与战斗的 AI,客户端也许可以降低动画频率。若感知、行为树、Movement、动画、复制分别计算距离阈值,就会产生阈值抖动和相互矛盾的层级。
只有降频而没有工作集上限也不够:同一帧到期的几百个 AI 仍会形成尖峰。更不能在降级时丢掉仇恨归属、攻击冷却、任务进度、死亡与占用关系;这些是跨层级必须保持的玩法不变量。
五、目标设计:DS 模拟层级与客户端表现层级解耦
共享 Significance Service 读取战斗参与、距玩家、可见性、任务权重和最近受击等事实,输出带滞回和最短驻留时间的层级。DS 独立决定决策、感知、导航与 Movement 预算;复制层按连接决定更新频率和字段;客户端再根据本机画质与视野选择完整骨骼、降频动画、代理或隐藏。统一调度器把到期任务分散到不同帧,并为升档预留抢占预算。
void ScheduleAI(AIRecord& ai, FrameBudget& budget)
{
SimTier wanted = ScoreSignificance(ai.GameplayFacts());
ai.tier = Stabilize(wanted, ai.tier, ai.lastTierChange);
WorkMask due = ai.DueWorkFor(ai.tier, CurrentFrame());
if (ai.MustPromoteNow()) due |= WorkMask::CriticalDecision;
for (WorkType work : PriorityOrder(due)) {
if (!budget.TryConsume(EstimateCost(ai, work))) break;
Execute(ai, work);
StaggerNextDue(ai, work);
}
}六、决策规则:降级的是更新频率与表示,不是玩法真相
| 层级 | DS 模拟 | 每连接复制 | 客户端表现 | 必须保持 |
|---|---|---|---|---|
| 战斗核心 | 高频决策、完整感知与移动 | 高频关键状态 | 完整角色与事件 | 命中、冷却、目标、阻挡 |
| 邻近参与 | 降频 BT,事件唤醒感知 | 中频状态 | 降频动画或简化材质 | 仇恨、路径意图、生命 |
| 远景非参与 | 聚合移动或低频粗模拟 | 低频摘要 | 代理、实例或隐藏 | 身份、位置包络、任务事实 |
| 休眠 | 无 Tick,事件驱动唤醒 | Dormancy | 不物化 | 生成代际、持久状态 |
| 强制升档 | 立即抢占预算 | 立刻发关键快照 | 建立可交互表示 | 升档前不得攻击或碰撞 |
AI LOD 的验收不能只看帧率,而要证明在各层级间迁移时,同一场战斗的结果不改变。客户端可见质量和 DS 模拟质量应共享事实,却必须拥有不同层级与预算。