Here are the two main files:
Path: https://pastebin.com/ZkrbJ78t
AStar: https://pastebin.com/EVGazFtU
A few things I've done to optimize the search:
1. Rather than a dictionary to keep track of scores and parents, I use a 2d array of objects that are mapped to the grid i.e. [x,y] represents grid point (x,y). Objects have F,G,H and Parent fields, these fields are reset to default values during each search.
2. Cheap weighted heuristic
3. Orthogonal neighbors (searching 4 neighbors rather than 8)
Paths don't have to be beautiful because the point reduction smooths them out quite nice.
In Path.cs you can see the two functions to reduce points, Incremental and Stretch. Stretch is much faster because it has the potential to reduce points all the way to the end right off the bat or early on thus reducing calls to the LineOfSight function, but it isn't so reliable around small areas/corners. The incremental function is reliable but it calls to the LineOfSight function for each and every point along the path, this causes the path reduction to be just about as slow as calculating the path itself.
Line of Sight is determined by getting all points between 2 points and checking that they are all flagged as Walkable.
My grid is dynamic and roughly 250x250. I tried out Theta* and JPS, both were slower than my current A*. I'm trying to avoid using a navmesh or worker thread, I suppose mostly just looking for ideas to tighten up my code