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();
            }
         }
      }
   }
}