From d2d236aa93126f705fc970ea3d5782a41cfacf5e Mon Sep 17 00:00:00 2001 From: FatBoy-DOTC Date: Sun, 16 Feb 2025 17:40:08 -0600 Subject: [PATCH] player update optimized --- src/engine/workthreads/UpdateThread.java | 49 +++++++++++++++--------- 1 file changed, 30 insertions(+), 19 deletions(-) diff --git a/src/engine/workthreads/UpdateThread.java b/src/engine/workthreads/UpdateThread.java index e29a4807..411fd3cd 100644 --- a/src/engine/workthreads/UpdateThread.java +++ b/src/engine/workthreads/UpdateThread.java @@ -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); } }