跳转到内容

高级寻路算法

本页介绍 @esengine/pathfinding 提供的高级寻路算法,适用于性能敏感场景。

统一的高性能网格寻路器,支持三种模式切换:

import { createGridPathfinder, GridMap } from '@esengine/pathfinding';
const grid = new GridMap(500, 500);
// fast 模式(默认)- 适合中大地图
const pathfinder = createGridPathfinder(grid, { mode: 'fast' });
// bidirectional 模式 - 适合超大开放地图
const biPathfinder = createGridPathfinder(grid, { mode: 'bidirectional' });
// standard 模式 - 基础 A*
const basicPathfinder = createGridPathfinder(grid, { mode: 'standard' });
const result = pathfinder.findPath(0, 0, 499, 499);
模式适用场景优化策略性能特点
standard小地图基础 A*通用
fast中大地图TypedArray + 版本重置快约 1.5-2x
bidirectional超大开放地图双向搜索大地图快约 2-3x
function chooseMode(width: number, height: number): GridPathfinderMode {
const size = width * height;
if (size < 10000) return 'standard'; // < 100x100
if (size < 250000) return 'fast'; // < 500x500
return 'bidirectional'; // 大型开放地图
}

跳点搜索算法,在开放地图上比 A* 快 10-100 倍。

import { createJPSPathfinder, GridMap } from '@esengine/pathfinding';
const grid = new GridMap(300, 300);
const jps = createJPSPathfinder(grid);
const result = jps.findPath(0, 0, 299, 299);
console.log('搜索节点数:', result.nodesSearched); // 远少于 A*

JPS 通过”跳跃”跳过对称路径,只在以下位置展开节点:

  • 起点和终点
  • 转折点(强制邻居)
  • 跳跃终点
地图类型JPS 优势说明
开放地图10-100x 更少节点效果最佳
障碍物密集3-10x 更少节点仍有优势
迷宫地图1-2x优势较小
// ✅ 适合 JPS
// - 开放草原、沙漠地形
// - 障碍物稀疏的地图
// - 需要高频寻路的场景
// ❌ 不适合 JPS
// - 迷宫类地图
// - 障碍物非常密集
// - 需要非对角线移动

Hierarchical Pathfinding A*,适用于超大地图的分层寻路算法。

import { createHPAPathfinder, GridMap } from '@esengine/pathfinding';
const grid = new GridMap(1000, 1000);
// 创建 HPA* 寻路器
const hpa = createHPAPathfinder(grid, {
clusterSize: 32, // 区块大小
});
// 预处理(构建分层图)
hpa.preprocess();
// 寻路
const result = hpa.findPath(10, 10, 990, 990);
  1. 分区阶段:将地图划分为多个区块 (Cluster)
  2. 构建入口:识别区块之间的通道入口 (Entrance)
  3. 抽象图:建立区块间的连接图
  4. 分层搜索:先在抽象图搜索,再在区块内细化
interface IHPAConfig {
clusterSize?: number; // 区块大小,默认 16
}
区块大小预处理时间搜索速度内存占用
10x10较长较快较高
20x20中等中等中等
40x40较短较慢较低
// ✅ 适合 HPA*
// - 超大地图 (1000x1000+)
// - 地图结构相对稳定
// - 需要大量寻路请求
// ❌ 不适合 HPA*
// - 小地图(预处理开销不值得)
// - 地图频繁变化
// - 单次寻路场景
// 障碍物变化时需要重新预处理
grid.setWalkable(100, 100, false);
hpa.preprocess(); // 重新构建分层图

对重复的寻路请求进行缓存,显著提升性能:

import { createPathCache, createAStarPathfinder } from '@esengine/pathfinding';
const pathfinder = createAStarPathfinder(grid);
// 创建缓存
const cache = createPathCache({
maxEntries: 1000, // 最大缓存条目
ttlMs: 60000, // 过期时间(毫秒)
});
// 带缓存的寻路
function findPathCached(sx: number, sy: number, ex: number, ey: number) {
const key = `${sx},${sy}-${ex},${ey}`;
const cached = cache.get(key);
if (cached) return cached;
const result = pathfinder.findPath(sx, sy, ex, ey);
cache.set(key, result);
return result;
}
策略说明适用场景
完全匹配起点终点完全相同固定目标点(如建筑)
区域匹配起点终点在同一区域大量代理前往相似位置
TTL 过期超时后自动清除地图会变化的场景
需要选择寻路算法?
├── 地图 < 100x100?
│ └── AStarPathfinder 或 GridPathfinder(standard)
├── 地图 100x100 ~ 500x500?
│ ├── 开放地图? → JPSPathfinder
│ └── 有障碍物? → GridPathfinder(fast)
├── 地图 > 500x500?
│ ├── 开放地图? → GridPathfinder(bidirectional)
│ └── 需要大量寻路? → HPAPathfinder
└── 需要不阻塞?
└── IncrementalAStarPathfinder

在 500x500 开放地图上的对角线寻路 (0,0 → 499,499):

算法时间搜索节点数
A*~3ms~500
GridPathfinder(fast)~1.5ms~500
GridPathfinder(bidirectional)~1ms~250
JPS~0.5ms~3
HPA* (预处理后)~0.2ms-

实际性能因地图结构和硬件而异