From d59fc82cc75ca6be481f0ba00b7f97f0d4f41fd3 Mon Sep 17 00:00:00 2001 From: James Seibel Date: Sun, 15 Jan 2023 20:03:12 -0600 Subject: [PATCH] refactor Generation Event and Environment --- .../BatchGenerationEnvironment.java | 18 +-- .../worldGeneration/GenerationEvent.java | 112 +++++++++++------- coreSubProjects | 2 +- 3 files changed, 76 insertions(+), 56 deletions(-) diff --git a/common/src/main/java/com/seibel/lod/common/wrappers/worldGeneration/BatchGenerationEnvironment.java b/common/src/main/java/com/seibel/lod/common/wrappers/worldGeneration/BatchGenerationEnvironment.java index 7e67fd7bb..eb81b2d72 100644 --- a/common/src/main/java/com/seibel/lod/common/wrappers/worldGeneration/BatchGenerationEnvironment.java +++ b/common/src/main/java/com/seibel/lod/common/wrappers/worldGeneration/BatchGenerationEnvironment.java @@ -362,7 +362,7 @@ public final class BatchGenerationEnvironment extends AbstractBatchGenerationEnv region = new LightedWorldGenRegion(params.level, lightEngine, referencedChunks, ChunkStatus.STRUCTURE_STARTS, refSize/2, e.lightMode, generator); adaptor.setRegion(region); - e.tParam.makeStructFeat(region, params); + e.threadedParam.makeStructFeat(region, params); genChunks = new ArrayGridList<>(referencedChunks, RANGE_TO_RANGE_EMPTY_EXTENSION, referencedChunks.gridSize - RANGE_TO_RANGE_EMPTY_EXTENSION); generateDirect(e, genChunks, e.target, region); @@ -370,7 +370,7 @@ public final class BatchGenerationEnvironment extends AbstractBatchGenerationEnv } catch (StepStructureStart.StructStartCorruptedException f) { - e.tParam.markAsInvalid(); + e.threadedParam.markAsInvalid(); throw (RuntimeException)f.getCause(); } @@ -418,7 +418,7 @@ public final class BatchGenerationEnvironment extends AbstractBatchGenerationEnv e.refreshTimeout(); if (PREF_LOGGER.canMaybeLog()) { - e.tParam.perf.recordEvent(e.timer); + e.threadedParam.perf.recordEvent(e.timer); PREF_LOGGER.infoInc("{}", e.timer); } } @@ -439,27 +439,27 @@ public final class BatchGenerationEnvironment extends AbstractBatchGenerationEnv if (step == Steps.Empty) return; e.timer.nextEvent("structStart"); - stepStructureStart.generateGroup(e.tParam, region, subRange); + stepStructureStart.generateGroup(e.threadedParam, region, subRange); e.refreshTimeout(); if (step == Steps.StructureStart) return; e.timer.nextEvent("structRef"); - stepStructureReference.generateGroup(e.tParam, region, subRange); + stepStructureReference.generateGroup(e.threadedParam, region, subRange); e.refreshTimeout(); if (step == Steps.StructureReference) return; e.timer.nextEvent("biome"); - stepBiomes.generateGroup(e.tParam, region, subRange); + stepBiomes.generateGroup(e.threadedParam, region, subRange); e.refreshTimeout(); if (step == Steps.Biomes) return; e.timer.nextEvent("noise"); - stepNoise.generateGroup(e.tParam, region, subRange); + stepNoise.generateGroup(e.threadedParam, region, subRange); e.refreshTimeout(); if (step == Steps.Noise) return; e.timer.nextEvent("surface"); - stepSurface.generateGroup(e.tParam, region, subRange); + stepSurface.generateGroup(e.threadedParam, region, subRange); e.refreshTimeout(); if (step == Steps.Surface) return; @@ -467,7 +467,7 @@ public final class BatchGenerationEnvironment extends AbstractBatchGenerationEnv if (step == Steps.Carvers) return; e.timer.nextEvent("feature"); - stepFeatures.generateGroup(e.tParam, region, subRange); + stepFeatures.generateGroup(e.threadedParam, region, subRange); e.refreshTimeout(); } finally diff --git a/common/src/main/java/com/seibel/lod/common/wrappers/worldGeneration/GenerationEvent.java b/common/src/main/java/com/seibel/lod/common/wrappers/worldGeneration/GenerationEvent.java index abed31898..fe9bc56cd 100644 --- a/common/src/main/java/com/seibel/lod/common/wrappers/worldGeneration/GenerationEvent.java +++ b/common/src/main/java/com/seibel/lod/common/wrappers/worldGeneration/GenerationEvent.java @@ -16,7 +16,7 @@ * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ - + package com.seibel.lod.common.wrappers.worldGeneration; import java.lang.invoke.MethodHandles; @@ -41,7 +41,7 @@ public final class GenerationEvent private static final Logger LOGGER = DhLoggerBuilder.getLogger(MethodHandles.lookup().lookupClass().getSimpleName()); private static int generationFutureDebugIDs = 0; final int id; - final ThreadedParameters tParam; + final ThreadedParameters threadedParam; final DhChunkPos minPos; final int size; final Steps target; @@ -52,93 +52,113 @@ public final class GenerationEvent long timeoutTime = -1; public CompletableFuture future = null; final Consumer resultConsumer; - + + + public GenerationEvent(DhChunkPos minPos, int size, BatchGenerationEnvironment generationGroup, - Steps target, double runTimeRatio, Consumer resultConsumer) { - inQueueTime = System.nanoTime(); + Steps target, double runTimeRatio, Consumer resultConsumer) + { + this.inQueueTime = System.nanoTime(); this.id = generationFutureDebugIDs++; this.minPos = minPos; this.size = size; this.target = target; - this.tParam = ThreadedParameters.getOrMake(generationGroup.params); + this.threadedParam = ThreadedParameters.getOrMake(generationGroup.params); this.lightMode = Config.Client.WorldGenerator.lightGenerationMode.get(); this.runTimeRatio = runTimeRatio; this.resultConsumer = resultConsumer; } - + + + public static GenerationEvent startEvent(DhChunkPos minPos, int size, BatchGenerationEnvironment generationGroup, - Steps target, double runTimeRatio, Consumer resultConsumer) + Steps target, double runTimeRatio, Consumer resultConsumer) { - if (size % 2 == 0) size += 1; // size must be odd for vanilla world gen region to work + if (size % 2 == 0) + { + size += 1; // size must be odd for vanilla world gen regions to work + } + GenerationEvent event = new GenerationEvent(minPos, size, generationGroup, target, runTimeRatio, resultConsumer); event.future = CompletableFuture.runAsync(() -> + { + long runStartTime = System.nanoTime(); + event.timeoutTime = runStartTime; + event.inQueueTime = runStartTime - event.inQueueTime; + event.timer = new EventTimer("setup"); + BatchGenerationEnvironment.isDistantGeneratorThread.set(true); + try + { + LOGGER.info("generating [{}]", event.minPos); + generationGroup.generateLodFromList(event); + } + finally + { + BatchGenerationEnvironment.isDistantGeneratorThread.remove(); + if (!Thread.interrupted() && runTimeRatio < 1.0) { - long runStartTime = System.nanoTime(); - event.timeoutTime = runStartTime; - event.inQueueTime = runStartTime - event.inQueueTime; - event.timer = new EventTimer("setup"); - BatchGenerationEnvironment.isDistantGeneratorThread.set(true); - try { - generationGroup.generateLodFromList(event); - } finally { - BatchGenerationEnvironment.isDistantGeneratorThread.remove(); - if (!Thread.interrupted() && runTimeRatio < 1.0) { - long endTime = System.nanoTime(); - try { - long deltaMs = TimeUnit.NANOSECONDS.toMillis(endTime - runStartTime); - Thread.sleep((long) (deltaMs/runTimeRatio - deltaMs)); - } catch (InterruptedException ignored) {} - } + long endTime = System.nanoTime(); + try + { + long deltaMs = TimeUnit.NANOSECONDS.toMillis(endTime - runStartTime); + Thread.sleep((long) (deltaMs / runTimeRatio - deltaMs)); } - }, generationGroup.executors); + catch (InterruptedException ignored) + { + } + } + } + }, generationGroup.executors); return event; } - - public boolean isComplete() - { - return future.isDone(); - } - + + public boolean isComplete() { return this.future.isDone(); } + public boolean hasTimeout(int duration, TimeUnit unit) { - if (timeoutTime == -1) return false; + if (this.timeoutTime == -1) + { + return false; + } + long currentTime = System.nanoTime(); - long delta = currentTime - timeoutTime; + long delta = currentTime - this.timeoutTime; return (delta > TimeUnit.NANOSECONDS.convert(duration, unit)); } - + public boolean terminate() { LOGGER.info("======================DUMPING ALL THREADS FOR WORLD GEN======================="); BatchGenerationEnvironment.threadFactory.dumpAllThreadStacks(); - future.cancel(true); - return future.isCancelled(); + this.future.cancel(true); + return this.future.isCancelled(); } - public boolean tooClose(int minX, int minZ, int w) + public boolean tooClose(int minX, int minZ, int width) { - int aMinX = minPos.x; - int aMinZ = minPos.z; - int aSize = size; + int aMinX = this.minPos.x; + int aMinZ = this.minPos.z; + int aSize = this.size; // Account for required empty chunks in the border aSize += 1; - w+= 1; + width += 1; // Do a AABB to AABB intersection test return (aMinX + aSize >= minX && - aMinX <= minX + w && + aMinX <= minX + width && aMinZ + aSize >= minZ && - aMinZ <= minZ + w); + aMinZ <= minZ + width); } public void refreshTimeout() { - timeoutTime = System.nanoTime(); + this.timeoutTime = System.nanoTime(); UncheckedInterruptedException.throwIfInterrupted(); } @Override public String toString() { - return id + ":" + size + "@" + minPos + "(" + target + ")"; + return this.id + ":" + this.size + "@" + this.minPos + "(" + this.target + ")"; } + } \ No newline at end of file diff --git a/coreSubProjects b/coreSubProjects index 98fde3de7..59d5b475c 160000 --- a/coreSubProjects +++ b/coreSubProjects @@ -1 +1 @@ -Subproject commit 98fde3de74d786311ec947354e85d5de703732aa +Subproject commit 59d5b475c5ec9208122aa7b3b6ccc03d88115b49