This commit is contained in:
Daniel Mills
2020-11-15 23:36:33 -05:00
parent 116ab72f4e
commit 6d08faa30f
33 changed files with 576 additions and 265 deletions

View File

@@ -4,6 +4,8 @@ import com.volmit.iris.Iris;
import com.volmit.iris.scaffold.engine.*;
import com.volmit.iris.scaffold.hunk.Hunk;
import com.volmit.iris.scaffold.parallel.MultiBurst;
import com.volmit.iris.util.PrecisionStopwatch;
import com.volmit.iris.util.RNG;
import lombok.Getter;
import lombok.Setter;
import org.bukkit.Chunk;
@@ -36,15 +38,20 @@ public class IrisEngine extends BlockPopulator implements Engine
@Getter
private final int index;
@Getter
private final EngineMetrics metrics;
@Setter
@Getter
private volatile int minHeight;
private boolean failing;
private boolean closed;
private int cacheId;
public IrisEngine(EngineTarget target, EngineCompound compound, int index)
{
Iris.info("Initializing Engine: " + target.getWorld().getName() + "/" + target.getDimension().getLoadKey() + " (" + target.getHeight() + " height)");
metrics = new EngineMetrics(32);
this.target = target;
this.framework = new IrisEngineFramework(this);
worldManager = new IrisWorldManager(this);
@@ -53,6 +60,7 @@ public class IrisEngine extends BlockPopulator implements Engine
failing = false;
closed = false;
this.index = index;
cacheId = RNG.r.nextInt();
}
@Override
@@ -82,6 +90,7 @@ public class IrisEngine extends BlockPopulator implements Engine
public void generate(int x, int z, Hunk<BlockData> vblocks, Hunk<Biome> vbiomes) {
try
{
PrecisionStopwatch p = PrecisionStopwatch.start();
Hunk<Biome> biomes = vbiomes;
Hunk<BlockData> blocks = vblocks.synchronize().listen((xx,y,zz,t) -> catchBlockUpdates(x+xx,y+getMinHeight(),z+zz, t));
@@ -102,6 +111,7 @@ public class IrisEngine extends BlockPopulator implements Engine
getFramework().getEngineParallax().insertParallax(x, z, blocks);
getFramework().recycle();
getMetrics().getTotal().put(p.getMilliseconds());
}
catch(Throwable e)
{
@@ -127,4 +137,14 @@ public class IrisEngine extends BlockPopulator implements Engine
public boolean hasFailed() {
return failing;
}
@Override
public int getCacheID() {
return cacheId;
}
@Override
public void hotload() {
cacheId = RNG.r.nextInt();
}
}

View File

@@ -11,12 +11,13 @@ import com.volmit.iris.scaffold.engine.EngineTarget;
import com.volmit.iris.scaffold.hunk.Hunk;
import com.volmit.iris.scaffold.parallel.BurstExecutor;
import com.volmit.iris.scaffold.parallel.MultiBurst;
import com.volmit.iris.util.KList;
import com.volmit.iris.util.*;
import lombok.Getter;
import lombok.Setter;
import org.bukkit.World;
import org.bukkit.block.Biome;
import org.bukkit.block.data.BlockData;
import org.bukkit.command.CommandSender;
import org.bukkit.event.EventHandler;
import org.bukkit.event.world.WorldSaveEvent;
import org.bukkit.generator.BlockPopulator;
@@ -29,6 +30,8 @@ public class IrisEngineCompound implements EngineCompound {
@Getter
private final World world;
private final AtomicRollingSequence wallClock;
@Getter
private final EngineData engineMetadata;
@@ -52,6 +55,7 @@ public class IrisEngineCompound implements EngineCompound {
public IrisEngineCompound(World world, IrisDimension rootDimension, IrisDataManager data, int maximumThreads)
{
wallClock = new AtomicRollingSequence(32);
this.rootDimension = rootDimension;
Iris.info("Initializing Engine Composite for " + world.getName());
this.world = world;
@@ -116,6 +120,75 @@ public class IrisEngineCompound implements EngineCompound {
}
}
public void printMetrics(CommandSender sender)
{
KMap<String, Double> totals = new KMap<>();
KMap<String, Double> weights = new KMap<>();
double masterWallClock = wallClock.getAverage();
for(int i = 0; i < getSize(); i++)
{
Engine e = getEngine(i);
KMap<String, Double> timings = e.getMetrics().pull();
double totalWeight = 0;
double wallClock = e.getMetrics().getTotal().getAverage();
for(double j : timings.values())
{
totalWeight += j;
}
for(String j : timings.k())
{
weights.put(e.getName() + "[" + e.getIndex() + "]." + j, (wallClock / totalWeight) * timings.get(j));
}
totals.put(e.getName() + "[" + e.getIndex() + "]", wallClock);
}
double mtotals = 0;
for(double i : totals.values())
{
mtotals+=i;
}
for(String i : totals.k())
{
totals.put(i, (masterWallClock / mtotals) * totals.get(i));
}
double v = 0;
for(double i : weights.values())
{
v+=i;
}
for(String i : weights.k())
{
weights.put(i, weights.get(i) / v);
}
sender.sendMessage("Total: " + C.BOLD + C.WHITE + Form.duration(masterWallClock, 0));
for(String i : totals.k())
{
sender.sendMessage(" Engine " + C.UNDERLINE + C.GREEN + i + C.RESET + ": " + C.BOLD + C.WHITE + Form.duration(totals.get(i), 0));
}
sender.sendMessage("Details: ");
for(String i : weights.sortKNumber().reverse())
{
String befb = C.UNDERLINE +""+ C.GREEN + "" + i.split("\\Q[\\E")[0] + C.RESET + C.GRAY + "[";
String num = C.GOLD + i.split("\\Q[\\E")[1].split("]")[0] + C.RESET + C.GRAY + "].";
String afb = C.ITALIC +""+ C.AQUA + i.split("\\Q]\\E")[1].substring(1) + C.RESET + C.GRAY;
sender.sendMessage(" " + befb + num + afb + ": " + C.BOLD + C.WHITE + Form.pc(weights.get(i), 0));
}
}
private File getEngineMetadataFile() {
return new File(world.getWorldFolder(), "iris/engine-metadata.json");
}
@@ -123,6 +196,7 @@ public class IrisEngineCompound implements EngineCompound {
@Override
public void generate(int x, int z, Hunk<BlockData> blocks, Hunk<Biome> biomes)
{
PrecisionStopwatch p = PrecisionStopwatch.start();
if(engines.length == 1 && !getEngine(0).getTarget().isInverted())
{
engines[0].generate(x, z, blocks, biomes);
@@ -166,8 +240,9 @@ public class IrisEngineCompound implements EngineCompound {
insert[i].run();
}
}
}
wallClock.put(p.getMilliseconds());
}
@Override
public int getSize() {
@@ -194,4 +269,12 @@ public class IrisEngineCompound implements EngineCompound {
public boolean isFailing() {
return false;
}
@Override
public void hotload() {
for(int i = 0; i < getSize(); i++)
{
getEngine(i).hotload();
}
}
}

View File

@@ -3,6 +3,7 @@ package com.volmit.iris.generator.actuator;
import com.volmit.iris.scaffold.engine.Engine;
import com.volmit.iris.scaffold.engine.EngineAssignedActuator;
import com.volmit.iris.scaffold.hunk.Hunk;
import com.volmit.iris.util.PrecisionStopwatch;
import org.bukkit.block.Biome;
public class IrisBiomeActuator extends EngineAssignedActuator<Biome>
@@ -13,6 +14,7 @@ public class IrisBiomeActuator extends EngineAssignedActuator<Biome>
@Override
public void onActuate(int x, int z, Hunk<Biome> h) {
PrecisionStopwatch p = PrecisionStopwatch.start();
int i,zf;
Biome v;
@@ -28,5 +30,6 @@ public class IrisBiomeActuator extends EngineAssignedActuator<Biome>
}
}
}
getEngine().getMetrics().getBiome().put(p.getMilliseconds());
}
}

