fixed a thread problem

This commit is contained in:
Leonardo
2021-09-21 16:30:53 +02:00
parent e3df6c99da
commit 8228a3b7a6
3 changed files with 19 additions and 8 deletions
@@ -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)
@@ -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;
@@ -13,6 +13,7 @@ public class ThreadMapUtil
public static final ConcurrentMap<String, short[]> projectionShortMap = new ConcurrentHashMap<>();
public static final ConcurrentMap<String, short[]> heightAndDepthMap = new ConcurrentHashMap<>();
public static final ConcurrentMap<String, long[]> singleDataToMergeMap = new ConcurrentHashMap<>();
public static final ConcurrentMap<String, long[][]> 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))
{