From 152a3fa1087ddd995b692fc6dc1c96a705d9283b Mon Sep 17 00:00:00 2001 From: Leonardo Date: Fri, 3 Sep 2021 22:35:08 +0200 Subject: [PATCH] Optimized the generation memory use --- .../lod/builders/GenerationRequest.java | 5 +-- .../com/seibel/lod/builders/LodBuilder.java | 39 ++++++++----------- .../worldGeneration/LodNodeGenWorker.java | 17 ++++---- .../worldGeneration/LodWorldGenerator.java | 6 +-- 4 files changed, 27 insertions(+), 40 deletions(-) diff --git a/src/main/java/com/seibel/lod/builders/GenerationRequest.java b/src/main/java/com/seibel/lod/builders/GenerationRequest.java index fc88e00e3..a04edd53a 100644 --- a/src/main/java/com/seibel/lod/builders/GenerationRequest.java +++ b/src/main/java/com/seibel/lod/builders/GenerationRequest.java @@ -1,7 +1,6 @@ package com.seibel.lod.builders; import com.seibel.lod.enums.DistanceGenerationMode; -import com.seibel.lod.enums.LodDetail; import com.seibel.lod.objects.LevelPos.LevelPos; import com.seibel.lod.util.LodUtil; import net.minecraft.util.math.ChunkPos; @@ -14,13 +13,11 @@ public class GenerationRequest { public final LevelPos levelPos; public final DistanceGenerationMode generationMode; - public final LodDetail detail; - public GenerationRequest(LevelPos levelPos, DistanceGenerationMode generationMode, LodDetail detail) + public GenerationRequest(LevelPos levelPos, DistanceGenerationMode generationMode) { this.levelPos = levelPos; this.generationMode = generationMode; - this.detail = detail; } public ChunkPos getChunkPos() diff --git a/src/main/java/com/seibel/lod/builders/LodBuilder.java b/src/main/java/com/seibel/lod/builders/LodBuilder.java index b2edfa1fe..98a75af60 100644 --- a/src/main/java/com/seibel/lod/builders/LodBuilder.java +++ b/src/main/java/com/seibel/lod/builders/LodBuilder.java @@ -111,11 +111,12 @@ public class LodBuilder int playerPosX; int playerPosZ; - if(Minecraft.getInstance().player == null) + if (Minecraft.getInstance().player == null) { playerPosX = chunk.getPos().getMinBlockX(); playerPosZ = chunk.getPos().getMinBlockZ(); - }else{ + } else + { playerPosX = (int) world.players().get(0).getX(); playerPosZ = (int) world.players().get(0).getZ(); } @@ -128,14 +129,7 @@ public class LodBuilder { lodDim = lodWorld.getLodDimension(dim); } - LevelPos chunkPos = new LevelPos(LodUtil.CHUNK_DETAIL_LEVEL, chunk.getPos().x, chunk.getPos().z); - generateLodNodeFromChunk(lodDim, chunk, new LodBuilderConfig(generationMode), - DetailDistanceUtil.getLodGenDetail( - DetailDistanceUtil.getDistanceGenerationInverse( - chunkPos.maxDistance( - playerPosX, - playerPosZ - )))); + generateLodNodeFromChunk(lodDim, chunk, new LodBuilderConfig(generationMode)); } catch (IllegalArgumentException | NullPointerException e) { System.out.println("Chunk pos " + chunk.getPos()); @@ -155,9 +149,9 @@ public class LodBuilder * * @throws IllegalArgumentException thrown if either the chunk or world is null. */ - public void generateLodNodeFromChunk(LodDimension lodDim, IChunk chunk, LodDetail detailLevel) throws IllegalArgumentException + public void generateLodNodeFromChunk(LodDimension lodDim, IChunk chunk) throws IllegalArgumentException { - generateLodNodeFromChunk(lodDim, chunk, new LodBuilderConfig(), detailLevel); + generateLodNodeFromChunk(lodDim, chunk, new LodBuilderConfig()); } /** @@ -165,15 +159,13 @@ public class LodBuilder * * @throws IllegalArgumentException thrown if either the chunk or world is null. */ - public void generateLodNodeFromChunk(LodDimension lodDim, IChunk chunk, LodBuilderConfig config, LodDetail detail) + public void generateLodNodeFromChunk(LodDimension lodDim, IChunk chunk, LodBuilderConfig config) throws IllegalArgumentException { if (chunk == null) throw new IllegalArgumentException("generateLodFromChunk given a null chunk"); - boolean check = false; - int startX; int startZ; int endX; @@ -181,10 +173,14 @@ public class LodBuilder short[] color; short height; short depth; - LevelPos levelPos = new LevelPos((byte) 0, 0, 0); short[] data; + LevelPos levelPos = new LevelPos((byte) 0, 0, 0); + levelPos.changeParameters(LodUtil.CHUNK_DETAIL_LEVEL, chunk.getPos().x, chunk.getPos().z); + levelPos.convert(LodUtil.REGION_DETAIL_LEVEL); try { + byte minDetailLevel = lodDim.getRegion(levelPos).getMinDetailLevel(); + LodDetail detail = DetailDistanceUtil.getLodGenDetail(minDetailLevel); for (int i = 0; i < detail.dataPointLengthCount * detail.dataPointLengthCount; i++) { startX = detail.startX[i]; @@ -215,9 +211,8 @@ public class LodBuilder false, isServer); } - //levelPos.changeParameters(LodUtil.CHUNK_DETAIL_LEVEL, chunk.getPos().x, chunk.getPos().z); - - lodDim.updateData(new LevelPos(LodUtil.CHUNK_DETAIL_LEVEL, chunk.getPos().x, chunk.getPos().z)); + levelPos.changeParameters(LodUtil.CHUNK_DETAIL_LEVEL, chunk.getPos().x, chunk.getPos().z); + lodDim.updateData(levelPos); } catch (Exception e) { //e.printStackTrace(); @@ -450,12 +445,10 @@ public class LodBuilder Color tmp = LodUtil.intToColor(biome.getGrassColor(x, z)); tmp = tmp.darker(); colorInt = LodUtil.colorToInt(tmp); - } - else if (blockState == Blocks.STONE.defaultBlockState()) + } else if (blockState == Blocks.STONE.defaultBlockState()) { colorInt = LodUtil.STONE_COLOR_INT; - } - else if (blockState == Blocks.MYCELIUM.defaultBlockState()) + } else if (blockState == Blocks.MYCELIUM.defaultBlockState()) { colorInt = LodUtil.MYCELIUM_COLOR_INT; } diff --git a/src/main/java/com/seibel/lod/builders/worldGeneration/LodNodeGenWorker.java b/src/main/java/com/seibel/lod/builders/worldGeneration/LodNodeGenWorker.java index 654761a60..d56637c38 100644 --- a/src/main/java/com/seibel/lod/builders/worldGeneration/LodNodeGenWorker.java +++ b/src/main/java/com/seibel/lod/builders/worldGeneration/LodNodeGenWorker.java @@ -30,7 +30,6 @@ import com.seibel.lod.builders.LodBuilder; import com.seibel.lod.builders.LodBuilderConfig; import com.seibel.lod.config.LodConfig; import com.seibel.lod.enums.DistanceGenerationMode; -import com.seibel.lod.enums.LodDetail; import com.seibel.lod.objects.LodDimension; import com.seibel.lod.proxy.ClientProxy; import com.seibel.lod.render.LodRenderer; @@ -87,7 +86,7 @@ public class LodNodeGenWorker implements IWorker - public LodNodeGenWorker(ChunkPos newPos, DistanceGenerationMode newGenerationMode, LodDetail newDetaillevel, LodRenderer newLodRenderer, + public LodNodeGenWorker(ChunkPos newPos, DistanceGenerationMode newGenerationMode, LodRenderer newLodRenderer, LodBuilder newLodBuilder, LodDimension newLodDimension, ServerWorld newServerWorld) { @@ -109,7 +108,7 @@ public class LodNodeGenWorker implements IWorker - thread = new LodChunkGenThread(newPos, newGenerationMode, newDetaillevel, newLodRenderer, + thread = new LodChunkGenThread(newPos, newGenerationMode, newLodRenderer, newLodBuilder, newLodDimension, newServerWorld); } @@ -159,19 +158,17 @@ public class LodNodeGenWorker implements IWorker public final ServerWorld serverWorld; public final LodDimension lodDim; public final DistanceGenerationMode generationMode; - public final LodDetail detailLevel; public final LodBuilder lodBuilder; public final LodRenderer lodRenderer; private ChunkPos pos; - public LodChunkGenThread(ChunkPos newPos, DistanceGenerationMode newGenerationMode, LodDetail newDetailLevel, LodRenderer newLodRenderer, + public LodChunkGenThread(ChunkPos newPos, DistanceGenerationMode newGenerationMode, LodRenderer newLodRenderer, LodBuilder newLodBuilder, LodDimension newLodDimension, ServerWorld newServerWorld) { pos = newPos; generationMode = newGenerationMode; - detailLevel = newDetailLevel; lodRenderer = newLodRenderer; lodBuilder = newLodBuilder; lodDim = newLodDimension; @@ -348,14 +345,14 @@ public class LodNodeGenWorker implements IWorker if (!inTheEnd) { - lodBuilder.generateLodNodeFromChunk(lodDim, chunk, new LodBuilderConfig(true, true, false), detailLevel); + lodBuilder.generateLodNodeFromChunk(lodDim, chunk, new LodBuilderConfig(true, true, false)); } else { // if we are in the end, don't generate any chunks. // Since we don't know where the islands are, everything // generates the same and it looks really bad. - lodBuilder.generateLodNodeFromChunk(lodDim, chunk, new LodBuilderConfig(true, true, false), detailLevel); + lodBuilder.generateLodNodeFromChunk(lodDim, chunk, new LodBuilderConfig(true, true, false)); } @@ -392,7 +389,7 @@ public class LodNodeGenWorker implements IWorker IceAndSnowFeature snowFeature = new IceAndSnowFeature(NoFeatureConfig.CODEC); snowFeature.place(lodServerWorld, chunkGen, serverWorld.random, chunk.getPos().getWorldPosition(), null); - lodBuilder.generateLodNodeFromChunk(lodDim, chunk, new LodBuilderConfig(DistanceGenerationMode.SURFACE), detailLevel); + lodBuilder.generateLodNodeFromChunk(lodDim, chunk, new LodBuilderConfig(DistanceGenerationMode.SURFACE)); /**TODO if we want to use Biome utils and terrain utils for overworld * lodBuilder.generateLodNodeFromChunk(lodDim, pos ,detailLevel, serverWorld.getSeed());*/ @@ -521,7 +518,7 @@ public class LodNodeGenWorker implements IWorker // generate a Lod like normal - lodBuilder.generateLodNodeFromChunk(lodDim, chunk, new LodBuilderConfig(DistanceGenerationMode.FEATURES), detailLevel); + lodBuilder.generateLodNodeFromChunk(lodDim, chunk, new LodBuilderConfig(DistanceGenerationMode.FEATURES)); } diff --git a/src/main/java/com/seibel/lod/builders/worldGeneration/LodWorldGenerator.java b/src/main/java/com/seibel/lod/builders/worldGeneration/LodWorldGenerator.java index 16e873136..3f697d71a 100644 --- a/src/main/java/com/seibel/lod/builders/worldGeneration/LodWorldGenerator.java +++ b/src/main/java/com/seibel/lod/builders/worldGeneration/LodWorldGenerator.java @@ -180,7 +180,7 @@ public class LodWorldGenerator // playerBlockPosRounded.getX(), // playerBlockPosRounded.getZ()); //circle = DetailDistanceUtil.getDistanceGenerationInverse(maxDistance); - generationRequestList.add(new GenerationRequest(levelPos, DetailDistanceUtil.getDistanceGenerationMode(levelPos.detailLevel), DetailDistanceUtil.getLodGenDetail(levelPos.detailLevel))); + generationRequestList.add(new GenerationRequest(levelPos, DetailDistanceUtil.getDistanceGenerationMode(levelPos.detailLevel))); requesting--; if (requestingFar > 0 && !nodeToGenerateListFar.isEmpty()) { @@ -192,7 +192,7 @@ public class LodWorldGenerator { //maxDistance = levelPos.maxDistance( playerBlockPosRounded.getX(), playerBlockPosRounded.getZ()); //circle = DetailDistanceUtil.getDistanceGenerationInverse(maxDistance); - generationRequestList.add(new GenerationRequest(levelPos, DetailDistanceUtil.getDistanceGenerationMode(levelPos.detailLevel), DetailDistanceUtil.getLodGenDetail(levelPos.detailLevel))); + generationRequestList.add(new GenerationRequest(levelPos, DetailDistanceUtil.getDistanceGenerationMode(levelPos.detailLevel))); requestingFar--; requesting--; } @@ -241,7 +241,7 @@ public class LodWorldGenerator positionWaitingToBeGenerated.add(chunkPos); numberOfChunksWaitingToGenerate.addAndGet(1); - LodNodeGenWorker genWorker = new LodNodeGenWorker(chunkPos, generationRequest.generationMode, generationRequest.detail, renderer, lodBuilder, lodDim, serverWorld); + LodNodeGenWorker genWorker = new LodNodeGenWorker(chunkPos, generationRequest.generationMode, renderer, lodBuilder, lodDim, serverWorld); WorldWorkerManager.addWorker(genWorker); }