9
0
mirror of https://github.com/VolmitSoftware/Iris.git synced 2025-12-28 03:29:06 +00:00

Iris but forkjoin

This commit is contained in:
cyberpwn
2021-08-21 02:42:22 -04:00
parent 72b4c9c6ab
commit d686d07d53
23 changed files with 125 additions and 233 deletions

View File

@@ -132,6 +132,7 @@ public class IrisEngine extends BlockPopulator implements Engine {
closed = false;
art = J.ar(this::tickRandomPlayer, 0);
setupEngine();
Iris.debug("Engine Initialized " + getCacheID());
}
private void tickRandomPlayer() {
@@ -158,20 +159,32 @@ public class IrisEngine extends BlockPopulator implements Engine {
private void setupEngine()
{
cacheId = RNG.r.nextInt();
worldManager = new IrisWorldManager(this);
complex = new IrisComplex(this);
execution = new IrisExecutionEnvironment(this);
terrainNormalActuator = new IrisTerrainNormalActuator(this);
terrainIslandActuator = new IrisTerrainIslandActuator(this);
decorantActuator = new IrisDecorantActuator(this);
biomeActuator = new IrisBiomeActuator(this);
depositModifier = new IrisDepositModifier(this);
ravineModifier = new IrisRavineModifier(this);
caveModifier = new IrisCaveModifier(this);
postModifier = new IrisPostModifier(this);
effects = new IrisEngineEffects(this);
J.a(this::computeBiomeMaxes);
try
{
Iris.debug("Setup Engine " + getCacheID());
cacheId = RNG.r.nextInt();
worldManager = new IrisWorldManager(this);
complex = new IrisComplex(this);
execution = new IrisExecutionEnvironment(this);
terrainNormalActuator = new IrisTerrainNormalActuator(this);
terrainIslandActuator = new IrisTerrainIslandActuator(this);
decorantActuator = new IrisDecorantActuator(this);
biomeActuator = new IrisBiomeActuator(this);
depositModifier = new IrisDepositModifier(this);
ravineModifier = new IrisRavineModifier(this);
caveModifier = new IrisCaveModifier(this);
postModifier = new IrisPostModifier(this);
effects = new IrisEngineEffects(this);
J.a(this::computeBiomeMaxes);
}
catch(Throwable e)
{
Iris.error("FAILED TO SETUP ENGINE!");
e.printStackTrace();
}
Iris.debug("Engine Setup Complete " + getCacheID());
}
@Override

View File

@@ -18,6 +18,7 @@
package com.volmit.iris.engine;
import com.googlecode.concurrentlinkedhashmap.ConcurrentLinkedHashMap;
import com.volmit.iris.Iris;
import com.volmit.iris.engine.framework.Engine;
import com.volmit.iris.engine.mantle.EngineMantle;
@@ -27,6 +28,7 @@ import com.volmit.iris.engine.mantle.components.MantleJigsawComponent;
import com.volmit.iris.engine.mantle.components.MantleObjectComponent;
import com.volmit.iris.engine.object.biome.IrisBiome;
import com.volmit.iris.engine.object.deposits.IrisDepositGenerator;
import com.volmit.iris.engine.object.feature.IrisFeaturePositional;
import com.volmit.iris.engine.object.feature.IrisFeaturePotential;
import com.volmit.iris.engine.object.jigsaw.IrisJigsawStructurePlacement;
import com.volmit.iris.engine.object.objects.IrisObject;
@@ -36,9 +38,15 @@ import com.volmit.iris.engine.object.regional.IrisRegion;
import com.volmit.iris.util.collection.KList;
import com.volmit.iris.util.collection.KMap;
import com.volmit.iris.util.collection.KSet;
import com.volmit.iris.util.documentation.BlockCoordinates;
import com.volmit.iris.util.documentation.ChunkCoordinates;
import com.volmit.iris.util.format.Form;
import com.volmit.iris.util.mantle.Mantle;
import com.volmit.iris.util.mantle.MantleFlag;
import com.volmit.iris.util.parallel.BurstExecutor;
import com.volmit.iris.util.stream.ProceduralStream;
import com.volmit.iris.util.stream.interpolation.Interpolated;
import com.volmit.iris.util.stream.utility.CachedStream2D;
import lombok.Data;
import org.bukkit.util.BlockVector;
@@ -46,6 +54,7 @@ import java.io.File;
import java.io.IOException;
import java.util.Map;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.Future;
import java.util.concurrent.atomic.AtomicInteger;
@Data
@@ -53,7 +62,9 @@ public class IrisEngineMantle implements EngineMantle {
private final Engine engine;
private final Mantle mantle;
private final KList<MantleComponent> components;
private final CompletableFuture<Integer> radius;
private final Future<Integer> radius;
private ProceduralStream<KList<IrisFeaturePositional>> featureChunkStream;
private ProceduralStream<KList<IrisFeaturePositional>> featureStream;
public IrisEngineMantle(Engine engine) {
this.engine = engine;
@@ -63,6 +74,21 @@ public class IrisEngineMantle implements EngineMantle {
registerComponent(new MantleFeatureComponent(this));
registerComponent(new MantleJigsawComponent(this));
registerComponent(new MantleObjectComponent(this));
featureChunkStream = ProceduralStream.of((x, z)
-> EngineMantle.super.getFeaturesInChunk(x.intValue(), z.intValue()),
Interpolated.of((i) -> 0D, (i) -> new KList<IrisFeaturePositional>())).cache2D(2048);
featureStream = ProceduralStream.of(EngineMantle.super::forEachFeature,
Interpolated.of((i) -> 0D, (i) -> new KList<IrisFeaturePositional>())).cache2D(8192);
}
@ChunkCoordinates
public KList<IrisFeaturePositional> getFeaturesInChunk(int x, int z) {
return featureChunkStream.get(x, z);
}
@BlockCoordinates
public KList<IrisFeaturePositional> forEachFeature(double x, double z) {
return featureStream.get(x, z);
}
@Override

View File

@@ -69,7 +69,6 @@ public class IrisBiomeActuator extends EngineAssignedActuator<Biome> {
public void onActuate(int x, int z, Hunk<Biome> h, boolean multicore) {
PrecisionStopwatch p = PrecisionStopwatch.start();
BurstExecutor burst = burst().burst();
burst.setMulticore(multicore);
for (int xf = 0; xf < h.getWidth(); xf++) {
int finalXf = xf;

View File

@@ -91,7 +91,6 @@ public class IrisDecorantActuator extends EngineAssignedActuator<BlockData> {
PrecisionStopwatch p = PrecisionStopwatch.start();
BurstExecutor burst = burst().burst();
burst.setMulticore(multicore);
for (int i = 0; i < output.getWidth(); i++) {
int finalI = i;

View File

@@ -56,7 +56,6 @@ public class IrisTerrainNormalActuator extends EngineAssignedActuator<BlockData>
PrecisionStopwatch p = PrecisionStopwatch.start();
BurstExecutor e = getEngine().burst().burst(h.getWidth());
e.setMulticore(multicore);
for (int xf = 0; xf < h.getWidth(); xf++) {
int finalXf = xf;
e.queue(() -> terrainSliver(x, z, finalXf, h));

View File

@@ -18,6 +18,7 @@
package com.volmit.iris.engine.framework;
import com.volmit.iris.Iris;
import com.volmit.iris.util.documentation.BlockCoordinates;
import com.volmit.iris.util.hunk.Hunk;
@@ -31,6 +32,7 @@ public abstract class EngineAssignedActuator<T> extends EngineAssignedComponent
@BlockCoordinates
@Override
public void actuate(int x, int z, Hunk<T> output, boolean multicore) {
Iris.debug("Engine Actuator[" + getName() + "] " + x + " " + z);
onActuate(x, z, output, multicore);
}
}

View File

@@ -18,6 +18,7 @@
package com.volmit.iris.engine.framework;
import com.volmit.iris.Iris;
import com.volmit.iris.util.math.RollingSequence;
import lombok.Data;
@@ -28,6 +29,7 @@ public class EngineAssignedComponent implements EngineComponent {
private final String name;
public EngineAssignedComponent(Engine engine, String name) {
Iris.debug("Engine: " + engine.getCacheID() + " Starting " + name);
this.engine = engine;
this.metrics = new RollingSequence(16);
this.name = name;

View File

@@ -18,6 +18,7 @@
package com.volmit.iris.engine.framework;
import com.volmit.iris.Iris;
import com.volmit.iris.util.documentation.BlockCoordinates;
import com.volmit.iris.util.hunk.Hunk;
@@ -32,6 +33,7 @@ public abstract class EngineAssignedModifier<T> extends EngineAssignedComponent
@BlockCoordinates
@Override
public void modify(int x, int z, Hunk<T> output, boolean multicore) {
Iris.debug("Engine Modifier[" + getName() + "] " + x + " " + z);
onModify(x, z, output, multicore);
}
}

View File

@@ -36,9 +36,7 @@ public class EngineTarget {
this.world = world;
this.dimension = dimension;
this.data = data;
this.burster = new MultiBurst("Iris Engine " + dimension.getName(),
IrisSettings.get().getConcurrency().getEngineThreadPriority(),
IrisSettings.getThreadCount(IrisSettings.get().getConcurrency().getEngineThreadCount()));
this.burster = MultiBurst.burst;
}
public int getHeight() {
@@ -46,6 +44,6 @@ public class EngineTarget {
}
public void close() {
burster.shutdownLater();
}
}

View File

@@ -36,16 +36,11 @@ import com.volmit.iris.util.mantle.Mantle;
import com.volmit.iris.util.mantle.MantleFlag;
import com.volmit.iris.util.parallel.BurstExecutor;
import com.volmit.iris.util.parallel.MultiBurst;
import com.volmit.iris.util.scheduling.PrecisionStopwatch;
import org.bukkit.Chunk;
import org.bukkit.block.TileState;
import org.bukkit.block.data.BlockData;
import java.util.Collections;
import java.util.List;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.*;
import java.util.function.Consumer;
// TODO: MOVE PLACER OUT OF MATTER INTO ITS OWN THING
@@ -56,7 +51,7 @@ public interface EngineMantle extends IObjectPlacer {
Engine getEngine();
CompletableFuture<Integer> getRadius();
Future<Integer> getRadius();
KList<MantleComponent> getComponents();
@@ -189,7 +184,6 @@ public interface EngineMantle extends IObjectPlacer {
return;
}
PrecisionStopwatch p = PrecisionStopwatch.start();
KList<Runnable> post = new KList<>();
Consumer<Runnable> c = (i) -> {
synchronized (post)
@@ -199,7 +193,6 @@ public interface EngineMantle extends IObjectPlacer {
};
int s = getRealRadius();
BurstExecutor burst = burst().burst();
burst.setMulticore(multicore);
for (int i = -s; i <= s; i++) {
int xx = i + x;
@@ -217,16 +210,7 @@ public interface EngineMantle extends IObjectPlacer {
{
KList<Runnable> px = post.copy();
post.clear();
if(multicore)
{
burst().burst(px);
}
else
{
burst().sync(px);
}
burst().burst(px);
}
}
@@ -240,6 +224,7 @@ public interface EngineMantle extends IObjectPlacer {
return;
}
Iris.debug("Engine Matter Insert " + x + " " + z);
getMantle().iterateChunk(x, z, t, blocks::set);
}

View File

@@ -55,7 +55,7 @@ public class IrisDepositModifier extends EngineAssignedModifier<BlockData> {
IrisRegion region = getComplex().getRegionStream().get((x * 16) + 7, (z * 16) + 7);
IrisBiome biome = getComplex().getTrueBiomeStream().get((x * 16) + 7, (z * 16) + 7);
BurstExecutor burst = burst().burst();
burst.setMulticore(multicore);
for (IrisDepositGenerator k : getDimension().getDeposits()) {
burst.queue(() -> generate(k, terrain, ro, x, z, false));
}

View File

@@ -65,7 +65,6 @@ public class IrisPostModifier extends EngineAssignedModifier<BlockData> {
AtomicInteger i = new AtomicInteger();
AtomicInteger j = new AtomicInteger();
BurstExecutor burst = burst().burst();
burst.setMulticore(multicore);
Hunk<BlockData> sync = output.synchronize();
for (i.set(0); i.get() < output.getWidth(); i.getAndIncrement()) {
burst.queue(() -> {

View File

@@ -177,6 +177,7 @@ public class BukkitChunkGenerator extends ChunkGenerator implements PlatformChun
@Override
public @NotNull ChunkData generateChunkData(@NotNull World world, @NotNull Random ignored, int x, int z, @NotNull BiomeGrid biome) {
Iris.debug("Generate Request " + world.getName() + " at: " + x + ", " + z);
try {
if(lastSeed != world.getSeed())
{
@@ -187,12 +188,14 @@ public class BukkitChunkGenerator extends ChunkGenerator implements PlatformChun
Iris.success("Updated Engine seed to " + lastSeed);
}
Iris.debug("Generate Request [LOCKING] at: " + x + ", " + z);
loadLock.acquire();
PrecisionStopwatch ps = PrecisionStopwatch.start();
Iris.debug("Generate Request [LOCKED] at: " + x + ", " + z);
TerrainChunk tc = TerrainChunk.create(world, biome);
Hunk<BlockData> blocks = Hunk.view((ChunkData) tc);
Hunk<Biome> biomes = Hunk.view((BiomeGrid) tc);
this.world.bind(world);
Iris.debug("Generate Request [ENGINE] at: " + x + ", " + z);
getEngine().generate(x * 16, z * 16, blocks, biomes, true);
ChunkData c = tc.getRaw();
Iris.debug("Generated " + x + " " + z);

View File

@@ -58,7 +58,7 @@ public class HeadlessGenerator implements PlatformChunkGenerator {
public HeadlessGenerator(HeadlessWorld world) {
this.world = world;
burst = new MultiBurst("Iris Headless Generator", 9, IrisSettings.getThreadCount(IrisSettings.get().getConcurrency().getPregenThreadCount()));
burst = MultiBurst.burst;
writer = new NBTWorld(world.getWorld().worldFolder());
engine = new IrisEngine(new EngineTarget(world.getWorld(), world.getDimension(), world.getDimension().getLoader()), isStudio());
}
@@ -131,7 +131,6 @@ public class HeadlessGenerator implements PlatformChunkGenerator {
}
public void close() {
burst.shutdownAndAwait();
getEngine().close();
writer.close();
}