Performance!

This commit is contained in:
Daniel Mills 2020-11-12 21:02:09 -05:00
parent bf9c4c602b
commit 0dbff85bd8
10 changed files with 257 additions and 77 deletions

View File

@ -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) public BlockEditor open(World world)
{ {
if(editors.containsKey(world)) if(editors.containsKey(world))

View File

@ -46,10 +46,10 @@ public class CommandIrisRegen extends MortarCommand
return true; return true;
} }
//TODO: IrisWorlds.access(world).clearRegeneratedLists();
if(args.length == 0) if(args.length == 0)
{ {
sender.sendMessage("Regenerating your chunk"); 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()); IrisWorlds.access(world).regenerate(p.getLocation().getChunk().getX(), p.getLocation().getChunk().getZ());
return true; return true;
} }
@ -58,6 +58,7 @@ public class CommandIrisRegen extends MortarCommand
{ {
int m = Integer.valueOf(args[0]); int m = Integer.valueOf(args[0]);
sender.sendMessage("Regenerating " + (m * m) + " Chunks Surrounding you"); 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(); new Spiraler(m, m, (a, b) -> IrisWorlds.access(world).regenerate(a + p.getLocation().getChunk().getX(), b + p.getLocation().getChunk().getZ())).drain();
} }
catch(Throwable e) catch(Throwable e)

View File

@ -1,8 +1,12 @@
package com.volmit.iris.scaffold; package com.volmit.iris.scaffold;
import com.volmit.iris.Iris;
import com.volmit.iris.scaffold.engine.IrisAccess; import com.volmit.iris.scaffold.engine.IrisAccess;
import com.volmit.iris.util.KMap; import com.volmit.iris.util.KMap;
import com.volmit.iris.util.MortarSender;
import org.bukkit.Bukkit;
import org.bukkit.World; import org.bukkit.World;
import org.bukkit.entity.Player;
public class IrisWorlds public class IrisWorlds
{ {
@ -37,4 +41,22 @@ public class IrisWorlds
return null; 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;
}
} }

View File

@ -1,14 +1,16 @@
package com.volmit.iris.scaffold.engine; package com.volmit.iris.scaffold.engine;
import com.volmit.iris.Iris;
import com.volmit.iris.manager.IrisDataManager; import com.volmit.iris.manager.IrisDataManager;
import com.volmit.iris.object.*; import com.volmit.iris.object.*;
import com.volmit.iris.scaffold.cache.Cache; import com.volmit.iris.scaffold.cache.Cache;
import com.volmit.iris.scaffold.data.DataProvider; import com.volmit.iris.scaffold.data.DataProvider;
import com.volmit.iris.scaffold.hunk.Hunk; import com.volmit.iris.scaffold.hunk.Hunk;
import com.volmit.iris.scaffold.parallax.ParallaxAccess; 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.Chunk;
import org.bukkit.Material;
import org.bukkit.World; import org.bukkit.World;
import org.bukkit.block.Biome; import org.bukkit.block.Biome;
import org.bukkit.block.Block; import org.bukkit.block.Block;
@ -138,14 +140,34 @@ public interface Engine extends DataProvider, Fallible, GeneratorAccess, LootPro
Hunk<Boolean> b = getParallax().getUpdatesR(c.getX(), c.getZ()); Hunk<Boolean> b = getParallax().getUpdatesR(c.getX(), c.getZ());
b.iterateSync((x,y,z,v) -> { b.iterateSync((x,y,z,v) -> {
if(v != null && 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()))); 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 @Override
public default void update(int x, int y, int z, Chunk c, RNG rf) 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 @Override

View File

@ -6,17 +6,18 @@ import com.volmit.iris.generator.legacy.scaffold.TerrainChunk;
import com.volmit.iris.manager.IrisDataManager; import com.volmit.iris.manager.IrisDataManager;
import com.volmit.iris.object.IrisBiome; import com.volmit.iris.object.IrisBiome;
import com.volmit.iris.object.IrisDimension; 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.scaffold.hunk.Hunk;
import com.volmit.iris.util.KList; import com.volmit.iris.util.KList;
import com.volmit.iris.util.M; import com.volmit.iris.util.M;
import org.bukkit.Bukkit; import com.volmit.iris.util.RNG;
import org.bukkit.Chunk; import org.bukkit.*;
import org.bukkit.Location;
import org.bukkit.World;
import org.bukkit.block.Biome; import org.bukkit.block.Biome;
import org.bukkit.block.data.BlockData; import org.bukkit.block.data.BlockData;
import org.bukkit.generator.BlockPopulator; import org.bukkit.generator.BlockPopulator;
import org.bukkit.generator.ChunkGenerator; import org.bukkit.generator.ChunkGenerator;
import org.bukkit.material.MaterialData;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
@ -260,13 +261,132 @@ public class EngineCompositeGenerator extends ChunkGenerator implements IrisAcce
} }
@Override @Override
public void regenerate(int x, int z) { public void clearRegeneratedLists(int x, int z) {
// TODO: DO IT 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 @Override
public void close() { public void close() {
getComposite().close(); getComposite().close();
IrisWorlds.evacuate(getComposite().getWorld());
Bukkit.unloadWorld(getComposite().getWorld(), !isStudio()); Bukkit.unloadWorld(getComposite().getWorld(), !isStudio());
} }

View File

@ -206,4 +206,6 @@ public interface IrisAccess extends Hotloadable, DataProvider {
triesc.accept(tries.get()); triesc.accept(tries.get());
return location.get(); return location.get();
} }
public void clearRegeneratedLists(int x, int z);
} }

