From af9f01787139e6295111ed8e2663b0d8b87a3960 Mon Sep 17 00:00:00 2001 From: DanMB Date: Sun, 7 Aug 2022 16:09:36 -0700 Subject: [PATCH] Hold your horses pregenerator --- .../core/pregenerator/IrisPregenerator.java | 23 ++++++++++++++++--- 1 file changed, 20 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/volmit/iris/core/pregenerator/IrisPregenerator.java b/src/main/java/com/volmit/iris/core/pregenerator/IrisPregenerator.java index d143cea84..00f7fd6a0 100644 --- a/src/main/java/com/volmit/iris/core/pregenerator/IrisPregenerator.java +++ b/src/main/java/com/volmit/iris/core/pregenerator/IrisPregenerator.java @@ -29,6 +29,7 @@ import com.volmit.iris.util.scheduling.ChronoLatch; import com.volmit.iris.util.scheduling.J; import com.volmit.iris.util.scheduling.Looper; +import java.util.concurrent.Semaphore; import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicLong; @@ -55,10 +56,12 @@ public class IrisPregenerator { private final KSet retry; private final KSet net; private final ChronoLatch cl; + private final Semaphore limiter; public IrisPregenerator(PregenTask task, PregeneratorMethod generator, PregenListener listener) { this.listener = listenify(listener); cl = new ChronoLatch(5000); + limiter = new Semaphore(Runtime.getRuntime().availableProcessors()); generatedRegions = new KSet<>(); this.shutdown = new AtomicBoolean(false); this.paused = new AtomicBoolean(false); @@ -163,12 +166,26 @@ public class IrisPregenerator { boolean hit = false; if(generator.supportsRegions(x, z, listener) && regions) { hit = true; - listener.onRegionGenerating(x, z); - generator.generateRegion(x, z, listener); + try { + limiter.acquire(); + listener.onRegionGenerating(x, z); + generator.generateRegion(x, z, listener); + limiter.release(); + } catch (InterruptedException e) { + throw new RuntimeException(e); + } } else if(!regions) { hit = true; listener.onRegionGenerating(x, z); - PregenTask.iterateRegion(x, z, (xx, zz) -> generator.generateChunk(xx, zz, listener)); + PregenTask.iterateRegion(x, z, (xx, zz) -> { + try { + limiter.acquire(); + generator.generateChunk(xx, zz, listener); + limiter.release(); + } catch (InterruptedException e) { + throw new RuntimeException(e); + } + }); } if(hit) {