Merge pull request #1289 from TrueFuFLeaderG/adventure

threaded WaveFunctionCollapse
This commit is contained in:
Anthony Calosa
2022-08-08 18:04:19 +08:00
committed by GitHub

View File

@@ -18,6 +18,7 @@ import forge.adventure.util.Config;
import forge.adventure.util.Paths; import forge.adventure.util.Paths;
import forge.adventure.util.SaveFileContent; import forge.adventure.util.SaveFileContent;
import forge.adventure.util.SaveFileData; import forge.adventure.util.SaveFileData;
import forge.util.ThreadUtil;
import org.apache.commons.lang3.tuple.Pair; import org.apache.commons.lang3.tuple.Pair;
import java.util.*; import java.util.*;
@@ -278,7 +279,7 @@ private void clearTerrain(int x,int y,int size)
private long measureGenerationTime(String msg,long lastTime) private long measureGenerationTime(String msg,long lastTime)
{ {
long currentTime = System.currentTimeMillis(); long currentTime = System.currentTimeMillis();
//System.out.print("\n"+msg+" :\t\t"+((currentTime-lastTime)/1000f)+" s"); System.out.print("\n"+msg+" :\t\t"+((currentTime-lastTime)/1000f)+" s");
return currentTime; return currentTime;
} }
public World generateNew(long seed) { public World generateNew(long seed) {
@@ -288,7 +289,9 @@ private long measureGenerationTime(String msg,long lastTime)
loadWorldData(); loadWorldData();
if(seed==0) { seed=random.nextLong(); } if (seed == 0) {
seed = random.nextLong();
}
this.seed = seed; this.seed = seed;
random.setSeed(seed); random.setSeed(seed);
OpenSimplexNoise noise = new OpenSimplexNoise(seed); OpenSimplexNoise noise = new OpenSimplexNoise(seed);
@@ -313,6 +316,27 @@ private long measureGenerationTime(String msg,long lastTime)
int biomeIndex = -1; int biomeIndex = -1;
currentTime = measureGenerationTime("loading data", currentTime); currentTime = measureGenerationTime("loading data", currentTime);
HashMap<BiomeStructureData, BiomeStructure> structureDataMap = new HashMap<>();
for (BiomeData biome : data.GetBiomes()) {
if (biome.structures != null) {
int biomeWidth = (int) Math.round(biome.width * (double) width);
int biomeHeight = (int) Math.round(biome.height * (double) height);
for (BiomeStructureData data : biome.structures) {
long localSeed=seed;
ThreadUtil.getServicePool().submit(() -> {
long threadStartTime = System.currentTimeMillis();
BiomeStructure structure = new BiomeStructure(data, localSeed, biomeWidth, biomeHeight);
structure.initialize();
structureDataMap.put(data, structure);
measureGenerationTime("wavefunctioncollapse " + data.sourcePath, threadStartTime);
});
}
}
}
for (BiomeData biome : data.GetBiomes()) { for (BiomeData biome : data.GetBiomes()) {
biomeIndex++; biomeIndex++;
@@ -331,7 +355,6 @@ private long measureGenerationTime(String msg,long lastTime)
endX = width; endX = width;
endY = height; endY = height;
} }
HashMap<BiomeStructureData,BiomeStructure> structureDataMap=new HashMap<>();
for (int x = beginX; x < endX; x++) { for (int x = beginX; x < endX; x++) {
for (int y = beginY; y < endY; y++) { for (int y = beginY; y < endY; y++) {
//value 0-1 based on noise //value 0-1 based on noise
@@ -370,19 +393,15 @@ private long measureGenerationTime(String msg,long lastTime)
{ {
for(BiomeStructureData data:biome.structures) for(BiomeStructureData data:biome.structures)
{ {
while(!structureDataMap.containsKey(data)) {
try {
Thread.sleep(10);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
BiomeStructure structure; BiomeStructure structure=structureDataMap.get(data);
if(!structureDataMap.containsKey(data))
{
structure=new BiomeStructure(data,seed,biomeWidth,biomeHeight);
structure.initialize();
structureDataMap.put(data,structure);
currentTime=measureGenerationTime("wavefunctioncollapse "+data.sourcePath,currentTime);
}
else
{
structure=structureDataMap.get(data);
}
int structureXStart= x-(biomeXStart - biomeWidth / 2)-(int) ((data.x*biomeWidth)-(data.width*biomeWidth/2)); int structureXStart= x-(biomeXStart - biomeWidth / 2)-(int) ((data.x*biomeWidth)-(data.width*biomeWidth/2));
int structureYStart= y-(biomeYStart - biomeHeight / 2)- (int) ((data.y*biomeHeight)-(data.height*biomeHeight/2)); int structureYStart= y-(biomeYStart - biomeHeight / 2)- (int) ((data.y*biomeHeight)-(data.height*biomeHeight/2));
@@ -406,6 +425,7 @@ private long measureGenerationTime(String msg,long lastTime)
} }
} }
} }
currentTime=measureGenerationTime("biomes in total",currentTime);
mapPoiIds = new PointOfInterestMap(getChunkSize(), data.tileSize, data.width / getChunkSize(),data.height / getChunkSize()); mapPoiIds = new PointOfInterestMap(getChunkSize(), data.tileSize, data.width / getChunkSize(),data.height / getChunkSize());
List<PointOfInterest> towns = new ArrayList<>(); List<PointOfInterest> towns = new ArrayList<>();
@@ -679,8 +699,10 @@ private long measureGenerationTime(String msg,long lastTime)
} }
biomeImage = pix; biomeImage = pix;
measureGenerationTime("sprites",currentTime); measureGenerationTime("sprites",currentTime);
//System.out.print("\nGenerating world took :\t\t"+((System.currentTimeMillis()-startTime)/1000f)+" s"); System.out.print("\nGenerating world took :\t\t"+((System.currentTimeMillis()-startTime)/1000f)+" s\n");
WorldStage.getInstance().clearCache(); WorldStage.getInstance().clearCache();
ThreadUtil.getServicePool().shutdownNow();
ThreadUtil.refreshServicePool();
return this; return this;
} }