Avatar

colorfulbird3

INITIALIZING SYSTEM

封面

DMF0.8.9开发日志

2026-08-17 10:15:22
# Darkwood
# 开发记录
# 多人联机

DMF0.8.9开发日志

  1. 8.8 和 0.8.9 刚刚做完,趁着没志愿者帮忙测试( ;∀;)的空档,把这段时间干的事记一笔。




  1. 8.8 的主题是运行时实体。之前在 alpha.20 真机测试的时候发现过:主机快照 755 个对象,客户端只能绑定 753 个,少的那两个是乌鸦群和动物尸体。这类东西不在存档里,是游戏运行时生成的,客户端只靠加载主机存档根本拼不出来。当时只能宽容处理,缺失比例小就跳过,先进游戏再说。0.8.8 就是补这个欠账。




协议里加了两条消息:RuntimeEntitySpawn 和 RuntimeEntityDespawn。ID 只能由主机分配,整个会话单调递增,销毁过的编号绝不复用,不然晚到的 Despawn 包会把新生成的对象误杀。注册表也拆开了,持久实体和运行时实体分开管。




第一版只挑了掉落物做最小闭环:主机丢个东西,客户端看到它出现,主机捡走,客户端看到它消失。这条链路跑通之后才做的敌人。敌人还是老规矩:主机跑 AI、寻路、血量、攻击,客户端只有一个代理,跟着 15Hz 的状态插值移动,自己什么都不算。敌人死了就发 Despawn,有尸体和掉落就接着 Spawn。

场景切换和热加入也在这个版本里做了。切场景先发 SceneChangeBegin,把动作、实体、背包、战斗的消息全部暂停,两边都加载完、注册表重建稳定之后,再发一份运行时快照,最后 SceneReady。切场景期间旧场景的包直接丢。热加入靠快照恢复,晚进来的玩家能看到当前活着的所有运行时实体。




还有一个单独的问题。信任模式之下,两个客户端同时开同一个柜子各拿各的,主机收到两份状态都直接应用,物品就被复制出来了。没有退回审批制,而是给容器加了个乐观版本号:客户端操作前记下当前版本,上报时带上期望版本,主机对得上就接受,对不上就回发最新状态让客户端刷新。还是本地即时操作,只是冲突的时候纠正一下。




  1. 8.9 基本没加玩法,全是工程上的事。服务拆了一轮,PlayerService、CombatService 独立出来,SaveState 也改成了行为化,进度上报收敛到一个入口。传输层做了抽象,加了 FaultInjectingTransport,可以故意丢包、延迟、重复、断线、损坏数据,专门测异常路径,顺手修了断开时重复触发事件的问题。wire 格式没动,不存在版本兼容问题。

测试这边:单元测试 24 项,SelfTests 81 项,回环自测的完整链路(握手、存档、快照、READY)都过。




现在双机验证还在跑。等 0.8.8/0.8.9 的实机矩阵跑完,剩下的是 xUnit 全量迁移、RuntimeEntityService 收拢、UDP-KCP 评估,再往后就是 0.9.0,恢复加玩法。

GitHub 评论登录尚未配置完成

缺少:Client ID、评论仓库名、仓库所有者、管理员账号。 请在博客管理器的“评论系统配置”中填写 GitHub OAuth App 和评论仓库信息后重新部署。