From 8228a3b7a66bd83b4fa7543df97c1e14a90ceda6 Mon Sep 17 00:00:00 2001 From: Leonardo Date: Tue, 21 Sep 2021 16:30:53 +0200 Subject: [PATCH] fixed a thread problem --- .../java/com/seibel/lod/builders/LodBuilder.java | 8 +++----- .../seibel/lod/objects/VerticalLevelContainer.java | 5 ++--- .../java/com/seibel/lod/util/ThreadMapUtil.java | 14 ++++++++++++++ 3 files changed, 19 insertions(+), 8 deletions(-) diff --git a/src/main/java/com/seibel/lod/builders/LodBuilder.java b/src/main/java/com/seibel/lod/builders/LodBuilder.java index 6be35fabd..9cc7cdfc4 100644 --- a/src/main/java/com/seibel/lod/builders/LodBuilder.java +++ b/src/main/java/com/seibel/lod/builders/LodBuilder.java @@ -18,6 +18,7 @@ package com.seibel.lod.builders; import java.awt.Color; +import java.util.Arrays; import java.util.List; import java.util.Random; import java.util.concurrent.ConcurrentHashMap; @@ -270,6 +271,7 @@ public class LodBuilder private long[] createVerticalDataToMerge(HorizontalResolution detail, IChunk chunk, LodBuilderConfig config, int startX, int startZ, int endX, int endZ) { long[] dataToMerge = ThreadMapUtil.getBuilderVerticalArray()[detail.detailLevel]; + Arrays.fill(dataToMerge, DataPointUtil.EMPTY_DATA); int verticalData = DataPointUtil.WORLD_HEIGHT; ChunkPos chunkPos = chunk.getPos(); @@ -295,17 +297,13 @@ public class LodBuilder for (index = 0; index < size * size; index++) { - for (int verticalIndex = 0; verticalIndex < verticalData; verticalIndex++) - { - dataToMerge[index * verticalData + verticalIndex] = DataPointUtil.EMPTY_DATA; - } xRel = Math.floorMod(index, size) + startX; zRel = Math.floorDiv(index, size) + startZ; xAbs = chunkPos.getMinBlockX() + xRel; zAbs = chunkPos.getMinBlockZ() + zRel; //Calculate the height of the lod - yAbs = 1024; + yAbs = DataPointUtil.WORLD_HEIGHT+2; int count = 0; boolean topBlock = true; while (yAbs > 0) diff --git a/src/main/java/com/seibel/lod/objects/VerticalLevelContainer.java b/src/main/java/com/seibel/lod/objects/VerticalLevelContainer.java index 9be964d73..5b95489bb 100644 --- a/src/main/java/com/seibel/lod/objects/VerticalLevelContainer.java +++ b/src/main/java/com/seibel/lod/objects/VerticalLevelContainer.java @@ -134,9 +134,8 @@ public class VerticalLevelContainer implements LevelContainer public void updateData(LevelContainer lowerLevelContainer, int posX, int posZ) { //We reset the array - //long[] dataToMerge = ThreadMapUtil.getVerticalUpdateArray(maxVerticalData); - long[] dataToMerge = new long[4*lowerLevelContainer.getMaxVerticalData()]; - + long[] dataToMerge = ThreadMapUtil.getVerticalUpdateArray(detailLevel, lowerLevelContainer.getMaxVerticalData()); + Arrays.fill(dataToMerge, DataPointUtil.EMPTY_DATA); int childPosX; int childPosZ; long[] data; diff --git a/src/main/java/com/seibel/lod/util/ThreadMapUtil.java b/src/main/java/com/seibel/lod/util/ThreadMapUtil.java index e2ba6d016..98ffaf77a 100644 --- a/src/main/java/com/seibel/lod/util/ThreadMapUtil.java +++ b/src/main/java/com/seibel/lod/util/ThreadMapUtil.java @@ -13,6 +13,7 @@ public class ThreadMapUtil public static final ConcurrentMap projectionShortMap = new ConcurrentHashMap<>(); public static final ConcurrentMap heightAndDepthMap = new ConcurrentHashMap<>(); public static final ConcurrentMap singleDataToMergeMap = new ConcurrentHashMap<>(); + public static final ConcurrentMap verticalUpdate = new ConcurrentHashMap<>(); public static long[] getSingleUpdateArray() { @@ -85,6 +86,19 @@ public class ThreadMapUtil return saveContainer.get(Thread.currentThread().getName()); } + public static long[] getVerticalUpdateArray(byte detailLevel,int size){ + if(!verticalUpdate.containsKey(Thread.currentThread().getName()) || (verticalUpdate.get(Thread.currentThread().getName()) == null) || (verticalUpdate.get(Thread.currentThread().getName())[detailLevel].length != size)) + { + long[][] array = new long[10][]; + for(int i = 0; i < array.length; i++) + { + array[i] = new long[4 * size]; + } + verticalUpdate.put(Thread.currentThread().getName(), array); + } + return verticalUpdate.get(Thread.currentThread().getName())[detailLevel]; + } + public static long[] getSingleAddDataToMerge(int size){ if(!singleDataToMergeMap.containsKey(Thread.currentThread().getName()) || (singleDataToMergeMap.get(Thread.currentThread().getName()) == null) || (singleDataToMergeMap.get(Thread.currentThread().getName()).length != size)) {