Performance improvements

This commit is contained in:
cyberpwn 2021-09-18 05:08:49 -04:00
parent a7aea8d1ed
commit 976cfdbbc2
3 changed files with 54 additions and 53 deletions

View File

@ -22,12 +22,15 @@ import com.volmit.iris.engine.framework.Engine;
import com.volmit.iris.engine.framework.EngineAssignedModifier; import com.volmit.iris.engine.framework.EngineAssignedModifier;
import com.volmit.iris.util.data.B; import com.volmit.iris.util.data.B;
import com.volmit.iris.util.hunk.Hunk; import com.volmit.iris.util.hunk.Hunk;
import com.volmit.iris.util.parallel.BurstExecutor;
import com.volmit.iris.util.scheduling.PrecisionStopwatch; import com.volmit.iris.util.scheduling.PrecisionStopwatch;
import org.bukkit.block.data.Bisected; import org.bukkit.block.data.Bisected;
import org.bukkit.block.data.BlockData; import org.bukkit.block.data.BlockData;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.atomic.AtomicInteger;
public class IrisPerfectionModifier extends EngineAssignedModifier<BlockData> { public class IrisPerfectionModifier extends EngineAssignedModifier<BlockData> {
private static final BlockData AIR = B.get("AIR"); private static final BlockData AIR = B.get("AIR");
@ -40,76 +43,79 @@ public class IrisPerfectionModifier extends EngineAssignedModifier<BlockData> {
@Override @Override
public void onModify(int x, int z, Hunk<BlockData> output, boolean multicore) { public void onModify(int x, int z, Hunk<BlockData> output, boolean multicore) {
PrecisionStopwatch p = PrecisionStopwatch.start(); PrecisionStopwatch p = PrecisionStopwatch.start();
boolean changed = true; AtomicBoolean changed = new AtomicBoolean(true);
int passes = 0; int passes = 0;
int changes = 0; AtomicInteger changes = new AtomicInteger();
List<Integer> surfaces = new ArrayList<>(); List<Integer> surfaces = new ArrayList<>();
List<Integer> ceilings = new ArrayList<>(); List<Integer> ceilings = new ArrayList<>();
BurstExecutor burst = burst().burst(multicore);
while (changed) { while (changed.get()) {
passes++; passes++;
changed = false; changed.set(false);
for (int i = 0; i < 16; i++) { for (int i = 0; i < 16; i++) {
for (int j = 0; j < 16; j++) { int finalI = i;
surfaces.clear(); burst.queue(() -> {
ceilings.clear(); for (int j = 0; j < 16; j++) {
int top = getHeight(output, i, j); surfaces.clear();
boolean inside = true; ceilings.clear();
surfaces.add(top); int top = getHeight(output, finalI, j);
boolean inside = true;
surfaces.add(top);
for (int k = top; k >= 0; k--) { for (int k = top; k >= 0; k--) {
BlockData b = output.get(i, k, j); BlockData b = output.get(finalI, k, j);
boolean now = b != null && !(B.isAir(b) || B.isFluid(b)); boolean now = b != null && !(B.isAir(b) || B.isFluid(b));
if (now != inside) { if (now != inside) {
inside = now; inside = now;
if (inside) { if (inside) {
surfaces.add(k); surfaces.add(k);
} else { } else {
ceilings.add(k + 1); ceilings.add(k + 1);
}
} }
} }
}
for (int k : surfaces) { for (int k : surfaces) {
BlockData tip = output.get(i, k, j); BlockData tip = output.get(finalI, k, j);
if (tip == null) { if (tip == null) {
continue; continue;
} }
boolean remove = false; boolean remove = false;
boolean remove2 = false; boolean remove2 = false;
if (B.isDecorant(tip)) { if (B.isDecorant(tip)) {
BlockData bel = output.get(i, k - 1, j); BlockData bel = output.get(finalI, k - 1, j);
if (bel == null) { if (bel == null) {
remove = true;
} else if (!B.canPlaceOnto(tip.getMaterial(), bel.getMaterial())) {
remove = true;
} else if (bel instanceof Bisected) {
BlockData bb = output.get(i, k - 2, j);
if (bb == null || !B.canPlaceOnto(bel.getMaterial(), bb.getMaterial())) {
remove = true; remove = true;
remove2 = true; } else if (!B.canPlaceOnto(tip.getMaterial(), bel.getMaterial())) {
remove = true;
} else if (bel instanceof Bisected) {
BlockData bb = output.get(finalI, k - 2, j);
if (bb == null || !B.canPlaceOnto(bel.getMaterial(), bb.getMaterial())) {
remove = true;
remove2 = true;
}
} }
}
if (remove) { if (remove) {
changed = true; changed.set(true);
changes++; changes.getAndIncrement();
output.set(i, k, j, AIR); output.set(finalI, k, j, AIR);
if (remove2) { if (remove2) {
changes++; changes.getAndIncrement();
output.set(i, k - 1, j, AIR); output.set(finalI, k - 1, j, AIR);
}
} }
} }
} }
} }
} });
} }
} }

View File

@ -316,11 +316,6 @@ public class IrisInterpolation {
System.out.println(m + ": " + Form.duration(p.getMilliseconds(), 8)); System.out.println(m + ": " + Form.duration(p.getMilliseconds(), 8));
} }
public static void main(String[] args) {
printOptimizedSrc(false);
}
public static void printOptimizedSrc(boolean arrays) { public static void printOptimizedSrc(boolean arrays) {
System.out.println(generateOptimizedStarcast(3, arrays)); System.out.println(generateOptimizedStarcast(3, arrays));
System.out.println(generateOptimizedStarcast(5, arrays)); System.out.println(generateOptimizedStarcast(5, arrays));

View File

@ -117,7 +117,7 @@ public class NBTWorld {
} }
public static CompoundTag getCompound(BlockData bd) { public static CompoundTag getCompound(BlockData bd) {
return blockDataCache.computeIfAbsent(bd, BLOCK_DATA_COMPUTE).clone(); return blockDataCache.computeIfAbsent(bd, BLOCK_DATA_COMPUTE);
} }
private static Map<Biome, Integer> computeBiomeIDs() { private static Map<Biome, Integer> computeBiomeIDs() {