高性能 Minecraft 史莱姆区块(Slime Chunk)查找器,Rust 实现。
算法原型采用「行分片 + 列缓存 + N 行/u64 位打包」,掩码定义与
slimy 对齐:每行是一个 (2r+1) × (2r+1)
的圆盘窗口,中心对齐,可排除内圈。
- 位打包:每个
u64打包 N 行(默认 N=3),约束N × (2r+1) ≤ 64; N 与掩码维宽为编译期常量(const generic 特化),热路径循环全展开。 - Residue 掩码计数:按候选
base mod N选择掩码布局,每字一次popcount,无需逐行逐格计数。 - Eager 垂直填充:垂直步在「组首行」一次填整个 N 行组,其余 N-1 步跳过。
- 多线程行分片:按
band_height切分 z 轴,线程间无共享状态。 - 与 slimy 判定语义一致:复刻 Java 的整数溢出语义(
wrapping_*), 并支持exclude_inner开关(true = slimy 圆环,false = 实心圆)。
需要 Rust 2021+(edition = "2021"),无外部依赖,离线即可构建:
cargo build --release产物位于 target/release/slipet。
slipet [选项]| 选项 | 默认值 | 说明 |
|---|---|---|
--search-radius <n> |
10000 |
搜索半径 R(半开区间,候选范围 [−R, R),每轴 2R 格) |
--radius <n> |
8 |
史莱姆掩码半径 r(掩码 (2r+1)×(2r+1)) |
--threads <n> |
16 |
线程数 |
--eager |
开 | 启用 eager 垂直填充 |
--no-eager |
— | 关闭 eager,逐行填充 |
--iters <n> |
1 |
每轮重复次数,取最快一轮 |
--ab |
关 | AB 对比 eager / non-eager 两种模式 |
--exclude-inner |
开 | slimy 圆环(排除内圈,1 < d² ≤ r²) |
--filled |
— | 实心圆(d² ≤ r²,含内圈) |
--band-height <n> |
自动 | 列缓存分片高(0 = 按预算/线程数推导) |
--rows-per-word <n> |
3 |
每个 u64 打包的行数(需满足 N × (2r+1) ≤ 64 且有编译期特化) |
示例:
# 默认参数跑一轮(半径 10000、8 格史莱姆掩码、16 线程)
slipet
# 更大范围、指定线程数
slipet --search-radius 20000 --radius 8 --threads 16
# eager 与非 eager 对比
slipet --ab --iters 3
# 实心圆掩码,自定义打包行数
slipet --filled --rows-per-word 4 --radius 7输出示例(--ab 模式会额外打印两者相对差异):
eager: radius=10000 threads=16 0.5s -> 400M 候选/s (每线程 25M/s, ~168 周期/候选 @4.2GHz)
cargo test测试覆盖:与逐格计算参考实现对拍、eager 与非 eager 一致性、多线程与单线程
一致性、exclude_inner 切换的计数差异,以及超出打包约束时的 panic 行为。
matches_slimy_oracle 以本地 slimy.exe 作为裁判进行逐候选对照(固定半径
8)。可通过 SLIMY_EXE 环境变量指定路径;找不到该可执行文件时测试自动跳过,
因此 CI 三端均可通过。