Merge pull request #5 from CrazyDev05/Pixeldev

More Improvements
This commit is contained in:
RePixelatedMC
2023-12-22 16:39:30 +01:00
committed by GitHub
3 changed files with 102 additions and 10 deletions
@@ -19,23 +19,32 @@
package com.volmit.iris.core.commands; package com.volmit.iris.core.commands;
import com.volmit.iris.Iris; import com.volmit.iris.Iris;
import com.volmit.iris.core.IrisSettings;
import com.volmit.iris.core.loader.IrisData; import com.volmit.iris.core.loader.IrisData;
import com.volmit.iris.core.service.IrisEngineSVC; import com.volmit.iris.core.service.IrisEngineSVC;
import com.volmit.iris.core.tools.IrisToolbelt; import com.volmit.iris.core.tools.IrisToolbelt;
import com.volmit.iris.engine.framework.Engine; import com.volmit.iris.engine.framework.Engine;
import com.volmit.iris.engine.mantle.EngineMantle;
import com.volmit.iris.util.decree.DecreeExecutor; import com.volmit.iris.util.decree.DecreeExecutor;
import com.volmit.iris.util.decree.DecreeOrigin; import com.volmit.iris.util.decree.DecreeOrigin;
import com.volmit.iris.util.decree.annotations.Decree; import com.volmit.iris.util.decree.annotations.Decree;
import com.volmit.iris.util.decree.annotations.Param; import com.volmit.iris.util.decree.annotations.Param;
import com.volmit.iris.util.format.C; import com.volmit.iris.util.format.C;
import com.volmit.iris.util.format.Form; import com.volmit.iris.util.format.Form;
import com.volmit.iris.util.mantle.Mantle; import com.volmit.iris.util.io.IO;
import com.volmit.iris.util.mantle.TectonicPlate;
import com.volmit.iris.util.plugin.VolmitSender;
import net.jpountz.lz4.LZ4BlockInputStream;
import net.jpountz.lz4.LZ4BlockOutputStream;
import net.jpountz.lz4.LZ4FrameInputStream;
import net.jpountz.lz4.LZ4FrameOutputStream;
import org.apache.commons.lang.RandomStringUtils;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.World; import org.bukkit.World;
import java.util.concurrent.atomic.AtomicInteger; import java.io.*;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.zip.GZIPInputStream;
import java.util.zip.GZIPOutputStream;
@Decree(name = "Developer", origin = DecreeOrigin.BOTH, description = "Iris World Manager", aliases = {"dev"}) @Decree(name = "Developer", origin = DecreeOrigin.BOTH, description = "Iris World Manager", aliases = {"dev"})
public class CommandDeveloper implements DecreeExecutor { public class CommandDeveloper implements DecreeExecutor {
@@ -70,9 +79,91 @@ public class CommandDeveloper implements DecreeExecutor {
} }
} }
@Decree(description = "Test", origin = DecreeOrigin.BOTH) @Decree(description = "Test", origin = DecreeOrigin.BOTH)
public void test(){ public void test() {
Iris.info("Test Developer CMD Executed"); Iris.info("Test Developer CMD Executed");
} }
@Decree(description = "Test the compression algorithms")
public void compression(
@Param(description = "base IrisWorld") World world,
@Param(description = "raw TectonicPlate File") String path,
@Param(description = "Algorithm to Test") String algorithm,
@Param(description = "Amount of Tests") int amount) {
if (!IrisToolbelt.isIrisWorld(world)) {
sender().sendMessage(C.RED + "This is not an Iris world. Iris worlds: " + String.join(", ", Bukkit.getServer().getWorlds().stream().filter(IrisToolbelt::isIrisWorld).map(World::getName).toList()));
return;
}
File file = new File(path);
if (!file.exists()) return;
Engine engine = IrisToolbelt.access(world).getEngine();
if(engine != null) {
int height = engine.getTarget().getHeight();
ExecutorService service = Executors.newFixedThreadPool(1);
VolmitSender sender = sender();
service.submit(() -> {
try {
DataInputStream raw = new DataInputStream(new FileInputStream(file));
TectonicPlate plate = new TectonicPlate(height, raw);
raw.close();
double d1 = 0;
double d2 = 0;
long size = 0;
File folder = new File("tmp");
folder.mkdirs();
for (int i = 0; i < amount; i++) {
File tmp = new File(folder, RandomStringUtils.randomAlphanumeric(10) + "." + algorithm + ".bin");
DataOutputStream dos = createOutput(tmp, algorithm);
long start = System.currentTimeMillis();
plate.write(dos);
dos.close();
d1 += System.currentTimeMillis() - start;
if (size == 0)
size = tmp.length();
start = System.currentTimeMillis();
DataInputStream din = createInput(tmp, algorithm);
new TectonicPlate(height, din);
din.close();
d2 += System.currentTimeMillis() - start;
tmp.delete();
}
IO.delete(folder);
sender.sendMessage(algorithm + " is " + Form.fileSize(size) + " big after compression");
sender.sendMessage(algorithm + " Took " + d2/amount + "ms to read");
sender.sendMessage(algorithm + " Took " + d1/amount + "ms to write");
} catch (Throwable e) {
e.printStackTrace();
}
});
service.shutdown();
} else {
Iris.info(C.RED + "Engine is null!");
}
}
private DataInputStream createInput(File file, String algorithm) throws Throwable {
FileInputStream in = new FileInputStream(file);
return new DataInputStream(switch (algorithm) {
case "gzip" -> new GZIPInputStream(in);
case "lz4f" -> new LZ4FrameInputStream(in);
case "lz4b" -> new LZ4BlockInputStream(in);
default -> throw new IllegalStateException("Unexpected value: " + algorithm);
});
}
private DataOutputStream createOutput(File file, String algorithm) throws Throwable {
FileOutputStream out = new FileOutputStream(file);
return new DataOutputStream(switch (algorithm) {
case "gzip" -> new GZIPOutputStream(out);
case "lz4f" -> new LZ4FrameOutputStream(out);
case "lz4b" -> new LZ4BlockOutputStream(out);
default -> throw new IllegalStateException("Unexpected value: " + algorithm);
});
}
} }
@@ -110,7 +110,7 @@ public class Mantle {
* @return the file * @return the file
*/ */
public static File fileForRegion(File folder, Long key) { public static File fileForRegion(File folder, Long key) {
File f = new File(folder, "p." + key + ".ttp.lz4"); File f = new File(folder, "p." + key + ".ttp.lz4b");
if (!f.getParentFile().exists()) { if (!f.getParentFile().exists()) {
f.getParentFile().mkdirs(); f.getParentFile().mkdirs();
} }
@@ -552,7 +552,7 @@ public class Mantle {
File file = fileForRegion(dataFolder, x, z); File file = fileForRegion(dataFolder, x, z);
if (!file.exists()) if (!file.exists())
file = new File(dataFolder, file.getName().substring(".lz4".length())); file = new File(dataFolder, file.getName().substring(".lz4b".length()));
if (file.exists()) { if (file.exists()) {
try { try {
@@ -27,6 +27,7 @@ import com.volmit.iris.util.format.Form;
import com.volmit.iris.util.scheduling.PrecisionStopwatch; import com.volmit.iris.util.scheduling.PrecisionStopwatch;
import lombok.Getter; import lombok.Getter;
import net.jpountz.lz4.LZ4BlockInputStream; import net.jpountz.lz4.LZ4BlockInputStream;
import net.jpountz.lz4.LZ4BlockOutputStream;
import net.jpountz.lz4.LZ4FrameInputStream; import net.jpountz.lz4.LZ4FrameInputStream;
import net.jpountz.lz4.LZ4FrameOutputStream; import net.jpountz.lz4.LZ4FrameOutputStream;
@@ -87,7 +88,7 @@ public class TectonicPlate {
GZIPInputStream gzi = new GZIPInputStream(fin); GZIPInputStream gzi = new GZIPInputStream(fin);
din = new DataInputStream(gzi); din = new DataInputStream(gzi);
} else { } else {
LZ4FrameInputStream lz4 = new LZ4FrameInputStream(fin); LZ4BlockInputStream lz4 = new LZ4BlockInputStream(fin);
din = new DataInputStream(lz4); din = new DataInputStream(lz4);
} }
TectonicPlate p = new TectonicPlate(worldHeight, din); TectonicPlate p = new TectonicPlate(worldHeight, din);
@@ -174,11 +175,11 @@ public class TectonicPlate {
PrecisionStopwatch p = PrecisionStopwatch.start(); PrecisionStopwatch p = PrecisionStopwatch.start();
FileOutputStream fos = new FileOutputStream(file); FileOutputStream fos = new FileOutputStream(file);
DataOutputStream dos; DataOutputStream dos;
if (file.getName().endsWith("ttp.lz4")) { if (file.getName().endsWith("ttp")) {
GZIPOutputStream gzo = new GZIPOutputStream(fos); GZIPOutputStream gzo = new GZIPOutputStream(fos);
dos = new DataOutputStream(gzo); dos = new DataOutputStream(gzo);
} else { } else {
LZ4FrameOutputStream lz4 = new LZ4FrameOutputStream(fos); LZ4BlockOutputStream lz4 = new LZ4BlockOutputStream(fos);
dos = new DataOutputStream(lz4); dos = new DataOutputStream(lz4);
} }
write(dos); write(dos);