From 3d9228ceac2b81829346ae4bbbf1c9f95fcbe6c4 Mon Sep 17 00:00:00 2001 From: tom lee Date: Wed, 9 Feb 2022 18:04:37 +0800 Subject: [PATCH] Fixed critical MEM LEAKS on batch world generator --- .../BatchGenerationEnvironment.java | 14 +++++++------- .../worldGeneration/ThreadedParameters.java | 6 +++--- .../mimicObject/WorldGenStructFeatManager.java | 4 ++++ core | 2 +- 4 files changed, 15 insertions(+), 11 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 4536e7074..a4d41ce55 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 @@ -23,7 +23,6 @@ import com.seibel.lod.core.api.ClientApi; import com.seibel.lod.core.builders.lodBuilding.LodBuilder; import com.seibel.lod.core.builders.lodBuilding.LodBuilderConfig; import com.seibel.lod.core.enums.config.DistanceGenerationMode; -import com.seibel.lod.core.enums.config.LightGenerationMode; import com.seibel.lod.core.objects.lod.LodDimension; import com.seibel.lod.core.util.GridList; import com.seibel.lod.core.util.LodThreadFactory; @@ -82,6 +81,7 @@ public final class BatchGenerationEnvironment extends AbstractBatchGenerationEnv public static final boolean ENABLE_PERF_LOGGING = false; public static final boolean ENABLE_EVENT_LOGGING = false; public static final boolean ENABLE_LOAD_EVENT_LOGGING = false; + public static final boolean DISABLE_LOADING_SAVES = false; // TODO: Make actual proper support for StarLight public static class PrefEvent { @@ -265,6 +265,9 @@ public final class BatchGenerationEnvironment extends AbstractBatchGenerationEnv @SuppressWarnings("resource") private static ChunkAccess loadOrMakeChunk(ChunkPos chunkPos, ServerLevel level, LevelLightEngine lightEngine) { + if (DISABLE_LOADING_SAVES) { + return new ProtoChunk(chunkPos, UpgradeData.EMPTY); + } CompoundTag chunkData = null; try { chunkData = level.getChunkSource().chunkMap.readChunk(chunkPos); @@ -324,7 +327,7 @@ public final class BatchGenerationEnvironment extends AbstractBatchGenerationEnv region = new LightedWorldGenRegion(params.level, lightEngine, e.tParam.structFeat, chunks, ChunkStatus.STRUCTURE_STARTS, rangeEmpty, e.lightMode, generator); adaptor.setRegion(region); - e.tParam.makeStructFeat(region, params.worldGenSettings); + e.tParam.makeStructFeat(region); referencedChunks = chunks.subGrid(e.range); referencedChunks = generateDirect(e, referencedChunks, e.target, region); @@ -377,10 +380,7 @@ public final class BatchGenerationEnvironment extends AbstractBatchGenerationEnv params.lodBuilder.generateLodNodeFromChunk(params.lodDim, new ChunkWrapper(target, region), new LodBuilderConfig(generationMode), true, e.genAllDetails); } - if (e.lightMode == LightGenerationMode.FANCY || isFull) { - lightEngine.retainData(target.getPos(), false); - } - + lightEngine.retainData(target.getPos(), false); } } e.pEvent.endNano = System.nanoTime(); @@ -397,7 +397,7 @@ public final class BatchGenerationEnvironment extends AbstractBatchGenerationEnv subRange.forEach((chunk) -> { if (chunk instanceof ProtoChunk) { ((ProtoChunk) chunk).setLightEngine(region.getLightEngine()); - region.getLightEngine().retainData(chunk.getPos(), true); + //region.getLightEngine().retainData(chunk.getPos(), true); } }); if (step == Steps.Empty) diff --git a/common/src/main/java/com/seibel/lod/common/wrappers/worldGeneration/ThreadedParameters.java b/common/src/main/java/com/seibel/lod/common/wrappers/worldGeneration/ThreadedParameters.java index ed7e0d189..347c644b5 100644 --- a/common/src/main/java/com/seibel/lod/common/wrappers/worldGeneration/ThreadedParameters.java +++ b/common/src/main/java/com/seibel/lod/common/wrappers/worldGeneration/ThreadedParameters.java @@ -10,7 +10,7 @@ import net.minecraft.world.level.levelgen.WorldGenSettings; public final class ThreadedParameters { private static final ThreadLocal localParam = new ThreadLocal(); final ServerLevel level; - public WorldGenStructFeatManager structFeat; + public final WorldGenStructFeatManager structFeat; boolean isValid = true; public final PerfCalculator perf = new PerfCalculator(); @@ -32,7 +32,7 @@ public final class ThreadedParameters { structFeat = new WorldGenStructFeatManager(level, param.worldGenSettings, null); } - public void makeStructFeat(WorldGenLevel genLevel, WorldGenSettings worldGenSettings) { - structFeat = new WorldGenStructFeatManager(level, worldGenSettings, genLevel); + public void makeStructFeat(WorldGenLevel genLevel) { + structFeat.setGenLevel(genLevel); } } \ No newline at end of file diff --git a/common/src/main/java/com/seibel/lod/common/wrappers/worldGeneration/mimicObject/WorldGenStructFeatManager.java b/common/src/main/java/com/seibel/lod/common/wrappers/worldGeneration/mimicObject/WorldGenStructFeatManager.java index 25355b57f..c4dd39a64 100644 --- a/common/src/main/java/com/seibel/lod/common/wrappers/worldGeneration/mimicObject/WorldGenStructFeatManager.java +++ b/common/src/main/java/com/seibel/lod/common/wrappers/worldGeneration/mimicObject/WorldGenStructFeatManager.java @@ -24,6 +24,10 @@ public class WorldGenStructFeatManager extends StructureFeatureManager { this.genLevel = genLevel; this.worldGenSettings = worldGenSettings; } + + public void setGenLevel(WorldGenLevel genLevel) { + this.genLevel = genLevel; + } @Override public WorldGenStructFeatManager forWorldGenRegion(WorldGenRegion worldGenRegion) { diff --git a/core b/core index 1b2716151..cbcb7ca6a 160000 --- a/core +++ b/core @@ -1 +1 @@ -Subproject commit 1b27161518b7e1bb36de0b1b33ce04eaa0f87e05 +Subproject commit cbcb7ca6ac6bce3c237a3ca0283d29228dacd0f0