反馈编排:一次 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。技术目标不是所有反馈零延迟,而是不同延迟下始终能确认、纠正并解释。