View File

@@ -1,6 +1,7 @@
package com.volmit.iris.generator.actuator;
import com.volmit.iris.object.IrisBiome;
import com.volmit.iris.util.PrecisionStopwatch;
import com.volmit.iris.util.RNG;
import com.volmit.iris.generator.decorator.IrisCeilingDecorator;
import com.volmit.iris.generator.decorator.IrisSeaSurfaceDecorator;
@@ -47,6 +48,7 @@ public class IrisDecorantActuator extends EngineAssignedActuator<BlockData>
return;
}
PrecisionStopwatch p = PrecisionStopwatch.start();
boolean solid;
int emptyFor = 0;
int lastSolid = 0;
@@ -108,6 +110,8 @@ public class IrisDecorantActuator extends EngineAssignedActuator<BlockData>
}
}
}
getEngine().getMetrics().getDecoration().put(p.getMilliseconds());
}
private boolean shouldRayDecorate()

View File

@@ -2,6 +2,7 @@ package com.volmit.iris.generator.actuator;
import com.volmit.iris.object.IrisBiome;
import com.volmit.iris.util.KList;
import com.volmit.iris.util.PrecisionStopwatch;
import com.volmit.iris.util.RNG;
import com.volmit.iris.scaffold.engine.Engine;
import com.volmit.iris.scaffold.engine.EngineAssignedActuator;
@@ -27,6 +28,7 @@ public class IrisTerrainActuator extends EngineAssignedActuator<BlockData>
@Override
public void onActuate(int x, int z, Hunk<BlockData> h) {
PrecisionStopwatch p = PrecisionStopwatch.start();
int i, zf, depth, realX, realZ, hf, he, b;
IrisBiome biome;
KList<BlockData> blocks;
@@ -86,5 +88,7 @@ public class IrisTerrainActuator extends EngineAssignedActuator<BlockData>
}
}
}
getEngine().getMetrics().getTerrain().put(p.getMilliseconds());
}
}

