WorldGenBenchmarkCommand class
Пакет: com.hypixel.hytale.server.core.command.commands.world.worldgen
Файл: com/hypixel/hytale/server/core/command/commands/world/worldgen/WorldGenBenchmarkCommand.java
extends: CommandBase
Поля (32)
| Модификаторы | Тип | Имя |
|---|---|---|
final |
AtomicBoolean |
IS_RUNNING |
|
int |
var10 |
|
|
var10 |
|
|
var10 |
|
int |
var11 |
|
|
var11 |
|
|
var11 |
|
int |
var12 |
|
|
var12 |
|
|
var12 |
|
LongArrayList |
var13 |
|
Set |
var13 |
|
long |
var14 |
|
|
var14 |
|
long |
var16 |
|
int |
var17 |
|
String |
var17 |
|
long |
var18 |
|
long |
var19 |
|
World |
var2 |
|
CompletableFuture |
var21 |
|
String |
var3 |
|
String |
var34 |
|
File |
var35 |
|
File |
var36 |
|
int |
var4 |
|
IWorldGen |
var5 |
|
Vector2i |
var7 |
|
Vector2i |
var8 |
|
int |
var9 |
|
|
var9 |
|
|
var9 |
Методы (7)
| Модификаторы | Возврат | Сигнатура |
|---|---|---|
|
|
for for(int var14 = var9; var14 <= var10; var14++) |
|
|
for for(int var15 = var11; var15 <= var12; var15++) |
abstract |
|
for for(int var18 = var13.size() |
|
|
if if(var7.x < var8.x) |
|
|
if if(var7.y < var8.y) |
|
|
if if(var16 >= var14) |
abstract |
|
super super("benchmark", "server.commands.worldgenbenchmark.desc") |
Исходный код
Показать/скрыть
class="kw">package com.hypixel.hytale.server.core.command.commands.world.worldgen;
class="kw">import com.hypixel.hytale.common.util.FormatUtil;
class="kw">import com.hypixel.hytale.logger.HytaleLogger;
class="kw">import com.hypixel.hytale.math.util.ChunkUtil;
class="kw">import com.hypixel.hytale.server.core.Message;
class="kw">import com.hypixel.hytale.server.core.command.system.CommandContext;
class="kw">import com.hypixel.hytale.server.core.command.system.arguments.system.OptionalArg;
class="kw">import com.hypixel.hytale.server.core.command.system.arguments.system.RequiredArg;
class="kw">import com.hypixel.hytale.server.core.command.system.arguments.types.ArgTypes;
class="kw">import com.hypixel.hytale.server.core.command.system.basecommands.CommandBase;
class="kw">import com.hypixel.hytale.server.core.universe.world.World;
class="kw">import com.hypixel.hytale.server.core.universe.world.worldgen.GeneratedChunk;
class="kw">import com.hypixel.hytale.server.core.universe.world.worldgen.IBenchmarkableWorldGen;
class="kw">import com.hypixel.hytale.server.core.universe.world.worldgen.IWorldGen;
class="kw">import it.unimi.dsi.fastutil.longs.LongArrayList;
class="kw">import java.io.File;
class="kw">import java.io.FileWriter;
class="kw">import java.nio.charset.StandardCharsets;
class="kw">import java.util.HashSet;
class="kw">import java.util.Set;
class="kw">import java.util.concurrent.CompletableFuture;
class="kw">import java.util.concurrent.RejectedExecutionException;
class="kw">import java.util.concurrent.atomic.AtomicBoolean;
class="kw">import java.util.logging.Level;
class="kw">import javax.annotation.Nonnull;
class="kw">import org.joml.Vector2i;
class="kw">public class WorldGenBenchmarkCommand class="kw">extends CommandBase {
class="kw">private class="kw">static class="kw">final AtomicBoolean IS_RUNNING = new AtomicBoolean(false);
class="kw">public class="kw">static class="kw">final Message MESSAGE_COMMANDS_WORLD_GEN_BENCHMARK_SAVING = Message.translation("server.commands.worldgenbenchmark.saving");
class="kw">public class="kw">static class="kw">final Message MESSAGE_COMMANDS_WORLD_GEN_BENCHMARK_SAVE_FAILED = Message.translation("server.commands.worldgenbenchmark.saveFailed");
class="kw">public class="kw">static class="kw">final Message MESSAGE_COMMANDS_WORLD_GEN_BENCHMARK_ABORT = Message.translation("server.commands.worldgenbenchmark.abort");
class="kw">public class="kw">static class="kw">final Message MESSAGE_COMMANDS_WORLD_GEN_BENCHMARK_BENCHMARK_NOT_SUPPORTED = Message.translation(
"server.commands.worldgenbenchmark.benchmarkNotSupported"
);
class="kw">public class="kw">static class="kw">final Message MESSAGE_COMMANDS_WORLD_GEN_BENCHMARK_ALREADY_IN_PROGRESS = Message.translation(
"server.commands.worldgenbenchmark.alreadyInProgress"
);
@Nonnull
class="kw">private class="kw">final OptionalArg<World> worldArg = this.withOptionalArg("world", "server.commands.worldthread.arg.desc", ArgTypes.WORLD);
@Nonnull
class="kw">private class="kw">final OptionalArg<Integer> seedArg = this.withOptionalArg("seed", "server.commands.worldgenbenchmark.seed.desc", ArgTypes.INTEGER);
@Nonnull
class="kw">private class="kw">final RequiredArg<Vector2i> pos1Arg = this.withRequiredArg("pos1", "server.commands.worldgenbenchmark.pos1.desc", ArgTypes.VECTOR2I);
@Nonnull
class="kw">private class="kw">final RequiredArg<Vector2i> pos2Arg = this.withRequiredArg("pos2", "server.commands.worldgenbenchmark.pos2.desc", ArgTypes.VECTOR2I);
class="kw">public WorldGenBenchmarkCommand() {
super("benchmark", "server.commands.worldgenbenchmark.desc");
}
@Override
class="kw">protected void executeSync(@Nonnull CommandContext var1) {
if (IS_RUNNING.get()) {
var1.sendMessage(MESSAGE_COMMANDS_WORLD_GEN_BENCHMARK_ALREADY_IN_PROGRESS);
} else {
World var2 = this.worldArg.getProcessed(var1);
String var3 = var2.getName();
int var4 = this.seedArg.provided(var1) ? this.seedArg.get(var1) : (int)var2.getWorldConfig().getSeed();
IWorldGen var5 = var2.getChunkStore().getGenerator();
if (!(var5 class="kw">instanceof IBenchmarkableWorldGen var6)) {
var1.sendMessage(MESSAGE_COMMANDS_WORLD_GEN_BENCHMARK_BENCHMARK_NOT_SUPPORTED);
} else {
Vector2i var7 = this.pos1Arg.get(var1);
Vector2i var8 = this.pos2Arg.get(var1);
int var9;
int var10;
if (var7.x < var8.x) {
var9 = ChunkUtil.chunkCoordinate(var7.x);
var10 = ChunkUtil.chunkCoordinate(var8.x);
} else {
var9 = ChunkUtil.chunkCoordinate(var8.x);
var10 = ChunkUtil.chunkCoordinate(var7.x);
}
int var11;
int var12;
if (var7.y < var8.y) {
var11 = ChunkUtil.chunkCoordinate(var7.y);
var12 = ChunkUtil.chunkCoordinate(var8.y);
} else {
var11 = ChunkUtil.chunkCoordinate(var8.y);
var12 = ChunkUtil.chunkCoordinate(var7.y);
}
LongArrayList var13 = new LongArrayList();
for (int var14 = var9; var14 <= var10; var14++) {
for (int var15 = var11; var15 <= var12; var15++) {
var13.add(ChunkUtil.indexChunk(var14, var15));
}
}
if (IS_RUNNING.getAndSet(true)) {
var1.sendMessage(MESSAGE_COMMANDS_WORLD_GEN_BENCHMARK_ABORT);
} else {
var1.sendMessage(
Message.translation("server.commands.worldgenbenchmark.started").param("seed", var4).param("worldName", var3).param("size", var13.size())
);
var6.getBenchmark().start();
int var17 = var13.size();
long var18 = System.nanoTime();
new Thread(
() -> {
try {
Set var13 = new HashSet<>();
long var14 = System.nanoTime();
do {
long var16 = System.nanoTime();
if (var16 >= var14) {
var2.execute(
() -> var2.sendMessage(
Message.translation("server.commands.worldgenbenchmark.progress")
.param("percent", Math.round((1.0 - (double)var13.size() / var17) * 1000.0) / 10.0)
)
);
var14 = var16 + 5000000000L;
}
var13.removeIf(CompletableFuture::isDone);
for (int var18 = var13.size(); var18 < 20 && !var13.isEmpty(); var18++) {
long var19 = var13.removeLong(var13.size() - 1);
CompletableFuture var21 = var5.generate(
var4, var19, ChunkUtil.xOfChunkIndex(var19), ChunkUtil.zOfChunkIndex(var19), var0x -> true, var0x -> 0.0F
);
var13.add(var21);
}
} while (!var13.isEmpty());
String var34 = FormatUtil.nanosToString(System.nanoTime() - var18);
var2.execute(() -> var2.sendMessage(Message.translation("server.commands.worldgenbenchmark.done").param("duration", var34)));
var2.execute(() -> var2.sendMessage(MESSAGE_COMMANDS_WORLD_GEN_BENCHMARK_SAVING));
String var17 = "quant." + System.currentTimeMillis() + "." + (var10 - var9) + "x" + (var12 - var11) + "." + var3 + ".txt";
File var35 = new File("quantification");
File var36 = new File("quantification" + File.separator + var17);
var35.mkdirs();
try (FileWriter var20 = new FileWriter(var36, StandardCharsets.UTF_8)) {
var20.write(var6.getBenchmark().buildReport().join());
var2.execute(() -> var2.sendMessage(Message.translation("server.commands.worldgenbenchmark.saveDone").param("fileName", var17)));
} catch (Exception var31) {
((HytaleLogger.Api)HytaleLogger.getLogger().at(Level.SEVERE).withCause(var31)).log("Failed to save worldgen benchmark report!");
var2.execute(() -> var2.sendMessage(MESSAGE_COMMANDS_WORLD_GEN_BENCHMARK_SAVE_FAILED));
}
var6.getBenchmark().stop();
} catch (RejectedExecutionException var32) {
HytaleLogger.getLogger().at(Level.SEVERE).log("Cancelled worldgen benchmark due to generator shutdown");
} class="kw">finally {
IS_RUNNING.set(false);
}
},
"WorldGenBenchmarkCommand"
)
.start();
}
}
}
}
}