ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Lighthouse Vile Holes 同步机制:联机时怪物 AI 如何保持一致?新手完整指南

Lighthouse Vile Holes 同步机制:联机时怪物 AI 如何保持一致?新手完整指南 Lighthouse Vile Holes 同步机制联机时怪物 AI 如何保持一致新手完整指南【免费下载链接】Lighthouse项目地址: https://gitcode.com/GitHub_Trending/lighthouse26/Lighthouse在Lighthouse《Banjo-Kazooie》社区重编译移植版中联机模式最棘手的难题之一是Mr. Vile 小房间里的Vile HolesYumblie/Grumblie 食洞小游戏充满随机事件——食物块随机冒出、躲藏、被吃掉。如果每位玩家的本地电脑各自随机联机画面必然对不上。Lighthouse 的Anchor 联网层用权威客户端 事件流 快照校正三件套让所有玩家看到的怪物 AI 完全一致。本文带你快速看懂这套联机同步机制的设计思路。为什么联机同步要特殊处理怪物 AI单机的 Mr. Vile 小房间BGS 地图里食物块何时冒出、出现在哪个洞、Mr. Vile 如何移动全部由本地代码随机驱动。一旦多人同时进入随机性发散A 玩家的洞 3 冒出了食物B 玩家的洞 5 才冒画面立刻不同步判定分歧两人同时咬chomp同一个食物块谁算成功中途加入后加入的玩家怎么追上当前局面Lighthouse 的解法是房间里只有一个权威Authority其他人全部听从它。权威模型谁开局谁说了算在 Anchor 联网层中与小游戏交互的规则非常直观谁先与 Mr. Vile 对话开一局谁就成为本局的权威客户端。它运行原版完整的小游戏逻辑并把状态变化广播给全图其他玩家被称为跟随者Follower它们会主动关闭本地的随机逻辑只应用收到的网络数据。这一规则写在 VileSync.h 的协议注释中而关闭本地随机的具体位置在 HookHandlers.cpp——那里通过钩子函数依次禁用了食物块冒出、躲藏、游戏刷新、CPU AI 等行为回调VB_VILE_YUMBLIE_EMERGE、VB_VILE_CPU_AI等。一句话理解单机时 25 个洞各自为政联机时只有一台电脑在掷骰子。25 个洞如何获得跨玩家统一身份网络包不能传坐标因为每个洞的坐标在客户端之间并不完全一致。Lighthouse 的做法是洞的身份 编号而不是位置。25 个洞是地图数据中固定的 NodeProp呈棋盘格排布所有玩家机器上位置完全相同VileHoles.h 定义了枚举VileHoleId每个洞按整数坐标命名如VILE_HOLE_XN798_Z297表示 x-798, z297 的洞收到洞 7 变化这类消息时VileSync.c 再用VileHoles_GetPosition反查坐标、就近匹配到本地的 yumblie 实体容差 100 单位。这样一来网络包只需传一个 1 字节的洞编号轻量且绝对不会错位。四类同步包事件流如何拼出完整对局协议总览同样见 VileSync.h 开头的注释核心是四种包包名方向作用VILE_HOLE_STATE权威 → 全图某个洞的状态变化冒出/躲藏/被吃事件流主力VILE_EAT_REQUEST跟随者 → 权威本地玩家咬了食物请权威校验VILE_UPDATE权威 → 全图每帧流式同步 Mr. Vile 的位置与动画模式VILE_GAME_STATE权威 → 全图周期性全量快照幂等校正 迟到玩家追平几个值得新手注意的设计点 单调序号旧消息无法回滚新状态权威发出的每个包都携带自增seq序号。接收端通过 VileSync.c 中的VileSync_AcceptIncomingSeq做拦截——序号不比上次新就直接丢弃。这样网络乱序、重发都不可能造成洞刚被吃掉又自己冒出来的回退混乱。包的定义可参考 VileHoleState.cpp。✅ 咬食物先请求后确认跟随者玩家咬到食物时本地判定被钩子拦下转而发出VILE_EAT_REQUEST见 HookHandlers.cpp。权威端校验是否合法洞是否存在、类型对不对成功后才广播被吃状态并回报请求方播放正确的咀嚼动画与音效VileSync_PlayLocalEatFeedback。双方不会各自判定杜绝你觉得吃到、我觉得没吃到。 周期快照漂移修复 迟到玩家兜底事件流快但有漏。权威会定期把整个小游戏控制器状态回合数、双方分数、沙漏计时、25 个洞各自的状态/类型打包成VileGameSnapshot结构定义见 VileSync.h广播。接收端VileSync_ApplyGameSnapshot只做幂等修正洞若与快照一致就绝不打扰让它继续由事件流驱动动画只有真正漂了的洞才被强制掰正。中途加入的玩家靠几帧快照即可追平全场。权威切换掉线了怎么办如果权威玩家中途离开、或夺权判定失败VileSync_OnAuthorityChangedVileSync.c会触发三件事重置双方的序号计数器避免新旧权威的序号互相干扰非权威玩家把自己本地正在进行的回合回卷到空闲态等待新权威的第一批快照从干净的基线重建画面。这套换权威 重开基线的策略牺牲一点连续性换取绝对一致是联机小游戏同步里非常稳妥的选择。关键文件速查想继续深挖建议按这个顺序阅读源码协议设计与注释最好的说明书VileSync.h洞编号与坐标表VileHoles.h序号校验与状态应用VileSync.c事件钩子与包处理HookHandlers.cpp、VileHoleState.cpp原版小游戏逻辑的网络入口chyumblie_net*/chMrVile_net*系列函数yumblie.c、mrvile.c、mrvileminigame.c编译运行环境可按 docs/BUILDING.md 与 README.md 的说明配置。小结Lighthouse 的 Vile Holes 联机同步没有用复杂的一致性算法而是三个朴素但有效的套路单一权威随机只掷一次其余客户端禁用自己的随机逻辑事件流 单调序号低延迟传递每个状态变化旧包自动作废周期全量快照幂等地修漂移、喂迟到者兼做权威切换后的基线。这套模式同样适用于其他随机性小游戏读懂它你就掌握了 Lighthouse 乃至 Anchor 联网层最典型的同步范式。【免费下载链接】Lighthouse项目地址: https://gitcode.com/GitHub_Trending/lighthouse26/Lighthouse创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表