View File

@@ -3,10 +3,7 @@ package com.volmit.iris.generator.modifier;
import com.volmit.iris.generator.noise.FastNoiseDouble;
import com.volmit.iris.object.IrisBiome;
import com.volmit.iris.object.IrisCaveLayer;
import com.volmit.iris.util.B;
import com.volmit.iris.util.CaveResult;
import com.volmit.iris.util.KList;
import com.volmit.iris.util.RNG;
import com.volmit.iris.util.*;
import com.volmit.iris.scaffold.engine.Engine;
import com.volmit.iris.scaffold.engine.EngineAssignedModifier;
import com.volmit.iris.scaffold.hunk.Hunk;
@@ -31,6 +28,12 @@ public class IrisCaveModifier extends EngineAssignedModifier<BlockData>
@Override
public void onModify(int x, int z, Hunk<BlockData> a) {
if(!getDimension().isCaves())
{
return;
}
PrecisionStopwatch p = PrecisionStopwatch.start();
for(int i = 0; i < a.getWidth(); i++)
{
for(int j = 0; j < a.getDepth(); j++)
@@ -71,6 +74,8 @@ public class IrisCaveModifier extends EngineAssignedModifier<BlockData>
}
}
};
getEngine().getMetrics().getCave().put(p.getMilliseconds());
}
public KList<CaveResult> genCaves(double wxx, double wzz, int x, int z, Hunk<BlockData> data)

View File

@@ -4,11 +4,12 @@ import com.volmit.iris.object.IrisBiome;
import com.volmit.iris.object.IrisDepositGenerator;
import com.volmit.iris.object.IrisObject;
import com.volmit.iris.object.IrisRegion;
import com.volmit.iris.util.HeightMap;
import com.volmit.iris.util.RNG;
import com.volmit.iris.scaffold.engine.Engine;
import com.volmit.iris.scaffold.engine.EngineAssignedModifier;
import com.volmit.iris.scaffold.hunk.Hunk;
import com.volmit.iris.util.HeightMap;
import com.volmit.iris.util.PrecisionStopwatch;
import com.volmit.iris.util.RNG;
import org.bukkit.block.data.BlockData;
import org.bukkit.util.BlockVector;
@@ -21,7 +22,9 @@ public class IrisDepositModifier extends EngineAssignedModifier<BlockData> {
@Override
public void onModify(int x, int z, Hunk<BlockData> output) {
PrecisionStopwatch p = PrecisionStopwatch.start();
generateDeposits(rng, output, Math.floorDiv(x, 16), Math.floorDiv(z, 16));
getEngine().getMetrics().getDeposit().put(p.getMilliseconds());
}
public void generateDeposits(RNG rx, Hunk<BlockData> terrain, int x, int z)

View File

@@ -3,6 +3,7 @@ package com.volmit.iris.generator.modifier;
import com.volmit.iris.object.*;
import com.volmit.iris.util.B;
import com.volmit.iris.util.CaveResult;
import com.volmit.iris.util.PrecisionStopwatch;
import com.volmit.iris.util.RNG;
import com.volmit.iris.scaffold.engine.Engine;
import com.volmit.iris.scaffold.engine.EngineAssignedModifier;
@@ -25,6 +26,7 @@ public class IrisPostModifier extends EngineAssignedModifier<BlockData> {
@Override
public void onModify(int x, int z, Hunk<BlockData> output) {
PrecisionStopwatch p = PrecisionStopwatch.start();
for(int i = 0; i < output.getWidth(); i++)
{
for(int j = 0; j < output.getDepth(); j++)
@@ -32,6 +34,7 @@ public class IrisPostModifier extends EngineAssignedModifier<BlockData> {
post(i, j, output, i+x, j+z);
}
}
getEngine().getMetrics().getPost().put(p.getMilliseconds());
}
private void post(int currentPostX, int currentPostZ, Hunk<BlockData> currentData, int x, int z) {

View File

@@ -23,7 +23,9 @@ public class IrisRavineModifier extends EngineAssignedModifier<BlockData> {
@Override
public void onModify(int x, int z, Hunk<BlockData> output) {
PrecisionStopwatch p = PrecisionStopwatch.start();
generateRavines(rng, Math.floorDiv(x, 16), Math.floorDiv(z, 16), output);
getEngine().getMetrics().getRavine().put(p.getMilliseconds());
}
private void set(Hunk<BlockData> pos, int x, int y, int z, BlockData b)