反馈编排:一次 Multicast 不能代替表现事务

自动关联目录:反馈编排:一次 Multicast 不能代替表现事务

核心判断:权威结果、预测反馈和远端观察表现具有不同时间语义。Multicast 只能运输一次消息,不能提供确认、纠正、取消和跨通道幂等。

一、业务冲突:本地必须即时,DS 又可能否决

攻击、交互或技能按下后,本地动画、镜头、音效、UI 和设备反馈应立即开始;DS 仍要验证目标、资源和状态。若等待权威消息,操作迟钝;若各通道自行预测,拒绝后又没有统一办法撤回。

远端玩家只需要最终可见表现,晚加入者只需要持续状态,不应该补播过期镜头和声音。一次可靠广播无法同时满足三类受众。

二、实际实现:DS 已解析目标,但反馈仍依赖索引和全局句柄

早期路径由 DS 广播目标 ID、效果索引和上下文,客户端重新查找角色或 NPC 后应用效果。声音按网络角色过滤,镜头震动只在本地控制角色上执行。这保留了 DS 解析后的目标集合,也避免专服创建本地视听对象。

但消息没有统一 EventId、PredictionKey、ServerTime 与 Outcome;效果索引绑定本地数组顺序,目标尚未物化时事件直接丢失。镜头依赖硬编码资产和单个“当前震动”句柄,无法同时管理多个来源或精确撤销某次预测。

sequenceDiagram
    participant C as 本地客户端
    participant D as DS
    participant P as 表现编排器
    C->>P: BeginPredicted(PredictionKey)
    C->>D: Command(PredictionKey)
    D-->>C: Confirm/Correct/Reject(EventId)
    C->>P: Reconcile(EventId, PredictionKey)
    P->>P: 动画/镜头/UI/音频/VFX/设备反馈统一提交或撤销

三、值得保留:权威目标与本地表现已经有边界

DS 发送已解析目标,而不是让每个客户端重跑选敌;客户端再按本地角色与网络身份决定是否播放镜头和声音,说明玩法事实和表现投影已经初步分离。专服不加载表现资产,也是正确成本边界。

不同效果能声明执行域,方向也正确;需要升级的是“角色过滤”到“明确 Audience Policy”,以及“效果数组索引”到稳定 Cue 身份。

四、结构性缺陷:没有关联 ID 就没有业务幂等

Reliable 保证网络层按连接送达,不保证业务事件只执行一次。重试、重连、Actor 延迟物化和预测确认都需要事件身份。没有 EventId 时,动画可能已确认而音频重复播放;没有可取消句柄时,Reject 只能停止“当前效果”,误伤后来开始的效果。

表现参数由硬编码资产路径和本地数组索引解释,也无法进行版本校验、可访问性替换和平台降级。设备震动、减少镜头晃动、闪光强度等用户设置若散落在效果代码里,更不可能保持一致。

五、目标设计:Presentation Transaction 与通道 Adapter

DS 输出 PresentationEvent:EventId、SourceGeneration、ServerTime、Phase、Outcome、TargetIds、CueTag、参数版本、Audience 与 TTL。本地预测先以 PredictionKey 创建事务;Confirm 将预测句柄升级为权威,Correct 调整参数,Reject/Cancel 只终止该事务拥有的句柄。

编排器按通道调用 Animation、Camera、UI、Audio、VFX、Haptics Adapter。Adapter 返回可撤销 Handle,并统一应用平台能力与可访问性 Profile。EventId 去重窗口处理重复消息;目标未物化时只在 TTL 内等待,过期丢弃并记录原因。

void Reconcile(const PresentationEvent& e)
{
    if (dedupe.Seen(e.eventId) || e.IsExpired(now)) return;
    Transaction& t = FindByPredictionOrCreate(e.predictionKey, e.eventId);
    if (e.outcome == Rejected) t.CancelOwnedHandles();
    else t.CommitOrCorrect(e, accessibilityProfile, platformCaps);
    dedupe.Mark(e.eventId);
}

六、决策矩阵:按时间语义选择反馈路径

反馈本地预测DS 确认可撤销晚加入
输入按压/UI 提示是通常否是否
起手动画/轻音效是是是否
命中 VFX/伤害数字可预热,不提交必须是否
镜头震动/设备反馈是按结果纠正必须否
持续 Buff 外观可预测必须必须从 State 恢复
死亡/占领等世界结果否或弱预测必须由 State 纠正必须恢复状态

评测应记录 Input-to-Predicted、Command-to-Confirm、Correction Duration、Duplicate Suppression 和 Cancel Completion。技术目标不是所有反馈零延迟,而是不同延迟下始终能确认、纠正并解释。