My A* pathfinding function can reach the endpoint but it often freezes for a few seconds and I am testing it using one object only.
I am using a grid based tilemap.
The construction of the path works fine but it is the path finding that is not working as intended. When it is a simple straight line to the goal, it works without freezing.
I have used the wiki pseudocode as a reference
EDIT: I think I have found the source of the problem but I am unsure of how to solve it. I ran the profiler and I narrowed down the problem but I do not know how to fix it. Any guidance would be appreciated!
Behavior.update takes 99% total with 837ms. Under behavior update, EventSystem.update() with 98.9% total and a time MS of 836.65.
Under EventSystem.update(), the main problem seem to be LogStringToConsole, with its child
StackTraceUtility.PostprocessStacktrace() and StackTraceUtility.ExtractStackTrace()
void startPathfinding(Vector3 startPoint, Vector3 endPoint, Transform someObject,bool Hint) {
var initialPosition = tileMap.getTileCoordinates(startPoint);
endPosition = tileMap.getTileCoordinates(endPoint);
openList.Clear();
closedList.Clear();
Node initialPostionStep = new Node();
initialPostionStep.position = initialPosition;
addIntoOpenList(initialPostionStep); // adds the node into the open list and sorts it by the lowest fScore
do {
var currentStep = openList[0];
openList.RemoveAt(0);
closedList.Add(currentStep);
if (currentStep.position == endPosition) {
// not relevant to problem
}
var adjacentTiles = WalkableAdjacentTiles(currentStep);
foreach (Node adjacentNode in adjacentTiles) {
var moveCost = 1;
var tentativeGScore = currentStep.gScore + moveCost;
var inOpenList = FindInOpenList(adjacentNode);
if (FindInClosedList(adjacentNode) != null) {
print ("In ClosedList");
continue;
}
if (inOpenList == null || tentativeGScore < adjacentNode.gScore) {
adjacentNode.parent = currentStep;
adjacentNode.gScore = tentativeGScore;
adjacentNode.hScore = computeHScore(adjacentNode.position,endPosition);
addIntoOpenList(adjacentNode);
} else {
addIntoOpenList(adjacentNode);
}
}
}while (openList.Count > 0);
}
public bool isValidTile(int x, int y) {
if (x > 17 || y > 9 ) {
// Debug.Log("Not a valid Tile " + "x value: " +x + " y value: "+y);
return false;
}
Transform tile = getTileAt(x,y);
if (x < 0 || y < 0 || tile.gameObject.name == "filled") {
return false; }
if (tile == null) {
print ("tile is null for some reason?");
return false;
}
//print ((x) + " value " + (y) + " value");
return true;
}