mirror of
https://github.com/VolmitSoftware/Iris.git
synced 2025-07-18 18:23:06 +00:00
Performance improvements
This commit is contained in:
parent
a7aea8d1ed
commit
976cfdbbc2
@ -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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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));
|
||||||
|
@ -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() {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user