From 0dbff85bd80ba4892ece5664996714572c0baa5f Mon Sep 17 00:00:00 2001 From: Daniel Mills Date: Thu, 12 Nov 2020 21:02:09 -0500 Subject: [PATCH] Performance! --- .../com/volmit/iris/manager/EditManager.java | 8 ++ .../manager/command/CommandIrisRegen.java | 3 +- .../com/volmit/iris/scaffold/IrisWorlds.java | 22 +++ .../volmit/iris/scaffold/engine/Engine.java | 31 +++- .../engine/EngineCompositeGenerator.java | 132 +++++++++++++++++- .../iris/scaffold/engine/IrisAccess.java | 2 + .../com/volmit/iris/scaffold/hunk/Hunk.java | 44 +++--- .../scaffold/hunk/storage/MappedHunk.java | 32 +++-- .../scaffold/parallax/ParallaxAccess.java | 52 ++++--- .../iris/scaffold/parallel/MultiBurst.java | 8 ++ 10 files changed, 257 insertions(+), 77 deletions(-) diff --git a/src/main/java/com/volmit/iris/manager/EditManager.java b/src/main/java/com/volmit/iris/manager/EditManager.java index c0879d642..f276c4440 100644 --- a/src/main/java/com/volmit/iris/manager/EditManager.java +++ b/src/main/java/com/volmit/iris/manager/EditManager.java @@ -79,6 +79,14 @@ public class EditManager implements Listener } } + public void flushNow() + { + for(World i : editors.k()) + { + editors.remove(i).close(); + } + } + public BlockEditor open(World world) { if(editors.containsKey(world)) diff --git a/src/main/java/com/volmit/iris/manager/command/CommandIrisRegen.java b/src/main/java/com/volmit/iris/manager/command/CommandIrisRegen.java index b5363c937..3923e6b71 100644 --- a/src/main/java/com/volmit/iris/manager/command/CommandIrisRegen.java +++ b/src/main/java/com/volmit/iris/manager/command/CommandIrisRegen.java @@ -46,10 +46,10 @@ public class CommandIrisRegen extends MortarCommand return true; } - //TODO: IrisWorlds.access(world).clearRegeneratedLists(); if(args.length == 0) { sender.sendMessage("Regenerating your chunk"); + IrisWorlds.access(world).clearRegeneratedLists(p.getLocation().getChunk().getX(), p.getLocation().getChunk().getZ()); IrisWorlds.access(world).regenerate(p.getLocation().getChunk().getX(), p.getLocation().getChunk().getZ()); return true; } @@ -58,6 +58,7 @@ public class CommandIrisRegen extends MortarCommand { int m = Integer.valueOf(args[0]); sender.sendMessage("Regenerating " + (m * m) + " Chunks Surrounding you"); + new Spiraler(m, m, (a, b) -> IrisWorlds.access(world).clearRegeneratedLists(a + p.getLocation().getChunk().getX(), b + p.getLocation().getChunk().getZ())).drain(); new Spiraler(m, m, (a, b) -> IrisWorlds.access(world).regenerate(a + p.getLocation().getChunk().getX(), b + p.getLocation().getChunk().getZ())).drain(); } catch(Throwable e) diff --git a/src/main/java/com/volmit/iris/scaffold/IrisWorlds.java b/src/main/java/com/volmit/iris/scaffold/IrisWorlds.java index 62f51d255..895845a10 100644 --- a/src/main/java/com/volmit/iris/scaffold/IrisWorlds.java +++ b/src/main/java/com/volmit/iris/scaffold/IrisWorlds.java @@ -1,8 +1,12 @@ package com.volmit.iris.scaffold; +import com.volmit.iris.Iris; import com.volmit.iris.scaffold.engine.IrisAccess; import com.volmit.iris.util.KMap; +import com.volmit.iris.util.MortarSender; +import org.bukkit.Bukkit; import org.bukkit.World; +import org.bukkit.entity.Player; public class IrisWorlds { @@ -37,4 +41,22 @@ public class IrisWorlds return null; } + + public static boolean evacuate(World world) { + for(World i : Bukkit.getWorlds()) + { + if(!i.getName().equals(world.getName())) + { + for(Player j : world.getPlayers()) + { + new MortarSender(j, Iris.instance.getTag()).sendMessage("You have been evacuated from this world due to a close request."); + j.teleport(i.getSpawnLocation()); + } + + return true; + } + } + + return false; + } } diff --git a/src/main/java/com/volmit/iris/scaffold/engine/Engine.java b/src/main/java/com/volmit/iris/scaffold/engine/Engine.java index 195565441..d13f7aef1 100644 --- a/src/main/java/com/volmit/iris/scaffold/engine/Engine.java +++ b/src/main/java/com/volmit/iris/scaffold/engine/Engine.java @@ -1,14 +1,16 @@ package com.volmit.iris.scaffold.engine; -import com.volmit.iris.Iris; import com.volmit.iris.manager.IrisDataManager; import com.volmit.iris.object.*; import com.volmit.iris.scaffold.cache.Cache; import com.volmit.iris.scaffold.data.DataProvider; import com.volmit.iris.scaffold.hunk.Hunk; import com.volmit.iris.scaffold.parallax.ParallaxAccess; -import com.volmit.iris.util.*; +import com.volmit.iris.util.B; +import com.volmit.iris.util.KList; +import com.volmit.iris.util.RNG; import org.bukkit.Chunk; +import org.bukkit.Material; import org.bukkit.World; import org.bukkit.block.Biome; import org.bukkit.block.Block; @@ -138,14 +140,34 @@ public interface Engine extends DataProvider, Fallible, GeneratorAccess, LootPro Hunk b = getParallax().getUpdatesR(c.getX(), c.getZ()); b.iterateSync((x,y,z,v) -> { + if(v != null && v) { + int vx = x & 15; + int vz = z & 15; update(x,y,z, c, new RNG(Cache.key(c.getX(), c.getZ()))); + + if(vx > 0 && vx < 15 && vz > 0 && vz < 15) + { + updateLighting(x,y,z,c); + } } }); } } + public default void updateLighting(int x, int y, int z, Chunk c) + { + Block block = c.getBlock(x,y,z); + BlockData data = block.getBlockData(); + + if(B.isLit(data)) + { + block.setType(Material.AIR, false); + block.setBlockData(data, true); + } + } + @Override public default void update(int x, int y, int z, Chunk c, RNG rf) { @@ -179,11 +201,6 @@ public interface Engine extends DataProvider, Fallible, GeneratorAccess, LootPro } } } - - else if(B.isLit(data)) - { - Iris.linkBK.updateBlock(block); - } } @Override diff --git a/src/main/java/com/volmit/iris/scaffold/engine/EngineCompositeGenerator.java b/src/main/java/com/volmit/iris/scaffold/engine/EngineCompositeGenerator.java index 2b514995c..aa52637d5 100644 --- a/src/main/java/com/volmit/iris/scaffold/engine/EngineCompositeGenerator.java +++ b/src/main/java/com/volmit/iris/scaffold/engine/EngineCompositeGenerator.java @@ -6,17 +6,18 @@ import com.volmit.iris.generator.legacy.scaffold.TerrainChunk; import com.volmit.iris.manager.IrisDataManager; import com.volmit.iris.object.IrisBiome; import com.volmit.iris.object.IrisDimension; +import com.volmit.iris.scaffold.IrisWorlds; +import com.volmit.iris.scaffold.cache.Cache; import com.volmit.iris.scaffold.hunk.Hunk; import com.volmit.iris.util.KList; import com.volmit.iris.util.M; -import org.bukkit.Bukkit; -import org.bukkit.Chunk; -import org.bukkit.Location; -import org.bukkit.World; +import com.volmit.iris.util.RNG; +import org.bukkit.*; import org.bukkit.block.Biome; import org.bukkit.block.data.BlockData; import org.bukkit.generator.BlockPopulator; import org.bukkit.generator.ChunkGenerator; +import org.bukkit.material.MaterialData; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -260,13 +261,132 @@ public class EngineCompositeGenerator extends ChunkGenerator implements IrisAcce } @Override - public void regenerate(int x, int z) { - // TODO: DO IT + public void clearRegeneratedLists(int x, int z) { + if (true) + { + return; + } + + for(int i = 0; i < getComposite().getSize(); i++) + { + getComposite().getEngine(i).getParallax().delete(x, z); + } } + @Override + public void regenerate(int x, int z) { + if (true) + { + return; + } + + Chunk chunk = getComposite().getWorld().getChunkAt(x, z); + generateChunkRawData(getComposite().getWorld(), x, z, new TerrainChunk() { + @Override + public void setRaw(ChunkData data) { + + } + + @Override + public Biome getBiome(int x, int z) { + return Biome.THE_VOID; + } + + @Override + public Biome getBiome(int x, int y, int z) { + return Biome.THE_VOID; + } + + @Override + public void setBiome(int x, int z, Biome bio) { + + } + + @Override + public void setBiome(int x, int y, int z, Biome bio) { + + } + + @Override + public int getMaxHeight() { + return 256; + } + + @Override + public void setBlock(int x, int y, int z, BlockData blockData) { + Iris.edit.set(compound.getWorld(), x, y, z, blockData); + } + + @Override + public BlockData getBlockData(int x, int y, int z) { + return Iris.edit.get(compound.getWorld(), x, y, z); + } + + @Override + public ChunkData getRaw() { + return null; + } + + @Override + public void inject(BiomeGrid biome) { + + } + + @Override + public void setBlock(int i, int i1, int i2, @NotNull Material material) { + setBlock(i, i1, i2, material.createBlockData()); + } + + @Override + public void setBlock(int i, int i1, int i2, @NotNull MaterialData materialData) { + setBlock(i, i1, i2, materialData.getItemType()); + } + + @Override + public void setRegion(int i, int i1, int i2, int i3, int i4, int i5, @NotNull Material material) { + + } + + @Override + public void setRegion(int i, int i1, int i2, int i3, int i4, int i5, @NotNull MaterialData materialData) { + + } + + @Override + public void setRegion(int i, int i1, int i2, int i3, int i4, int i5, @NotNull BlockData blockData) { + + } + + @NotNull + @Override + public Material getType(int i, int i1, int i2) { + return getBlockData(i, i1, i2).getMaterial(); + } + + @NotNull + @Override + public MaterialData getTypeAndData(int i, int i1, int i2) { + return null; + } + + @Override + public byte getData(int i, int i1, int i2) { + return 0; + } + }); + + Iris.edit.flushNow(); + + for (BlockPopulator i : populators) { + i.populate(compound.getWorld(), new RNG(Cache.key(x, z)), chunk); + } + } + + @Override public void close() { getComposite().close(); + IrisWorlds.evacuate(getComposite().getWorld()); Bukkit.unloadWorld(getComposite().getWorld(), !isStudio()); } diff --git a/src/main/java/com/volmit/iris/scaffold/engine/IrisAccess.java b/src/main/java/com/volmit/iris/scaffold/engine/IrisAccess.java index b3bc12376..0103158bc 100644 --- a/src/main/java/com/volmit/iris/scaffold/engine/IrisAccess.java +++ b/src/main/java/com/volmit/iris/scaffold/engine/IrisAccess.java @@ -206,4 +206,6 @@ public interface IrisAccess extends Hotloadable, DataProvider { triesc.accept(tries.get()); return location.get(); } + + public void clearRegeneratedLists(int x, int z); } diff --git a/src/main/java/com/volmit/iris/scaffold/hunk/Hunk.java b/src/main/java/com/volmit/iris/scaffold/hunk/Hunk.java index 445fb1377..6f9b77c72 100644 --- a/src/main/java/com/volmit/iris/scaffold/hunk/Hunk.java +++ b/src/main/java/com/volmit/iris/scaffold/hunk/Hunk.java @@ -1,5 +1,17 @@ package com.volmit.iris.scaffold.hunk; +import com.volmit.iris.scaffold.hunk.io.HunkIOAdapter; +import com.volmit.iris.scaffold.hunk.storage.*; +import com.volmit.iris.scaffold.hunk.view.*; +import com.volmit.iris.scaffold.parallel.BurstExecutor; +import com.volmit.iris.scaffold.parallel.MultiBurst; +import com.volmit.iris.util.*; +import org.bukkit.Chunk; +import org.bukkit.block.Biome; +import org.bukkit.block.data.BlockData; +import org.bukkit.generator.ChunkGenerator.BiomeGrid; +import org.bukkit.generator.ChunkGenerator.ChunkData; + import java.io.File; import java.io.IOException; import java.io.OutputStream; @@ -7,33 +19,6 @@ import java.util.concurrent.atomic.AtomicInteger; import java.util.function.Consumer; import java.util.function.Predicate; -import com.volmit.iris.scaffold.hunk.view.*; -import org.bukkit.Chunk; -import org.bukkit.block.Biome; -import org.bukkit.block.data.BlockData; -import org.bukkit.generator.ChunkGenerator.BiomeGrid; -import org.bukkit.generator.ChunkGenerator.ChunkData; - -import com.volmit.iris.util.ByteArrayTag; -import com.volmit.iris.util.Consumer2; -import com.volmit.iris.util.Consumer3; -import com.volmit.iris.util.Consumer4; -import com.volmit.iris.util.Consumer5; -import com.volmit.iris.util.Consumer6; -import com.volmit.iris.util.Consumer8; -import com.volmit.iris.util.Function3; -import com.volmit.iris.util.KList; -import com.volmit.iris.scaffold.hunk.io.HunkIOAdapter; -import com.volmit.iris.scaffold.hunk.storage.ArrayHunk; -import com.volmit.iris.scaffold.hunk.storage.AtomicDoubleHunk; -import com.volmit.iris.scaffold.hunk.storage.AtomicHunk; -import com.volmit.iris.scaffold.hunk.storage.AtomicIntegerHunk; -import com.volmit.iris.scaffold.hunk.storage.AtomicLongHunk; -import com.volmit.iris.scaffold.hunk.storage.MappedHunk; -import com.volmit.iris.scaffold.hunk.storage.SynchronizedArrayHunk; -import com.volmit.iris.scaffold.parallel.BurstExecutor; -import com.volmit.iris.scaffold.parallel.MultiBurst; - public interface Hunk { /** @@ -119,6 +104,11 @@ public interface Hunk return new MappedHunk<>(w, h, d); } + public static Hunk newMappedHunkSynced(int w, int h, int d) + { + return new MappedHunk(w, h, d).synchronize(); + } + @SafeVarargs public static Hunk newCombinedMappedHunk(Hunk... hunks) { diff --git a/src/main/java/com/volmit/iris/scaffold/hunk/storage/MappedHunk.java b/src/main/java/com/volmit/iris/scaffold/hunk/storage/MappedHunk.java index 06f8aa2cd..70cfe85a5 100644 --- a/src/main/java/com/volmit/iris/scaffold/hunk/storage/MappedHunk.java +++ b/src/main/java/com/volmit/iris/scaffold/hunk/storage/MappedHunk.java @@ -1,10 +1,8 @@ package com.volmit.iris.scaffold.hunk.storage; -import com.volmit.iris.util.Consumer4; import com.volmit.iris.scaffold.hunk.Hunk; -import com.volmit.iris.util.BlockPosition; +import com.volmit.iris.util.Consumer4; import com.volmit.iris.util.KMap; - import lombok.Data; import lombok.EqualsAndHashCode; @@ -14,7 +12,7 @@ import java.util.Map; @EqualsAndHashCode(callSuper = false) public class MappedHunk extends StorageHunk implements Hunk { - private final KMap data; + private final KMap data; public MappedHunk(int w, int h, int d) { @@ -25,15 +23,31 @@ public class MappedHunk extends StorageHunk implements Hunk @Override public void setRaw(int x, int y, int z, T t) { - data.put(new BlockPosition(x, y, z), t); + if(t == null) + { + data.remove(index(x,y,z)); + return; + } + + data.put(index(x, y, z), t); + } + + private Integer index(int x, int y, int z) + { + return (z * getWidth() * getHeight()) + (y * getWidth()) + x; } @Override - public Hunk iterateSync(Consumer4 c) + public synchronized Hunk iterateSync(Consumer4 c) { - for(Map.Entry g : data.entrySet()) + int idx, z; + + for(Map.Entry g : data.entrySet()) { - c.accept( g.getKey().getX(), g.getKey().getY(), g.getKey().getZ(), g.getValue()); + idx = g.getKey(); + z = idx / (getWidth() * getHeight()); + idx -= (z * getWidth() * getHeight()); + c.accept(idx % getWidth(), idx / getWidth(), z, g.getValue()); } return this; @@ -42,6 +56,6 @@ public class MappedHunk extends StorageHunk implements Hunk @Override public T getRaw(int x, int y, int z) { - return data.get(new BlockPosition(x, y, z)); + return data.get(index(x, y, z)); } } diff --git a/src/main/java/com/volmit/iris/scaffold/parallax/ParallaxAccess.java b/src/main/java/com/volmit/iris/scaffold/parallax/ParallaxAccess.java index 60c6dbca0..e6c3c84f2 100644 --- a/src/main/java/com/volmit/iris/scaffold/parallax/ParallaxAccess.java +++ b/src/main/java/com/volmit/iris/scaffold/parallax/ParallaxAccess.java @@ -3,46 +3,37 @@ package com.volmit.iris.scaffold.parallax; import com.volmit.iris.scaffold.hunk.Hunk; import org.bukkit.block.data.BlockData; -public interface ParallaxAccess -{ - default BlockData getBlock(int x, int y, int z) - { - return getBlocksR(x>>4,z>>4).get(x & 15,y,z & 15); +public interface ParallaxAccess { + default BlockData getBlock(int x, int y, int z) { + return getBlocksR(x >> 4, z >> 4).get(x & 15, y, z & 15); } - default void setBlock(int x, int y, int z, BlockData d) - { - getBlocksRW(x>>4, z>>4).set(x&15, y, z&15, d); + default void setBlock(int x, int y, int z, BlockData d) { + getBlocksRW(x >> 4, z >> 4).set(x & 15, y, z & 15, d); } - default String getObject(int x, int y, int z) - { - return getObjectsR(x>>4,z>>4).get(x & 15,y,z & 15); + default String getObject(int x, int y, int z) { + return getObjectsR(x >> 4, z >> 4).get(x & 15, y, z & 15); } - default void setObject(int x, int y, int z, String d) - { - getObjectsRW(x>>4, z>>4).set(x&15, y, z&15, d); + default void setObject(int x, int y, int z, String d) { + getObjectsRW(x >> 4, z >> 4).set(x & 15, y, z & 15, d); } - default Boolean isUpdate(int x, int y, int z) - { - return getUpdatesR(x>>4,z>>4).get(x & 15,y,z & 15); + default Boolean isUpdate(int x, int y, int z) { + return getUpdatesR(x >> 4, z >> 4).get(x & 15, y, z & 15); } - default void updateBlock(int x, int y, int z) - { + default void updateBlock(int x, int y, int z) { setUpdate(x, y, z, true); } - default void setUpdate(int x, int y, int z, boolean d) - { - getUpdatesRW(x>>4, z>>4).set(x&15, y, z&15, d); + default void setUpdate(int x, int y, int z, boolean d) { + getUpdatesRW(x >> 4, z >> 4).set(x & 15, y, z & 15, d); } - default boolean isParallaxGenerated(int x, int z) - { - return getMetaR(x,z).isParallaxGenerated(); + default boolean isParallaxGenerated(int x, int z) { + return getMetaR(x, z).isParallaxGenerated(); } default boolean isChunkGenerated(int x, int z) { @@ -50,11 +41,11 @@ public interface ParallaxAccess } default void setParallaxGenerated(int x, int z) { - setParallaxGenerated(x,z,true); + setParallaxGenerated(x, z, true); } default void setChunkGenerated(int x, int z) { - setChunkGenerated(x,z,true); + setChunkGenerated(x, z, true); } default void setParallaxGenerated(int x, int z, boolean v) { @@ -92,4 +83,11 @@ public interface ParallaxAccess public int getRegionCount(); public int getChunkCount(); + + public default void delete(int x, int z) + { + getUpdatesRW(x, z).fill(false); + getBlocksRW(x, z).fill(null); + getObjectsRW(x, z).fill(null); + } } diff --git a/src/main/java/com/volmit/iris/scaffold/parallel/MultiBurst.java b/src/main/java/com/volmit/iris/scaffold/parallel/MultiBurst.java index 5533ec368..19fd411e5 100644 --- a/src/main/java/com/volmit/iris/scaffold/parallel/MultiBurst.java +++ b/src/main/java/com/volmit/iris/scaffold/parallel/MultiBurst.java @@ -39,6 +39,14 @@ public class MultiBurst burst(r.length).queue(r).complete(); } + public void sync(Runnable... r) + { + for(Runnable i : r) + { + i.run(); + } + } + public BurstExecutor burst(int estimate) { return new BurstExecutor(service, estimate);