From 9bdcd6aacec3300aa4bfc4a7b537dcf25fbaa9df Mon Sep 17 00:00:00 2001 From: Daniel Mills Date: Wed, 9 Sep 2020 08:38:12 -0400 Subject: [PATCH] Fix --- .../iris/gen/ParallaxTerrainProvider.java | 3 +- .../iris/gen/atomics/AtomicWorldData.java | 5 ++ .../volmit/iris/gen/atomics/MasterLock.java | 17 +++++ .../iris/gen/provisions/ProvisionBukkit.java | 13 ++-- .../java/com/volmit/iris/gui/PregenGui.java | 26 +++++-- .../java/com/volmit/iris/util/IrisLock.java | 10 ++- .../java/com/volmit/iris/util/PregenJob.java | 67 +++++++++++-------- 7 files changed, 101 insertions(+), 40 deletions(-) diff --git a/src/main/java/com/volmit/iris/gen/ParallaxTerrainProvider.java b/src/main/java/com/volmit/iris/gen/ParallaxTerrainProvider.java index b2d163c74..e8411aa87 100644 --- a/src/main/java/com/volmit/iris/gen/ParallaxTerrainProvider.java +++ b/src/main/java/com/volmit/iris/gen/ParallaxTerrainProvider.java @@ -56,6 +56,7 @@ public abstract class ParallaxTerrainProvider extends TopographicTerrainProvider setSliverCache(new KMap<>()); setSliverBuffer(sliverBuffer); setMasterLock(new MasterLock()); + getMasterLock().disable(); } public void onInit(RNG rng) @@ -157,7 +158,7 @@ public abstract class ParallaxTerrainProvider extends TopographicTerrainProvider return new AtomicSliverMap(); } - + @Override public List getPopulators() { diff --git a/src/main/java/com/volmit/iris/gen/atomics/AtomicWorldData.java b/src/main/java/com/volmit/iris/gen/atomics/AtomicWorldData.java index 75b09c91e..bc976489c 100644 --- a/src/main/java/com/volmit/iris/gen/atomics/AtomicWorldData.java +++ b/src/main/java/com/volmit/iris/gen/atomics/AtomicWorldData.java @@ -8,6 +8,7 @@ import java.io.IOException; import com.volmit.iris.Iris; import com.volmit.iris.gen.scaffold.TerrainTarget; import com.volmit.iris.util.ChunkPosition; +import com.volmit.iris.util.IrisLock; import com.volmit.iris.util.KList; import com.volmit.iris.util.KMap; import com.volmit.iris.util.M; @@ -21,6 +22,7 @@ public class AtomicWorldData private KMap lastChunk; private KList unloadRegions; private KList unloadChunks; + private IrisLock lock = new IrisLock("ULLock"); private long last = M.ms(); public AtomicWorldData(TerrainTarget world) @@ -263,8 +265,10 @@ public class AtomicWorldData public void clean(int j) { + lock.lock(); if(M.ms() - last < getUnloadBatchSpeed()) { + lock.unlock(); return; } @@ -331,6 +335,7 @@ public class AtomicWorldData } unloadChunks.clear(); + lock.unlock(); } private int getUnloadBatchSize() diff --git a/src/main/java/com/volmit/iris/gen/atomics/MasterLock.java b/src/main/java/com/volmit/iris/gen/atomics/MasterLock.java index b5a6c2a0b..733575a76 100644 --- a/src/main/java/com/volmit/iris/gen/atomics/MasterLock.java +++ b/src/main/java/com/volmit/iris/gen/atomics/MasterLock.java @@ -7,9 +7,11 @@ public class MasterLock { private KMap locks; private IrisLock lock; + private boolean enabled; public MasterLock() { + enabled = true; locks = new KMap<>(); lock = new IrisLock("MasterLock"); } @@ -19,8 +21,18 @@ public class MasterLock locks.clear(); } + public void disable() + { + enabled = false; + } + public void lock(String key) { + if(!enabled) + { + return; + } + lock.lock(); if(!locks.containsKey(key)) { @@ -34,6 +46,11 @@ public class MasterLock public void unlock(String key) { + if(!enabled) + { + return; + } + lock.lock(); if(!locks.containsKey(key)) { diff --git a/src/main/java/com/volmit/iris/gen/provisions/ProvisionBukkit.java b/src/main/java/com/volmit/iris/gen/provisions/ProvisionBukkit.java index ba32821e0..f90f1bef4 100644 --- a/src/main/java/com/volmit/iris/gen/provisions/ProvisionBukkit.java +++ b/src/main/java/com/volmit/iris/gen/provisions/ProvisionBukkit.java @@ -2,6 +2,7 @@ package com.volmit.iris.gen.provisions; import java.util.List; import java.util.Random; +import java.util.function.Consumer; import org.bukkit.Location; import org.bukkit.World; @@ -13,7 +14,6 @@ import com.volmit.iris.gen.scaffold.Provisioned; import com.volmit.iris.gen.scaffold.TerrainChunk; import com.volmit.iris.gen.scaffold.TerrainProvider; import com.volmit.iris.util.ChunkPosition; -import com.volmit.iris.util.J; import com.volmit.iris.util.KMap; import com.volmit.iris.util.RNG; @@ -41,7 +41,7 @@ public class ProvisionBukkit extends ChunkGenerator implements Provisioned world.unloadChunkRequest(x, z); } - public void generateAsync(World world, int x, int z) + public void generateAsync(World world, int x, int z, Consumer onDone) { ChunkPosition c = new ChunkPosition(x, z); @@ -50,7 +50,12 @@ public class ProvisionBukkit extends ChunkGenerator implements Provisioned TerrainChunk snapshot = TerrainChunk.create(world); snapshot.setRaw(generateChunkData(world, getRNG(world, x, z), x, z, snapshot)); precache.put(c, snapshot); - J.s(() -> generate(world, x, z)); + onDone.accept(true); + } + + else + { + onDone.accept(false); } } @@ -70,7 +75,7 @@ public class ProvisionBukkit extends ChunkGenerator implements Provisioned { TerrainChunk snapshot = precache.remove(c); snapshot.inject(biome); - return snapshot; + return snapshot.getRaw(); } } diff --git a/src/main/java/com/volmit/iris/gui/PregenGui.java b/src/main/java/com/volmit/iris/gui/PregenGui.java index 8c3684065..49f3669d0 100644 --- a/src/main/java/com/volmit/iris/gui/PregenGui.java +++ b/src/main/java/com/volmit/iris/gui/PregenGui.java @@ -9,6 +9,7 @@ import java.awt.image.BufferedImage; import java.awt.image.ImageObserver; import java.io.File; import java.io.IOException; +import java.util.concurrent.locks.ReentrantLock; import javax.imageio.ImageIO; import javax.swing.JFrame; @@ -30,6 +31,7 @@ public class PregenGui extends JPanel Graphics2D bg; double minC; double maxC; + private ReentrantLock l; private BufferedImage image = new BufferedImage(res, res, BufferedImage.TYPE_INT_RGB); public PregenGui() @@ -44,11 +46,21 @@ public class PregenGui extends JPanel maxC = Math.floorDiv(job.max(), 16) + 4; Graphics2D g = (Graphics2D) gx; bg = (Graphics2D) image.getGraphics(); - + + l.lock(); while(order.isNotEmpty()) { - order.pop().run(); + try + { + order.pop().run(); + } + + catch(Throwable e) + { + + } } + l.unlock(); g.drawImage(image, 0, 0, getParent().getWidth(), getParent().getHeight(), new ImageObserver() { @@ -69,11 +81,8 @@ public class PregenGui extends JPanel g.drawString(i, 20, hh += h); } - J.a(() -> - { - J.sleep((long) 500); - repaint(); - }); + J.sleep((long) 1); + repaint(); } private void draw(ChunkPosition p, Color c, double minC, double maxC, Graphics2D bg) @@ -94,10 +103,13 @@ public class PregenGui extends JPanel { JFrame frame = new JFrame("Pregen View"); PregenGui nv = new PregenGui(); + nv.l = new ReentrantLock(); nv.job = j; j.subscribe((c, b) -> { + nv.l.lock(); nv.order.add(() -> nv.draw(c, b, nv.minC, nv.maxC, nv.bg)); + nv.l.unlock(); }); frame.add(nv); frame.setSize(1000, 1000); diff --git a/src/main/java/com/volmit/iris/util/IrisLock.java b/src/main/java/com/volmit/iris/util/IrisLock.java index 4868a85b3..63bc8420f 100644 --- a/src/main/java/com/volmit/iris/util/IrisLock.java +++ b/src/main/java/com/volmit/iris/util/IrisLock.java @@ -33,6 +33,14 @@ public class IrisLock { return; } - lock.unlock(); + try + { + lock.unlock(); + } + + catch(Throwable e) + { + + } } } diff --git a/src/main/java/com/volmit/iris/util/PregenJob.java b/src/main/java/com/volmit/iris/util/PregenJob.java index 23d938683..eacfc756a 100644 --- a/src/main/java/com/volmit/iris/util/PregenJob.java +++ b/src/main/java/com/volmit/iris/util/PregenJob.java @@ -1,6 +1,7 @@ package com.volmit.iris.util; import java.awt.Color; +import java.util.concurrent.atomic.AtomicInteger; import org.bukkit.Bukkit; import org.bukkit.Chunk; @@ -20,6 +21,7 @@ public class PregenJob implements Listener private int genned; private boolean completed; public static int task = -1; + private AtomicInteger g = new AtomicInteger(); private PrecisionStopwatch s; private ChronoLatch cl; private ChronoLatch clx; @@ -35,10 +37,12 @@ public class PregenJob implements Listener private Spiraler chunkSpiraler; private boolean first; private Consumer2 consumer; - private int cubeSize = 5; + private int cubeSize = 7; + int xc = 0; public PregenJob(World world, int size, MortarSender sender, Runnable onDone) { + g.set(0); this.s = PrecisionStopwatch.start(); Iris.instance.registerListener(this); this.world = world; @@ -107,7 +111,7 @@ public class PregenJob implements Listener PrecisionStopwatch p = PrecisionStopwatch.start(); - while(p.getMilliseconds() < 5000) + while(p.getMilliseconds() < 7000) { tick(); } @@ -161,30 +165,7 @@ public class PregenJob implements Listener if(chunkSpiraler.hasNext()) { chunkSpiraler.next(); - - if(isChunkWithin(chunkX, chunkZ)) - { - if(consumer != null) - { - consumer.accept(new ChunkPosition(chunkX, chunkZ), Color.cyan.darker().darker()); - } - - world.loadChunk(chunkX, chunkZ); - genned++; - - if(consumer != null) - { - consumer.accept(new ChunkPosition(chunkX, chunkZ), Color.BLUE); - } - } - - else - { - if(consumer != null) - { - consumer.accept(new ChunkPosition(chunkX, chunkZ), Color.GREEN.darker()); - } - } + tickChunk(); } else if(spiraler.hasNext()) @@ -219,6 +200,38 @@ public class PregenJob implements Listener } } + private void tickChunk() + { + tickSyncChunk(); + } + + private void tickSyncChunk() + { + if(isChunkWithin(chunkX, chunkZ)) + { + if(consumer != null) + { + consumer.accept(new ChunkPosition(chunkX, chunkZ), Color.blue.darker().darker()); + } + + world.loadChunk(chunkX, chunkZ); + genned++; + + if(consumer != null) + { + consumer.accept(new ChunkPosition(chunkX, chunkZ), Color.BLUE); + } + } + + else + { + if(consumer != null) + { + consumer.accept(new ChunkPosition(chunkX, chunkZ), Color.blue.brighter().brighter()); + } + } + } + public void saveAllRequest() { if(clf.flip()) @@ -240,7 +253,7 @@ public class PregenJob implements Listener { if(e.getWorld().equals(world) && isChunkWithin(e.getChunk().getX(), e.getChunk().getZ()) && consumer != null) { - consumer.accept(new ChunkPosition(e.getChunk().getX(), e.getChunk().getZ()), Color.GREEN); + consumer.accept(new ChunkPosition(e.getChunk().getX(), e.getChunk().getZ()), Color.blue.brighter()); } }