After read short-range path source code deeply. I found a small problem which maybe cause performance degradation. The root cause is current algorithm can't discard non-silhouette points. I also read some books. In GPG2 "Optimizing Points-of-Visibility Pathfinding", it mentioned two optimizations: "Optimization #1": Only Consider Paths to Silhouette Points "Optimization #2": Only Consider Paths that Go Around the Corner So "Optimization #1" may be what we are missing. Implement "Optimization #1" is very easy, because there are axis-aligned box. I have written some code in CCmpPathfinder_Vertex.cpp // Check that the new vertex is in the right quadrant for the old vertexif (!(vertexes[curr.id].quadOutward & quad)){ // Hack: Always head towards the goal if possible, to avoid missing it if it's // inside another unit if (n != GOAL_VERTEX_ID) { continue; }}//------------Modified Begin//If this is an axis-aligned shape, discard non-silhouette points easily.if (vertexes[n].quadInward == QUADRANT_BL) if ((vertexes[curr.id].p.X >= npos.X && vertexes[curr.id].p.Y >= npos.Y) || (vertexes[curr.id].p.X <= npos.X && vertexes[curr.id].p.Y <= npos.Y)) continue;if (vertexes[n].quadInward == QUADRANT_TR) if ((vertexes[curr.id].p.X <= npos.X && vertexes[curr.id].p.Y <= npos.Y) || (vertexes[curr.id].p.X >= npos.X && vertexes[curr.id].p.Y >= npos.Y)) continue;if (vertexes[n].quadInward == QUADRANT_TL) if ((vertexes[curr.id].p.X >= npos.X && vertexes[curr.id].p.Y <= npos.Y) || (vertexes[curr.id].p.X <= npos.X && vertexes[curr.id].p.Y >= npos.Y)) continue;if (vertexes[n].quadInward == QUADRANT_BR) if ((vertexes[curr.id].p.X <= npos.X && vertexes[curr.id].p.Y >= npos.Y) || (vertexes[curr.id].p.X >= npos.X && vertexes[curr.id].p.Y <= npos.Y)) continue;//------------Modified Endbool visible = CheckVisibilityLeft(vertexes[curr.id].p, npos, edgesLeft) && CheckVisibilityRight(vertexes[curr.id].p, npos, edgesRight) && CheckVisibilityBottom(vertexes[curr.id].p, npos, edgesBottom) && CheckVisibilityTop(vertexes[curr.id].p, npos, edgesTop) && CheckVisibility(vertexes[curr.id].p, npos, edges);it seems faster than before. Has anyone here could review this code? Sorry for my broken english...