24次发布
0.7.1 | 2024年7月20日 |
---|---|
0.6.5 | 2024年7月9日 |
0.6.2 | 2022年8月11日 |
0.6.0-alpha.4 | 2022年7月13日 |
0.2.0 | 2019年8月18日 |
#19 in 游戏开发
907 每月下载
用于 26 个Crate (13 直接)
1MB
20K SLoC
基本示例
use shipyard::{Component, IntoIter, View, ViewMut, World};
#[derive(Component)]
struct Health(u32);
#[derive(Component)]
struct Position {
x: f32,
y: f32,
}
fn in_acid(positions: View<Position>, mut healths: ViewMut<Health>) {
for (_, health) in (&positions, &mut healths)
.iter()
.filter(|(pos, _)| is_in_acid(pos))
{
health.0 -= 1;
}
}
fn is_in_acid(_: &Position) -> bool {
// it's wet season
true
}
fn main() {
let mut world = World::new();
world.add_entity((Position { x: 0.0, y: 0.0 }, Health(1000)));
world.run(in_acid);
}
小型游戏示例
灵感来自Erik Hazzard的矩形吞噬者。
目录
名字的由来
装配线接受输入,在每个步骤处理,然后输出结果。只要它们不相互干扰,就可以有多个并行工作。
像威尼斯造船厂这样的造船厂是成功的大型规模工业装配线的最古老例子之一。它的成功足以每天输出一艘完全完成的船只。
Shipyard是一个你可以用来构建自己的高度并行软件流程的项目。
动机
我最初想创建一个ECS来学习它是如何工作的。在一次失败的尝试和一些研究之后,我开始着手开发Shipyard。
Specs 已经作为首选的Rust ECS而确立,但我认为我可以做得更好,并选择了 EnTT 的核心数据结构 (SparseSet
) 和分组模型。一个非常灵活的组合。
Cargo功能
- parallel (默认) — 启用工作负载线程和添加并行迭代器
- proc (默认) — 从
shipyard_proc
重新导出宏,主要用于推导Component
- serde1 — 使用 serde 添加(反)序列化支持
- std (默认) — 允许Shipyard使用标准库
- thread_local — 添加与
!Send
和!Sync
组件协同工作的方法和类型 - tracing — 报告工作负载和系统执行
许可证
许可证为以下之一
- Apache License, Version 2.0 (LICENSE-APACHE 或 http://www.apache.org/licenses/LICENSE-2.0)
- MIT 许可证 (LICENSE-MIT 或 http://opensource.org/licenses/MIT)
任选其一。
贡献
除非你明确说明,否则根据 Apache-2.0 许可证定义的任何贡献,有意提交给作品,将按上述方式双重许可,不附加任何额外条款或条件。
依赖关系
~1–1.7MB
~27K SLoC