3 分•作者: bsommerfeld•1 天前
一切始于无人机。我和我的联合创始人当时正在开发一个 Minecraft 插件,无人机需要在未加载的区块中导航——这些地形甚至还不存在于内存中。现有的库都没有相关的概念,导致无人机被困在“不存在”的地方。<p>起初,我们自己构建了一个,代码很粗糙,而且与 Minecraft 的 API 紧密耦合。但在开发过程中,我们意识到:问题不在于 Minecraft,而在于 Java 寻路的一般构建方式——以对象为主、对垃圾回收不友好,并且默认是单线程的。<p>于是我拆分了这个项目。核心部分独立出来,成为一个单独的项目:纯 Java 8+,为了兼容性,它使用零分配的原始堆,而不是理论上最优的斐波那契堆,因为指针追逐和缓存未命中是不可接受的。100% 异步,即使在单线程、厌恶异步的 Minecraft 地狱中也是如此,并且有一个处理器管道提供完全的扩展性。没有游戏引擎,但可以适应你的环境。<p>有时候,需要优化的不是算法本身,而是它所处的环境。Pathetic 充满了这些微优化:在昂贵的闭集检查之前进行 BloomFilter 查找,使用多指标平方启发式来消除 Math.sqrt() 的开销,以及将 3D 坐标位打包成单个原始 long 类型。为了让 Java 变得快速,你需要像对待 C++ 一样对待它。<p>结果:在约 7 毫秒内完成 1 万条并发路径,而大多数库会默默地崩溃。在不膨胀堆的情况下,完成 2 万距离的路径(相当于 10 万多个节点)大约需要 60 毫秒。
README 是一种……选择。去评价它吧,因为它也会这样评价你。