Switch pathfinder refresh to timestamp-based interval (#11482)

This commit is contained in:
Jakub Jagiello
2025-12-22 21:21:30 +01:00
committed by GitHub
parent d88c3f7f33
commit 1c917da75c

View File

@@ -106,6 +106,10 @@ public class Pathfinder implements Runnable{
IntSeq tmpArray = new IntSeq(); IntSeq tmpArray = new IntSeq();
boolean needsRefresh; boolean needsRefresh;
/** Last time flowfields were refreshed, for timestamp-based refresh interval. */
private long lastRefreshTime;
/** Minimum interval between flowfield refreshes in milliseconds. */
private static final long refreshIntervalMs = 100;
public Pathfinder(){ public Pathfinder(){
clearCache(); clearCache();
@@ -182,29 +186,31 @@ public class Pathfinder implements Runnable{
}); });
Events.run(Trigger.afterGameUpdate, () -> { Events.run(Trigger.afterGameUpdate, () -> {
//only refresh periodically (every 2 frames) to batch flowfield updates if(!needsRefresh) return;
//TODO: is it worth switching to a timestamp based system instead that updates every X milliseconds?
if(needsRefresh && Core.graphics.getFrameId() % 2 == 0){
needsRefresh = false;
//can't iterate through array so use the map, which should not lead to problems long now = Time.millis();
for(Flowfield path : mainList){ if(now - lastRefreshTime < refreshIntervalMs) return;
//paths with a refresh rate should not be updated by tiles changing
if(path != null && path.needsRefresh()){ lastRefreshTime = now;
synchronized(path.targets){ needsRefresh = false;
//TODO: this is super slow and forces a refresh for every tile changed!
path.updateTargetPositions(); //can't iterate through array so use the map, which should not lead to problems
} for(Flowfield path : mainList){
//paths with a refresh rate should not be updated by tiles changing
if(path != null && path.needsRefresh()){
synchronized(path.targets){
//TODO: this is super slow and forces a refresh for every tile changed!
path.updateTargetPositions();
} }
} }
//mark every flow field as dirty, so it updates when it's done
queue.post(() -> {
for(Flowfield data : threadList){
data.dirty = true;
}
});
} }
//mark every flow field as dirty, so it updates when it's done
queue.post(() -> {
for(Flowfield data : threadList){
data.dirty = true;
}
});
}); });
} }