diff --git a/core/src/main/java/com/seibel/distanthorizons/core/render/LodQuadTree.java b/core/src/main/java/com/seibel/distanthorizons/core/render/LodQuadTree.java index 6d8744048..68c7ac511 100644 --- a/core/src/main/java/com/seibel/distanthorizons/core/render/LodQuadTree.java +++ b/core/src/main/java/com/seibel/distanthorizons/core/render/LodQuadTree.java @@ -42,6 +42,7 @@ import com.seibel.distanthorizons.core.util.threading.ThreadPoolUtil; import com.seibel.distanthorizons.coreapi.util.MathUtil; import it.unimi.dsi.fastutil.longs.LongArrayList; import it.unimi.dsi.fastutil.longs.LongIterator; +import it.unimi.dsi.fastutil.longs.LongOpenCustomHashSet; import it.unimi.dsi.fastutil.longs.LongOpenHashSet; import org.jetbrains.annotations.Nullable; @@ -49,6 +50,7 @@ import javax.annotation.WillNotClose; import java.awt.*; import java.util.*; import java.util.concurrent.CompletableFuture; +import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentLinkedQueue; import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.atomic.AtomicInteger; @@ -105,8 +107,10 @@ public class LodQuadTree extends QuadTree implements IDebugRen private double detailDropOffLogBase; /** the {@link DhSectionPos} that need to be retrieved/generated */ - public final LongOpenHashSet missingGenerationPosSet = new LongOpenHashSet(); - public final LongOpenHashSet queuedGenerationPosSet = new LongOpenHashSet(); + private final Set missingGenerationPosSet = Collections.newSetFromMap(new ConcurrentHashMap<>()); // concurrency is annoying but required due to needing to add/remove items in the world gen future + private final Set queuedGenerationPosSet = Collections.newSetFromMap(new ConcurrentHashMap<>()); + /** cached array to prevent having to re-allocate it each tick */ + private final ArrayList sortedMissingPosList = new ArrayList<>(); @@ -660,8 +664,9 @@ public class LodQuadTree extends QuadTree implements IDebugRen private void queueFullDataRetrievalTasks(DhBlockPos2D playerPos) { // sort the nodes from nearest to farthest - LongArrayList sortedMissingPosList = new LongArrayList(this.missingGenerationPosSet); - sortedMissingPosList.sort((posA, posB) -> + this.sortedMissingPosList.clear(); + this.sortedMissingPosList.addAll(this.missingGenerationPosSet); + this.sortedMissingPosList.sort((posA, posB) -> { int aDist = DhSectionPos.getManhattanBlockDistance(posA, playerPos); int bDist = DhSectionPos.getManhattanBlockDistance(posB, playerPos); @@ -681,7 +686,7 @@ public class LodQuadTree extends QuadTree implements IDebugRen break; } - long missingPos = sortedMissingPosList.getLong(i); + long missingPos = this.sortedMissingPosList.get(i); // is this position within acceptable generator range? boolean posInRange = WorldGenUtil.isPosInWorldGenRange( @@ -733,9 +738,9 @@ public class LodQuadTree extends QuadTree implements IDebugRen // calculate an estimate for the max number of chunks for the queue int totalWorldGenChunkCount = 0; int totalWorldGenTaskCount = 0; - for (int i = 0; i < sortedMissingPosList.size(); i++) + for (int i = 0; i < this.sortedMissingPosList.size(); i++) { - long missingPos = sortedMissingPosList.getLong(i); + long missingPos = this.sortedMissingPosList.get(i); // chunk count int sectionWidthInChunks = DhSectionPos.getChunkWidth(missingPos);