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