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...