
喜报!!Darkwood 联机框架首次完成主机与远端互联
今天!!我的联机框架迎来了一个里程碑式的进展!!!主机和远端可以互联了!!!!
之前测试基本都是在自己电脑上双开。虽然也能连接,也能收发消息,但本机双开和两台真实电脑联机毕竟不是一回事,很多网络问题只有换到真正的远端环境里才会暴露出来。
这次找了另一台电脑,通过 Radmin VPN 组了一个虚拟局域网。主机用默认的端口启动,另一台电脑直接填写 Radmin 的 IP 地址连接。
连接成功以后,主机会读取当前正在玩的存档,把它压缩成一个快照,再分成很多小块发给客户端。这次测试的存档大概有 5 MB,客户端下载完成后会自动写入独立的联机存档目录,然后加载主机的存档。
再然后就是主机开服、客户端连接、下载存档、加载存档,然后进入同一个世界!!
终于终于,我修改了无数次的代码,两端终于连接起来了。
这次还顺便把玩家身份分配跑了一遍。主机是 P0,第一个加入的客户端是 P1,以后继续加入就是 P2、P3。这个编号看起来没什么特别的,但之后同步位置、动画、背包和场景交互,都得靠它判断到底是谁在操作,不然两台电脑上的本地玩家对象很容易互相覆盖。
玩家状态同步目前走的是主机权威的思路。客户端只负责发送自己的位置、方向和动作,主机收到以后做一下检查,再转发给其他玩家。其他电脑不会直接照搬收到的位置,而是稍微做一点插值,尽量避免远端玩家走路时一顿一顿的。
远端玩家模型现在也已经能创建了,不过显示效果还在调。
目前可以说“远端玩家对象已经有了”,但还不能说“远端玩家已经完整显示了”。有时候连接成功以后模型没有生成,有时候能生成,但动画或者手上的东西没有同步。这个部分应该还要继续磨一阵。
联机以后,箱子肯定不能像单机那样由每台电脑各自修改。否则两个人同时打开一个箱子,很容易各拿走一次同样的物品,最后直接变成复制物品。
现在的处理方式是给每个容器加一个库存版本号。客户端想拿东西时,会把自己看到的版本一起发给主机。主机确认版本没有过期以后才真正修改库存,然后把新结果广播给所有玩家。如果两个人几乎同时拿同一个东西,后到的请求就会因为版本不一致被拒绝,再用主机的正确状态覆盖回来。
实际测试以后,问题当然也出来了一大堆。
目前最明显的是客户端进入存档以后偶尔会突然断开。有些连接虽然还在,但远端玩家模型没有生成。切换场景以后,玩家状态包也可能莫名其妙停止发送。实体捕获模块里还有一些空引用警告,一旦开始重复刷,日志文件很快就会变得特别大。
箱子、地面物品、工作台、门和敌人这些东西,也还没有全部接进新的主机权威系统。特别是敌人 AI,之后必须只让主机真正运行,客户端只显示主机发来的结果,不然两边的敌人各自寻路、各自攻击,场面肯定会越来越乱。
现在这些问题不重要,重要的是我的联机框架搭起来了!!。我们Darkwood玩家不只是能在自己的电脑上自娱自乐了,两台真实电脑通过 Radmin VPN等方式建立连接,然后一同游玩和探索,阴暗的森林里不再是孤单的一个人。
接下来先把进入世界后偶发断线的问题处理掉,然后继续完善 P0、P1 的状态广播和远端模型。等玩家本身稳定以后,再慢慢把共享箱子、掉落物、门、工作台和敌人 AI 接进来。
历经千辛万苦,我的联机框架有了底座。后面虽然还有很多问题需要解决,但那些都是小事,可以慢慢修。
今天真是值得庆祝的一天~(゜-゜)つロ 干杯~
GitHub 评论登录尚未配置完成
缺少:Client ID、评论仓库名、仓库所有者、管理员账号。 请在博客管理器的“评论系统配置”中填写 GitHub OAuth App 和评论仓库信息后重新部署。
