大家好,
过去几个月,我一直在为我的3D格斗竞技场游戏Rasen开发网络代码,并希望能够分享我的经验。
Unreal Engine系统
尽管我从一开始就知道GGPO网络代码,但我被涉及的工作量吓倒。因此,我开始使用延迟网络编程,然后尝试了Unreal的角色运动组件(Character Movement Component),使用了Unreal Mover,并在其上构建了自定义网络解决方案。
然而,这些解决方案都不是适合这种快节奏、反击、击退等战斗方式的。
即使在低延迟的情况下,也会出现明显的延迟感和出错的动画。另外,我的自定义动画同步与CMC内置的根动画同步和击退功能相冲突,导致问题更加严重。
GGPO回滚网络代码
在尝试各种系统的过程中,我了解了更多关于GGPO解决方案的知识。最终,我决定在Unreal Engine中实现自己的GGPO回滚架构,包括自定义的确定性物理和运动。
幸运的是,游戏已经为离线玩法开发完成,所以我知道需要模拟什么。从一开始,我一直在尝试保持一切尽可能轻量、确定性和预计算。
经过两个月的工作,经历了许多输入预测bug,解决一些运动bug,找到一种方法来烘焙和存储3D武器碰撞数据,我最终成功了。
我惊讶地发现模拟的成本很低:每个8个角色模拟tick大约0.01ms。快照大小似乎也很小,每个角色大约0.04KB。
结果 & 反思
游戏现在支持GGPO-style回滚网络代码,允许8个玩家同时玩,保持控制响应,即使在高延迟、抖动和数据丢失的情况下。
这是我开发过的最具挑战性的系统。尽管最初感到恐惧,但它最终成为我工作过的最有趣和最有成就感的系统之一。
我还制作了一个[Youtube Devlog](https://youtu.be/7O7Tol3Ymvo),展示了在各种压力测试下的游戏玩法,包括一些性能统计。
希望这会鼓励你尝试自己实现回滚网络代码,如果你的游戏遇到类似问题。
评论 (0)