大家好!

过去几个月里,我一直在为我的3D格斗游戏Rasen开发网络代码,我想与大家分享我的经验。

Unreal Engine系统

尽管我从一开始就知道GGPO网络代码,但我被工作量吓住了。因此,我开始使用延迟网络,之后尝试了Unreal的Character Movement Component,使用了Unreal Mover,并且在其基础上构建了一些自定义网络解决方案。

然而,这些方法都不能满足我这个快速、回避、重击等元素的游戏所需。

即使在低延迟的情况下,网络延迟也会显得非常高,或者会出现可见的校正和脱同步的动画。我的自定义动画同步也会与CMC的内置根动画同步和重击冲突,重击特别糟糕。

GGPO回滚网络代码

在尝试这些系统的过程中,我了解到了更多关于GGPO解决方案的知识。没有其他选择,我最终决定在Unreal Engine中实现自己的GGPO回滚架构,包括自定义的可预测物理和运动。

幸运的是,游戏已经被开发为离线玩法,因此我知道需要模拟什么。从一开始,我一直在尝试保持一切轻量、可预测和预计算的 wherever 可以。

经过约2个月的工作,经历了输入预测错误、运动错误和找到一种方法来烘焙并存储3D武器碰撞数据的困难,我终于成功了。

我惊讶于模拟的成本是:\~0.01ms 每个模拟 tick 与 8 个角色。快照大小似乎也很小:\~0.04 KB 每个角色。

结果 & 反思

游戏现在支持GGPO-style回滚网络代码,允许8个玩家同时在线游玩,保持控制响应即使在高延迟、抖动和数据丢失的情况下。

这是我到目前为止最具挑战性的系统。尽管最初很吓人,但最终它成为了我工作过的最有趣和最有成就感的系统。

我也制作了一个Youtube Devlog,展示了在各种压力测试下的游戏玩法,包括一些性能统计。

希望这会鼓励您尝试在您的游戏中实现自己的回滚网络代码,如果您的游戏遇到类似的问题。