From 36d2271b3510f52c88c02374d5916706bdef6e99 Mon Sep 17 00:00:00 2001 From: austin Date: Fri, 29 Nov 2024 11:52:07 -0500 Subject: [PATCH] convert server physics cell generation to executor --- docs/src/progress/renderertodo.md | 1 + .../engine/threads/ThreadManager.java | 3 ++ .../datacell/GriddedDataCellManager.java | 35 ++++++++++++------- .../datacell/ViewportDataCellManager.java | 5 +++ .../datacell/interfaces/DataCellManager.java | 5 +++ 5 files changed, 36 insertions(+), 13 deletions(-) diff --git a/docs/src/progress/renderertodo.md b/docs/src/progress/renderertodo.md index 9bcce1ea..262c1375 100644 --- a/docs/src/progress/renderertodo.md +++ b/docs/src/progress/renderertodo.md @@ -1167,6 +1167,7 @@ Fix particles not spawning in correct positions (11/28/2024) Fix block not firing Fix reentrant locking bug +Convert server physics cell generation to executor service # TODO diff --git a/src/main/java/electrosphere/engine/threads/ThreadManager.java b/src/main/java/electrosphere/engine/threads/ThreadManager.java index e09aff98..5ef976fb 100644 --- a/src/main/java/electrosphere/engine/threads/ThreadManager.java +++ b/src/main/java/electrosphere/engine/threads/ThreadManager.java @@ -122,6 +122,9 @@ public class ThreadManager { if(realm.getServerWorldData() != null && realm.getServerWorldData().getServerBlockManager() != null){ realm.getServerWorldData().getServerBlockManager().closeThreads(); } + if(realm.getDataCellManager() != null){ + realm.getDataCellManager().halt(); + } } } diff --git a/src/main/java/electrosphere/server/datacell/GriddedDataCellManager.java b/src/main/java/electrosphere/server/datacell/GriddedDataCellManager.java index a9a7b4ce..ecf03485 100644 --- a/src/main/java/electrosphere/server/datacell/GriddedDataCellManager.java +++ b/src/main/java/electrosphere/server/datacell/GriddedDataCellManager.java @@ -8,13 +8,14 @@ import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.Set; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; import java.util.concurrent.Semaphore; import org.joml.Vector3d; import org.joml.Vector3i; import electrosphere.engine.Globals; -import electrosphere.engine.threads.LabeledThread.ThreadLabel; import electrosphere.entity.Entity; import electrosphere.entity.EntityUtils; import electrosphere.entity.ServerEntityUtils; @@ -56,6 +57,11 @@ public class GriddedDataCellManager implements DataCellManager, VoxelCellManager */ static final int UNLOAD_FRAME_THRESHOLD = 100; + /** + * Used for generating physics chunks + */ + static final ExecutorService generationService = Executors.newFixedThreadPool(4); + /** * Tracks whether this manager has been flagged to unload cells or not */ @@ -568,21 +574,17 @@ public class GriddedDataCellManager implements DataCellManager, VoxelCellManager * @param worldPos */ private void runPhysicsGenerationThread(Vector3i worldPos){ - Thread thread = new Thread(new Runnable(){ - @Override - public void run() { - //create physics entities - createTerrainPhysicsEntities(worldPos); - //set ready - if(groundDataCells.get(getServerDataCellKey(worldPos)) != null){ - groundDataCells.get(getServerDataCellKey(worldPos)).setReady(true); - } else { - LoggerInterface.loggerEngine.WARNING("Finished generating physics for server cell, but cell is null!"); - } + generationService.submit(() -> { + //create physics entities + createTerrainPhysicsEntities(worldPos); + //set ready + if(groundDataCells.get(getServerDataCellKey(worldPos)) != null){ + groundDataCells.get(getServerDataCellKey(worldPos)).setReady(true); + } else { + LoggerInterface.loggerEngine.WARNING("Finished generating physics for server cell, but cell is null!"); } }); groundDataCells.get(getServerDataCellKey(worldPos)).setReady(false); - Globals.threadManager.start(ThreadLabel.ASSET_LOADING, thread); } /** @@ -793,4 +795,11 @@ public class GriddedDataCellManager implements DataCellManager, VoxelCellManager return Collections.unmodifiableCollection(this.groundDataCells.values()); } + /** + * Stops the executor service + */ + public void halt(){ + generationService.shutdownNow(); + } + } diff --git a/src/main/java/electrosphere/server/datacell/ViewportDataCellManager.java b/src/main/java/electrosphere/server/datacell/ViewportDataCellManager.java index da65b4d5..84d8dd44 100644 --- a/src/main/java/electrosphere/server/datacell/ViewportDataCellManager.java +++ b/src/main/java/electrosphere/server/datacell/ViewportDataCellManager.java @@ -120,5 +120,10 @@ public class ViewportDataCellManager implements DataCellManager { } return returnPos; } + + @Override + public void halt(){ + //does nothing + } } diff --git a/src/main/java/electrosphere/server/datacell/interfaces/DataCellManager.java b/src/main/java/electrosphere/server/datacell/interfaces/DataCellManager.java index 9a2728b8..ce14c6de 100644 --- a/src/main/java/electrosphere/server/datacell/interfaces/DataCellManager.java +++ b/src/main/java/electrosphere/server/datacell/interfaces/DataCellManager.java @@ -81,5 +81,10 @@ public interface DataCellManager { * @return Either the position if it is in bounds, or the closest position that is in bounds */ public Vector3d guaranteePositionIsInBounds(Vector3d positionToTest); + + /** + * Halts all asynchronous work being done in this data cell manager + */ + public void halt(); }