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 模拟质量应共享事实,却必须拥有不同层级与预算。