multi-threaded finders

This commit is contained in:
Unknown
2019-11-15 07:41:10 -05:00
parent b7ecd9e22c
commit 2c8c29f4c6
2 changed files with 33 additions and 19 deletions
@@ -1,6 +1,7 @@
package kaptainwutax.seedcracker;
import com.mojang.blaze3d.platform.GlStateManager;
import io.netty.util.internal.ConcurrentSet;
import kaptainwutax.seedcracker.finder.*;
import kaptainwutax.seedcracker.util.FinderBuilder;
import net.minecraft.util.math.ChunkPos;
@@ -8,13 +9,17 @@ import net.minecraft.world.World;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class FinderQueue {
private final static FinderQueue INSTANCE = new FinderQueue();
public static final ExecutorService SERVICE = Executors.newFixedThreadPool(5);
private List<FinderBuilder> finderBuilders = new ArrayList<>();
private List<Finder> activeFinders = new ArrayList<>();
private Set<Finder> activeFinders = new ConcurrentSet<>();
private FinderQueue() {
this.clear();
@@ -26,17 +31,19 @@ public class FinderQueue {
public void onChunkData(World world, ChunkPos chunkPos) {
this.finderBuilders.forEach(finderBuilder -> {
List<Finder> finders = finderBuilder.build(world, chunkPos);
SERVICE.submit(() -> {
List<Finder> finders = finderBuilder.build(world, chunkPos);
finders.forEach(finder -> {
if(finder.isValidDimension(finder.getWorld().dimension.getType())) {
finder.findInChunk();
this.activeFinders.add(finder);
}
finders.forEach(finder -> {
if (finder.isValidDimension(finder.getWorld().dimension.getType())) {
finder.findInChunk();
if(!finder.isUseless()) {
this.activeFinders.add(finder);
}
}
});
});
});
this.activeFinders.removeIf(Finder::isUseless);
}
public void renderFinders() {
@@ -67,6 +74,8 @@ public class FinderQueue {
this.finderBuilders.add(EndPillarsFinder::create);
this.finderBuilders.add(BiomeFinder::create);
this.finderBuilders.add(OceanMonumentFinder::create);
this.finderBuilders.add(EndCityFinder::create);
this.finderBuilders.add(IglooFinder::create);
}
}
@@ -39,7 +39,7 @@ public class SeedCracker implements ModInitializer {
return INSTANCE;
}
public void clear() {
public synchronized void clear() {
this.worldSeeds = null;
this.structureSeeds = null;
this.pillarSeeds = null;
@@ -47,8 +47,8 @@ public class SeedCracker implements ModInitializer {
this.biomeCache.clear();
}
public void onPillarData(PillarData pillarData) {
if(this.pillarSeeds == null) {
public synchronized boolean onPillarData(PillarData pillarData) {
if(pillarData != null && (this.pillarSeeds == null || this.pillarSeeds.isEmpty())) {
LOG.warn("Looking for pillar seeds...");
this.pillarSeeds = pillarData.getPillarSeeds();
@@ -60,12 +60,18 @@ public class SeedCracker implements ModInitializer {
}
this.onStructureData(null);
return true;
}
}
public void onStructureData(StructureData structureData) {
if(structureData != null) {
return false;
}
public synchronized boolean onStructureData(StructureData structureData) {
boolean added = false;
if(structureData != null && !this.structureCache.contains(structureData)) {
this.structureCache.add(structureData);
added = true;
}
if(this.structureSeeds == null && this.pillarSeeds != null && this.structureCache.size() >= 5) {
@@ -91,12 +97,13 @@ public class SeedCracker implements ModInitializer {
return !structureData.test(chunkRandom);
});
this.structureCache.clear();
this.onBiomeData(null);
}
return added;
}
public boolean onBiomeData(BiomeData biomeData) {
public synchronized boolean onBiomeData(BiomeData biomeData) {
boolean added = false;
if(biomeData != null && !this.biomeCache.contains(biomeData)) {
@@ -137,8 +144,6 @@ public class SeedCracker implements ModInitializer {
} else {
LOG.error("Finished search with no seeds.");
}
this.biomeCache.clear();
} else if(this.worldSeeds != null && biomeData != null) {
this.worldSeeds.removeIf(worldSeed -> {
BiomeLayerSampler sampler = BiomeLayers.build(worldSeed, LevelGeneratorType.DEFAULT,