player update optimized
This commit is contained in:
@@ -17,6 +17,8 @@ import engine.objects.PlayerCharacter;
|
||||
import engine.objects.PlayerCombatStats;
|
||||
import org.pmw.tinylog.Logger;
|
||||
|
||||
import java.util.concurrent.*;
|
||||
|
||||
public class UpdateThread implements Runnable {
|
||||
|
||||
private volatile Long lastRun;
|
||||
@@ -27,36 +29,45 @@ public class UpdateThread implements Runnable {
|
||||
}
|
||||
|
||||
|
||||
private static final long INSTANCE_DELAY = 1500; // Adjust as needed
|
||||
|
||||
public void processPlayerUpdate() {
|
||||
ExecutorService executor = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors());
|
||||
|
||||
try {
|
||||
for(PlayerCharacter player : SessionManager.getAllActivePlayerCharacters()){
|
||||
for (PlayerCharacter player : SessionManager.getAllActivePlayerCharacters()) {
|
||||
if (player != null) {
|
||||
player.update(true);
|
||||
Future<?> future = executor.submit(() -> {
|
||||
try {
|
||||
player.update(true);
|
||||
} catch (Exception e) {
|
||||
Logger.error(e);
|
||||
}
|
||||
});
|
||||
|
||||
try {
|
||||
future.get(10, TimeUnit.SECONDS); // Enforce max execution time
|
||||
} catch (TimeoutException e) {
|
||||
Logger.error("Player update timed out for: " + player.getName());
|
||||
future.cancel(true); // Attempt to cancel the task
|
||||
} catch (Exception e) {
|
||||
Logger.error(e);
|
||||
}
|
||||
}
|
||||
}
|
||||
} catch (Exception e) {
|
||||
Logger.error("UPDATE ERROR",e);
|
||||
Logger.error("UPDATE ERROR", e);
|
||||
} finally {
|
||||
executor.shutdown();
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void run() {
|
||||
lastRun = System.currentTimeMillis();
|
||||
while (true) {
|
||||
if (System.currentTimeMillis() >= lastRun + instancedelay) { // Correct condition
|
||||
this.processPlayerUpdate();
|
||||
lastRun = System.currentTimeMillis(); // Update lastRun after processing
|
||||
}else {
|
||||
try {
|
||||
Thread.sleep(1500); // Pause for 1500ms to reduce CPU usage
|
||||
} catch (InterruptedException e) {
|
||||
Logger.error("Thread interrupted", e);
|
||||
Thread.currentThread().interrupt();
|
||||
}
|
||||
}
|
||||
Thread.yield();
|
||||
try {
|
||||
processPlayerUpdate();
|
||||
} catch (Exception e) {
|
||||
Logger.error("Thread Execution Error", e);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user