From 2c8c29f4c6af07722a71edab642bd3dd10f6331d Mon Sep 17 00:00:00 2001 From: Unknown Date: Fri, 15 Nov 2019 07:41:10 -0500 Subject: [PATCH] multi-threaded finders --- .../kaptainwutax/seedcracker/FinderQueue.java | 27 ++++++++++++------- .../kaptainwutax/seedcracker/SeedCracker.java | 25 ++++++++++------- 2 files changed, 33 insertions(+), 19 deletions(-) diff --git a/src/main/java/kaptainwutax/seedcracker/FinderQueue.java b/src/main/java/kaptainwutax/seedcracker/FinderQueue.java index b9e8ec0..a169897 100644 --- a/src/main/java/kaptainwutax/seedcracker/FinderQueue.java +++ b/src/main/java/kaptainwutax/seedcracker/FinderQueue.java @@ -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 finderBuilders = new ArrayList<>(); - private List activeFinders = new ArrayList<>(); + private Set 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 finders = finderBuilder.build(world, chunkPos); + SERVICE.submit(() -> { + List 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); } } diff --git a/src/main/java/kaptainwutax/seedcracker/SeedCracker.java b/src/main/java/kaptainwutax/seedcracker/SeedCracker.java index 4599431..fe4478a 100644 --- a/src/main/java/kaptainwutax/seedcracker/SeedCracker.java +++ b/src/main/java/kaptainwutax/seedcracker/SeedCracker.java @@ -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,