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