View File

@ -1,5 +1,17 @@
package com.volmit.iris.scaffold.hunk; 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.File;
import java.io.IOException; import java.io.IOException;
import java.io.OutputStream; import java.io.OutputStream;
@ -7,33 +19,6 @@ import java.util.concurrent.atomic.AtomicInteger;
import java.util.function.Consumer; import java.util.function.Consumer;
import java.util.function.Predicate; 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<T> public interface Hunk<T>
{ {
/** /**
@ -119,6 +104,11 @@ public interface Hunk<T>
return new MappedHunk<>(w, h, d); return new MappedHunk<>(w, h, d);
} }
public static <T> Hunk<T> newMappedHunkSynced(int w, int h, int d)
{
return new MappedHunk<T>(w, h, d).synchronize();
}
@SafeVarargs @SafeVarargs
public static <T> Hunk<T> newCombinedMappedHunk(Hunk<T>... hunks) public static <T> Hunk<T> newCombinedMappedHunk(Hunk<T>... hunks)
{ {

View File

@ -1,10 +1,8 @@
package com.volmit.iris.scaffold.hunk.storage; package com.volmit.iris.scaffold.hunk.storage;
import com.volmit.iris.util.Consumer4;
import com.volmit.iris.scaffold.hunk.Hunk; 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 com.volmit.iris.util.KMap;
import lombok.Data; import lombok.Data;
import lombok.EqualsAndHashCode; import lombok.EqualsAndHashCode;
@ -14,7 +12,7 @@ import java.util.Map;
@EqualsAndHashCode(callSuper = false) @EqualsAndHashCode(callSuper = false)
public class MappedHunk<T> extends StorageHunk<T> implements Hunk<T> public class MappedHunk<T> extends StorageHunk<T> implements Hunk<T>
{ {
private final KMap<BlockPosition, T> data; private final KMap<Integer, T> data;
public MappedHunk(int w, int h, int d) public MappedHunk(int w, int h, int d)
{ {
@ -25,15 +23,31 @@ public class MappedHunk<T> extends StorageHunk<T> implements Hunk<T>
@Override @Override
public void setRaw(int x, int y, int z, T t) 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 @Override
public Hunk<T> iterateSync(Consumer4<Integer, Integer, Integer, T> c) public synchronized Hunk<T> iterateSync(Consumer4<Integer, Integer, Integer, T> c)
{ {
for(Map.Entry<BlockPosition, T> g : data.entrySet()) int idx, z;
for(Map.Entry<Integer, T> 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; return this;
@ -42,6 +56,6 @@ public class MappedHunk<T> extends StorageHunk<T> implements Hunk<T>
@Override @Override
public T getRaw(int x, int y, int z) public T getRaw(int x, int y, int z)
{ {
return data.get(new BlockPosition(x, y, z)); return data.get(index(x, y, z));
} }
} }

View File

@ -3,46 +3,37 @@ package com.volmit.iris.scaffold.parallax;
import com.volmit.iris.scaffold.hunk.Hunk; import com.volmit.iris.scaffold.hunk.Hunk;
import org.bukkit.block.data.BlockData; import org.bukkit.block.data.BlockData;
public interface ParallaxAccess public interface ParallaxAccess {
{ default BlockData getBlock(int x, int y, int z) {
default BlockData getBlock(int x, int y, int z) return getBlocksR(x >> 4, z >> 4).get(x & 15, y, z & 15);
{
return getBlocksR(x>>4,z>>4).get(x & 15,y,z & 15);
} }
default void setBlock(int x, int y, int z, BlockData d) default void setBlock(int x, int y, int z, BlockData d) {
{ getBlocksRW(x >> 4, z >> 4).set(x & 15, y, z & 15, d);
getBlocksRW(x>>4, z>>4).set(x&15, y, z&15, d);
} }
default String getObject(int x, int y, int z) default String getObject(int x, int y, int z) {
{ return getObjectsR(x >> 4, z >> 4).get(x & 15, y, z & 15);
return getObjectsR(x>>4,z>>4).get(x & 15,y,z & 15);
} }
default void setObject(int x, int y, int z, String d) default void setObject(int x, int y, int z, String d) {
{ getObjectsRW(x >> 4, z >> 4).set(x & 15, y, z & 15, d);
getObjectsRW(x>>4, z>>4).set(x&15, y, z&15, d);
} }
default Boolean isUpdate(int x, int y, int z) default Boolean isUpdate(int x, int y, int z) {
{ return getUpdatesR(x >> 4, z >> 4).get(x & 15, y, z & 15);
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); setUpdate(x, y, z, true);
} }
default void setUpdate(int x, int y, int z, boolean d) default void setUpdate(int x, int y, int z, boolean d) {
{ getUpdatesRW(x >> 4, z >> 4).set(x & 15, y, z & 15, d);
getUpdatesRW(x>>4, z>>4).set(x&15, y, z&15, d);
} }
default boolean isParallaxGenerated(int x, int z) default boolean isParallaxGenerated(int x, int z) {
{ return getMetaR(x, z).isParallaxGenerated();
return getMetaR(x,z).isParallaxGenerated();
} }
default boolean isChunkGenerated(int x, int z) { default boolean isChunkGenerated(int x, int z) {
@ -50,11 +41,11 @@ public interface ParallaxAccess
} }
default void setParallaxGenerated(int x, int z) { default void setParallaxGenerated(int x, int z) {
setParallaxGenerated(x,z,true); setParallaxGenerated(x, z, true);
} }
default void setChunkGenerated(int x, int z) { default void setChunkGenerated(int x, int z) {
setChunkGenerated(x,z,true); setChunkGenerated(x, z, true);
} }
default void setParallaxGenerated(int x, int z, boolean v) { default void setParallaxGenerated(int x, int z, boolean v) {
@ -92,4 +83,11 @@ public interface ParallaxAccess
public int getRegionCount(); public int getRegionCount();
public int getChunkCount(); 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);
}
} }

View File

@ -39,6 +39,14 @@ public class MultiBurst
burst(r.length).queue(r).complete(); burst(r.length).queue(r).complete();
} }
public void sync(Runnable... r)
{
for(Runnable i : r)
{
i.run();
}
}
public BurstExecutor burst(int estimate) public BurstExecutor burst(int estimate)
{ {
return new BurstExecutor(service, estimate); return new BurstExecutor(service, estimate);