4个版本 (2个重大变更)

0.3.0 2021年12月7日
0.2.1 2021年6月11日
0.2.0 2021年6月8日
0.1.0 2021年6月8日

#923 in 游戏开发


2 crates 中使用

Apache-2.0

8MB
2.5K SLoC

警告:此Crate目前依赖于nightly Rust不稳定和不完整的特性。

crystalorb

无网络限制、高级游戏网络库
用于客户端预测和服务器协调。

crates.io docs.rs ci cd Coverage



快速入门

您可以复制独立 示例作为起始模板,并在此基础上进行构建。您还可以查看crystalorb-mock-networkcrystalorb-bevy-networking-turbulence,既可以直接用于您的项目,也可以作为您集成自己选择的网络层的示例。

如果您更喜欢更直观和交互式的示例,请查看上面的演示,该演示使用Rapier物理引擎。您可以自由地将演示的源代码作为您下一个项目的起始模板。

有关如何实现所需特质的更多信息,请参阅文档

关于

游戏网络很复杂,因为尽管客户端和服务器之间存在显著的延迟,我们通常希望给玩家一种物理模拟在多个游戏客户端之间响应、公平和一致的错觉。解决游戏网络问题有许多不同的方法。CrystalOrb试图实现其中一种方法。

CrystalOrb 是一个年轻的网络库,它实现了

  • 客户端预测。客户端在等待服务器之前立即将本地输入应用于其模拟,从而使玩家的输入感觉更响应。
  • 服务器对账。 服务器运行一个延迟的、权威版本的模拟,并定期向每个客户端发送权威快照。由于服务器的快照表示较早的模拟帧,每个客户端将接收到的快照快速前进,直到它与屏幕上显示的时间戳相匹配。一旦时间戳匹配,客户端将平滑地将它们的状态混合到快照状态中。
  • 显示状态插值。 模拟可以在不同的时间步长运行,而客户端将自动在两个模拟帧之间插值,以获取渲染显示状态。

CystalOrb 尚未 实现“滞后补偿”(根据你对“滞后补偿”的定义),因为CrystalOrb客户端目前仍然在当前模拟所有实体(包括其他玩家)。一些网码客户端更愿意模拟除了本地玩家外的其他实体在过去的状态。两种方法都有优缺点。

  • 通过在当前模拟所有事物,只要没有玩家的输入显著改变模拟的进程,碰撞时间将一致。这可能对物理游戏如...火箭联盟有益。这就是CrystalOrb所做的事情。如果你有两个并排的客户端,并使用左侧客户端为玩家发出“跳跃”命令,那么右侧客户端将在一小段时间后看到跳跃,但两个客户端将在玩家落地时看到完全相同的时间。

  • 通过在过去模拟大多数远程实体,远程实体在客户端中需要很少的校正,因此其他玩家的动作将更自然地响应他们的玩家输入。如果你有两个并排的客户端,并使用左侧客户端为玩家发出“跳跃”命令,那么右侧客户端将不会看到动作中的任何突然变化,但跳跃和落地将在左侧客户端之后稍微晚些时候发生。

注意:您需要自带物理引擎和“中间层”网络层。CrystalOrb只是某种“序列器”,一个封装了多玩家物理游戏同步高级算法的库。CrystalOrb对物理引擎和网络都是不敏感的(只要您能够实现所需的功能)。

CrystalOrb怎么样?

不太可能。这是我第一次做游戏网络,所以请期待它只是外表闪闪发光而没有真正的金子。有关游戏网络的更多信息,您可能更幸运地查看以下内容

是的,那些就是我从那里吸收了大部分游戏网络知识的地方。是的,他们的设计可能比CrystalOrb好得多。

CystalOrb是一个客户端-服务器回滚库,还有其他类型的回滚和网络库您应该查看!以下是一些其他作者在Rust社区中的回滚库,您可能感兴趣

  • GGRS由@gschup创建,是基于GGPO网络SDK的点对点回滚库,还有一个Bevy插件
  • backroll-rs 由 @HouraiTeahouse 提供,是一个基于 GGPO 网络SDK的P2P回滚库,同时还包含一个 Bevy 插件
  • bevy_rollback 由 @jamescarterbell 开发,是为 Bevy 游戏引擎 定制的回滚库。
  • evoke 由 @arcana-engine 提供,是一个具有差分压缩功能的客户端-服务器状态复制库。
  • orb 由 @smokku 开发,研究从 提取 CrystalOrb 的基本部分 到其自己的模块。
  • snowglobe 由 @hastearcade 提供,是 CrystalOrb 的 JavaScript 版本。
  • Bevy 游戏引擎有一个由 @maniwani 正在起草的 网络复制RFC。它包含了关于快速游戏网络技术(即状态复制)的非常 有见地 的信息。

如果你的项目还没有被列出?请随意提交一个 PR 或 提交 一个问题,我会很高兴推广它。

更多示例

  • 演示 由 @ErnWong 提供,仅为两个客户端硬编码(源代码)。
  • orbgame 由 @vilcans 提供,是一个可以接受超过两个客户端的 Bevy 演示。
  • Dango Tribute 由 @ErnWong 提供,是一个具有多人blob物理的 Bevy 交互体验。CrystalOrb 是从该项目中提取出来的网络代码。

如果你的项目还没有被列出?请随意提交一个 PR 或 提交 一个问题,我会很高兴推广它。

不稳定的 Rust 功能

CrystalOrb 目前使用以下不稳定的功能

#![feature(const_fn_floating_point_arithmetic)]
#![feature(map_first_last)]
#![feature(adt_const_params)]
#![feature(generic_associated_types)]

依赖关系