From 0493649348c31e808b65408c19098d0f1d7dfa72 Mon Sep 17 00:00:00 2001 From: austin Date: Sat, 24 May 2025 21:41:55 -0400 Subject: [PATCH] nearby entity lookup caching --- docs/src/progress/renderertodo.md | 1 + .../gridded/GriddedDataCellManager.java | 18 +++++++++++++++++- 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/docs/src/progress/renderertodo.md b/docs/src/progress/renderertodo.md index 38c2573f..ca9d0584 100644 --- a/docs/src/progress/renderertodo.md +++ b/docs/src/progress/renderertodo.md @@ -1970,6 +1970,7 @@ Performance improvements - Reduced the visual LOD cutoff - Multiple visual LOD levels - AI does not simulate for low-lod server entities + - Nearby entity lookup caching per frame Lod emitter service checker function diff --git a/src/main/java/electrosphere/server/datacell/gridded/GriddedDataCellManager.java b/src/main/java/electrosphere/server/datacell/gridded/GriddedDataCellManager.java index 3fd92089..c06d1151 100644 --- a/src/main/java/electrosphere/server/datacell/gridded/GriddedDataCellManager.java +++ b/src/main/java/electrosphere/server/datacell/gridded/GriddedDataCellManager.java @@ -178,6 +178,11 @@ public class GriddedDataCellManager implements DataCellManager, VoxelCellManager * The pathfinder for the manager */ VoxelPathfinder pathfinder; + + /** + * Caches lookups for nearby entities between simulate() calls + */ + private Map> nearbyLookupCache = new HashMap>(); /** * Constructor @@ -697,6 +702,11 @@ public class GriddedDataCellManager implements DataCellManager, VoxelCellManager loadedCellsLock.lock(); + // + //clear nearby entity lookup cache + this.nearbyLookupCache.clear(); + + //regenerate physics where relevant terrainEditLock.acquireUninterruptibly(); if(physicsQueue.size() > 0){ @@ -1179,6 +1189,11 @@ public class GriddedDataCellManager implements DataCellManager, VoxelCellManager @Override public Collection entityLookup(Vector3d pos, double radius) { + Vector3i chunkPos = ServerWorldData.convertRealToChunkSpace(pos); + long key = this.getServerDataCellKey(chunkPos); + if(this.nearbyLookupCache.containsKey(key)){ + return Collections.unmodifiableCollection(this.nearbyLookupCache.get(key)); + } List rVal = new LinkedList(); this.loadedCellsLock.lock(); for(ServerDataCell cell : this.groundDataCells.values()){ @@ -1187,8 +1202,9 @@ public class GriddedDataCellManager implements DataCellManager, VoxelCellManager } rVal.addAll(cell.getScene().getEntityList()); } + this.nearbyLookupCache.put(key,rVal); this.loadedCellsLock.unlock(); - return rVal; + return Collections.unmodifiableCollection(rVal); } @Override