我的游戏只有四个玩家,依然按照设计能力来构建 网络编码,尽管能够支持 2000 人玩家。没有后悔。

我将会完美地打磨打磨打磨打磨,并且从 Pirate Brawl 中我学习到的教训分享如下:

架构(看起来很漂亮,纸上谈兵)

Unity + Photon Fusion 2,宿主认证模式。一个玩家是“主机”。其他人发送输入信号,主机运行模拟,向玩家发送状态。清爽。

我的模拟是纯粹的 C#,完全与 Unity 和 Fusion 解耦。没有物理引擎,我的 GameObject 不运行游戏逻辑。就是:确定性的状态 + 输入 → 下一刻的tick。这是如何做出严肃游戏的。

1 我按 W键 →输入信息送到Fusion
2 Fusion 将输入路由到网络
3 输入到达我的朋友(目前在印度)的计算机
4 印度的朋友机器运行下一个tick
5 结果传回我,跨国运输

好的,所以我的朋友在印度的机器实际物理模拟我的飞船的移动。每次我按按键。

在 800ms 延迟(视频即将到来)发生了什么

欧洲到印度 = 感到延迟,输入延迟,一点点“重量”的控制,总体上控制不灵活。即使很好的网络编码也不能完全掩盖距离。乐极生悲,他是主机,我那边有鼠标震动。当只有 4 个客户端时,不是很奇怪的情况,因为玩家都很享受。

我想了想,然后加了一步本地预测:按下输入 → 飞船移动,即刻。我不需要等待。事实上,我允许一定程度的不一致,但因为我的模拟是确定性的,所以和真实也没多大差距。主机仍然运行真实模拟,真正的状态回来后,我则进行协调。玩家看到立即响应。网络后台慢慢地补偿。我的飞船看起来会在视频中。有时会偶尔抖动,但大部分时候似乎相当响应。

如果没有进行预测会有鼠标震动和每隔几次就断open。这只是因为游戏性质。飞船有惯性,战斗允许宽松的角度,玩家不太注意自己玩家,很少关注远端玩家。所以,这些软性允许了预测。Counter-Strike 会立即崩溃。

我学到了什么

  • “即使有 200 个在线玩家”、
  • 固定数学、
  • 模拟完全解耦,
  • 在两远端玩家感觉差异时,
    都不能被承认。

  • 主机认证网络虽然很便宜,但可能会有真实的用户体验成本。
    并且,确定性的模拟编码是非常值得的。
    如果本地预测的缺失,在很差的网络条件下玩家可能会无法承受。
    距离(延迟)才是真正的敌人,而不是CPU。

我不知道未来的天朝是否会认为将游戏“ Dedicated server ”是可行的呢?当有四个玩家时,我似乎还不足以尝试。
如果你想让我在坏的网络条件下打破它,那么我会很高兴的。