4 个版本
使用旧的 Rust 2015
0.2.2 | 2017年5月18日 |
---|---|
0.2.1 | 2017年5月13日 |
0.2.0 | 2017年5月12日 |
0.1.0 | 2017年5月11日 |
在 算法 中排名 2099
60KB
1K SLoC
Minutae
Minutae 是一个在有限二维宇宙上运行的模拟引擎,宇宙中充满了细胞和实体。它设计为提供模块化系统,可以在其上设计各种类型的模拟。
要查看使用此系统实现的模拟示例,并使用 Emscripten 编译为 Asm.js,请查看 https://ameo.link/fish.html
应用概述
Minutae 引擎分为多个模块,可以组合起来改变模拟的执行方式。整个应用程序设计为充分利用 Rust 类型系统,使得可以在多个不同的实现中使用泛型组件。
该库本身依赖性很低,目前只使用 uuid
库和 num_cpus
库作为并行引擎。这使得轻松将库编译到各种目标;它在浏览器中的 asm.js 和 WebAssembly 目标中都已成功实现。
宇宙
宇宙是包含模拟状态的内核结构。它包含一个包含宇宙所有细胞的大的向量和一个包含所有实体的容器。宇宙始终是正方形,有一个固定的 大小,与长度/宽度相对应(细胞/坐标的数量是 size^2
)。
细胞
宇宙的每个网格都被一个细胞占据。细胞是静态的,不会自行采取任何行动。它们在模拟期间由实体和引擎本身操作。细胞是有状态的,并且在每个模拟周期中可以突变其数据。细胞所持有的确切状态类型是泛型的,由用户的实现定义;一个好的想法是将状态实现为枚举。
实体
实体也位于宇宙的单一坐标中,但与细胞分开处理。多个实体可以占据相同的坐标。在每个周期,宇宙的 实体驱动器 被调用,给定一个实体、该实体的状态以及宇宙的细胞和实体。实体可以尝试执行任何数量的 操作 以改变它们自己的状态或宇宙中其他细胞/实体的状态。
它们有两种状态:静态状态和可变状态。静态状态由宇宙引擎控制,不能被实体直接修改。可变状态在实体模拟时可以直接访问和写入,但宇宙中的其他实体无法访问。
每个实体分配了一个唯一的UUID,可以用它来定位特定实体进行操作。
操作
操作在每个时间步从每个实体收集并存储在缓冲区中,然后由宇宙的Engine
统一应用。有三种类型的操作:单元格操作、自我操作和实体操作;根据它们的名称,它们分别修改不同类型的对象的状态。引擎中预先实现了一些这些操作的实例,如转换实体和删除实体,但大部分实现留给用户来完成。
引擎
引擎负责应用实体返回的操作。由于实体可能会尝试无效的操作,或者两个实体可能会发生冲突,因此引擎需要解决这些问题。
库中提供了两种引擎实现:一种串行引擎和一种并行引擎。它们基本上以相同的方式工作,但并行引擎利用多个线程在宇宙的实体上执行实体驱动程序。
中间件
中间件定义了在每个模拟时间步之间执行的操作。它提供了对整个宇宙的完全可变访问权限,可以用来实现比单个单元格或实体提供更高的粒度级别的各种功能。宇宙由任何数量的中间件对象构建,这些对象依次应用,并可选择在时间步应用前后采取行动。
性能
本引擎的主要目标之一是高效且尽可能降低开销。Rust的零成本抽象使得允许用户定义的状态和操作在整个引擎中使用变得容易,同时避免了任何运行时成本。
在引擎最热的部分使用不安全代码,主要目的是在静态已知大小的情况下避免边界检查,并使并行引擎能够在没有大量生命周期相关问题的前提下工作。
贡献
我非常愿意与对此库感兴趣的人合作,将其适应他们自己的目的或添加额外的功能以满足他们的需求。一如既往,如果您想实现一个功能或进行更改,请打开一个问题,以便我们可以讨论。
依赖
~0.6–0.8MB
~12K SLoC