交互规模化:空间候选集必须替代每帧全量扫描

自动关联目录:交互规模化:空间候选集必须替代每帧全量扫描

核心判断:距离过滤写在循环内部,仍然是全量扫描。高密度交互的第一步不是降低每个 Actor 的 Tick 频率,而是让绝大多数对象不进入本帧工作集,并让未被关注的交互物只保留紧凑描述。

一、业务冲突:地图里对象很多,每个玩家真正关注的目标很少

开放场景、可编辑地图和重复摆放物会产生大量潜在交互对象,但单个玩家一帧通常只需要附近少量候选和一个焦点目标。如果每个对象有 Actor、Component、Tick、Overlap 和复制状态,成本按全地图对象数增长,而业务价值只按附近候选数增长。

提示还要求稳定。两个同优先级对象在边界附近切换时,若没有距离、视角和滞回规则,按钮会抖动;性能优化不能以选择结果不确定为代价。

二、实际实现:事件驱动和全量扫描两种策略并存

一类基础交互组件明确关闭 Tick,通过本地 Shape Begin/End Overlap 维护候选列表,只在 UI 查询时按优先级过滤。这条路径的每帧工作量与附近候选数相关,是值得保留的方向。

另一类统一管理器自身每帧 Tick,并逐个询问子管理器;静态子管理器遍历已注册的全部交互组件,先算距离再检查规则与优先级。虽然存在最大距离开关,但距离判断发生在全数组循环内,复杂度仍是 O(P * N)。对象组件还允许 Tick,即使 C++ Tick 为空,也会增加注册和调度负担。

初始化阶段通过 World Actor 遍历收集静态对象,再把包含 Actor 引用的数组整体复制给客户端,OnRep 后重建 Map。它适合对象规模有限、关卡静态的阶段,但动态创建、世界分区和海量对象会放大启动、复制与重建成本。

flowchart LR
    A[创作对象/静态描述] --> R[World Subsystem 注册表]
    R --> X[空间格/分区索引]
    P[玩家位置与视锥] --> Q[查询相邻 Cell]
    X --> Q
    Q --> F[资格粗筛]
    F --> H[稳定评分 + 滞回]
    H --> M[只实体化 Top-K 表现/碰撞]
    H --> D[提交时 DS 精确验证]

三、值得保留:去 Tick 与本地 Overlap 已经抓住主要成本

基础组件用事件维护近邻集合、只处理本地 Pawn,并在 DS 关闭纯提示碰撞,避免了海量无效 Tick 和服务器接触对。管理器使用子管理器接口统一不同对象来源、用 Push Model 复制变更,也说明注册表与对象实现解耦是正确方向。

选择逻辑集中后可以统一优先级、提示和输入,这比每个交互 Actor 自己抢 UI 更可控。需要替换的是候选数据结构,不是撤销集中仲裁。

四、结构性缺陷:Actor 数、候选数和复制相关性被混成一个集合

全量数组既是对象注册表,又是空间查询源和复制清单,导致任何查询都看到全世界对象。Priority >= 的平局由遍历/注册顺序决定,缺少稳定 Tie Break;没有切换阈值和最短保持时间时,焦点会在边界抖动。

整体复制 Actor 引用无法表达按连接 Relevancy、增量注册和未实体化对象;World 全扫描也把启动尖峰绑定到关卡对象数。更深层的问题是“可被创作”默认等于“必须成为运行时 Actor”,使优化只能在已经付出 Actor/Component 成本之后进行。

五、目标设计:紧凑描述先进入空间索引,Actor 按需实体化

UWorldSubsystem 维护无 Tick 的交互描述:稳定身份、Generation、Bounds、ActionMask、Priority、StateRevision 和可选 Runtime Handle。静态对象随 World Partition Cell 注册,动态对象仅在跨 Cell 或规则变化时更新;玩家查询相邻格/八叉树节点,再做视角、距离和 Tag 粗筛。

TargetId SelectFocus(PlayerView v, TargetId previous)
{
    CandidateSpan nearby = spatial.Query(v.position, v.maxRange);
    ScoredTarget best;
    for (Descriptor d : nearby) {
        if (!d.actionMask.Intersects(v.allowedActions)) continue;
        if (!CheapEligibility(v, d)) continue;
        best.Consider(d.id, Score(d.priority, Distance(v,d), Facing(v,d)));
    }
    return ApplyHysteresis(previous, best, switchMargin, holdTime);
}

只为 Top-K 候选创建提示、精细碰撞或完整 Actor;DS 保留紧凑规则数据,在命令提交时精确校验。可变描述用 Fast Array 发送 Delta,Actor 状态交给 Replication Graph/Relevancy;两者不能用“复制全注册表”互相替代。

六、决策规则:先缩工作集,再讨论降频和降精度

规模或行为候选机制运行时表示
少量固定机关Overlap 列表即可完整 Actor/Component
中量静态对象空间格或引擎空间索引Actor 可常驻,禁用无用 Tick
海量可编辑摆件分区描述 + Top-K 物化紧凑数据为主,选择性 Actor
高频移动对象动态索引 + 跨 Cell 事件更新池化表现,限制更新预算
DS 权威检查命令时精确查询无渲染规则与碰撞代理
多连接复制每连接 Relevancy + DeltaState 与描述分流

应持续观测 registered_descriptors、queried_cells、candidate_count、查询耗时、焦点切换率、活跃 Actor/Component/Tick 数、每连接复制字节和 DS 拒绝率。只有候选数随局部密度而不是全地图对象数增长,交互系统才真正具备规模化能力。