From 62f4d0191e4592a30196256f432e6b47d6023fbe Mon Sep 17 00:00:00 2001 From: daoge_cmd <3523206925@qq.com> Date: Tue, 18 Jun 2024 04:27:24 +0800 Subject: [PATCH] chores: some improvements to WorldGenerator & dashboard --- .../api/world/generator/WorldGenerator.java | 2 +- .../java/org/allaymc/server/gui/Dashboard.java | 1 + .../java/org/allaymc/server/gui/GraphPanel.java | 4 +++- .../world/generator/AllayWorldGenerator.java | 14 ++++---------- .../server/world/service/AllayChunkService.java | 4 ++-- 5 files changed, 11 insertions(+), 14 deletions(-) diff --git a/Allay-API/src/main/java/org/allaymc/api/world/generator/WorldGenerator.java b/Allay-API/src/main/java/org/allaymc/api/world/generator/WorldGenerator.java index 481436acb..bf193a50d 100644 --- a/Allay-API/src/main/java/org/allaymc/api/world/generator/WorldGenerator.java +++ b/Allay-API/src/main/java/org/allaymc/api/world/generator/WorldGenerator.java @@ -23,7 +23,7 @@ static WorldGeneratorBuilder builder() { return BUILDER_FACTORY.get().create(); } - Chunk generateFinishedChunkSynchronously(int x, int z); + Chunk generateChunk(int x, int z); String getName(); diff --git a/Allay-Server/src/main/java/org/allaymc/server/gui/Dashboard.java b/Allay-Server/src/main/java/org/allaymc/server/gui/Dashboard.java index cf3cd0dd7..b2d8b2841 100644 --- a/Allay-Server/src/main/java/org/allaymc/server/gui/Dashboard.java +++ b/Allay-Server/src/main/java/org/allaymc/server/gui/Dashboard.java @@ -463,6 +463,7 @@ private void updatePluginTable() { private void createUIComponents() { // Init the three graph ramGraph = new GraphPanel(); + ramGraph.setVariableExtreme(false); ramValues = new ArrayList<>(); // Set the ram graph to 0 for (int i = 0; i < RAM_VALUE_COUNT; i++) { diff --git a/Allay-Server/src/main/java/org/allaymc/server/gui/GraphPanel.java b/Allay-Server/src/main/java/org/allaymc/server/gui/GraphPanel.java index 56c3a0dff..be4f4c0c5 100644 --- a/Allay-Server/src/main/java/org/allaymc/server/gui/GraphPanel.java +++ b/Allay-Server/src/main/java/org/allaymc/server/gui/GraphPanel.java @@ -59,7 +59,8 @@ public final class GraphPanel extends JPanel { private final static int MIN_SCORE_THRESHOLD = 0; private int minScore = MIN_SCORE_THRESHOLD; private int maxScore = MAX_SCORE_THRESHOLD; - + @Setter + private boolean variableExtreme = true; @Setter private String xLabel = ""; @@ -194,6 +195,7 @@ private int getMaxScore() { } private void calculateExtremum() { + if (!variableExtreme) return; minScore = Integer.MAX_VALUE; maxScore = Integer.MIN_VALUE; for (int value : values) { diff --git a/Allay-Server/src/main/java/org/allaymc/server/world/generator/AllayWorldGenerator.java b/Allay-Server/src/main/java/org/allaymc/server/world/generator/AllayWorldGenerator.java index 2cf3834ed..03492409e 100644 --- a/Allay-Server/src/main/java/org/allaymc/server/world/generator/AllayWorldGenerator.java +++ b/Allay-Server/src/main/java/org/allaymc/server/world/generator/AllayWorldGenerator.java @@ -44,6 +44,7 @@ public final class AllayWorldGenerator implements WorldGenerator { private final List entitySpawners; private final Consumer onDimensionSet; // 存储基本区块,基本区块的ChunkStatus为NOISED + // 基本区块只会在当一个区块生成时需要访问相邻未生成区块时产生 private final Map basicChunks = new Long2ObjectNonBlockingMap<>(); @Getter @@ -94,7 +95,7 @@ public void setDimension(Dimension dimension) { * 立即在此线程生成完整区块,完整区块的ChunkStatus为FINISHED,即可被载入世界 */ @Override - public Chunk generateFinishedChunkSynchronously(int x, int z) { + public Chunk generateChunk(int x, int z) { Chunk chunk = basicChunks.remove(HashUtils.hashXZ(x, z)); if (chunk != null) { statusNoisedToFinished(chunk); @@ -106,20 +107,13 @@ public Chunk generateFinishedChunkSynchronously(int x, int z) { } private Chunk getOrGenerateBasicChunk(int x, int z) { - var chunkHash = HashUtils.hashXZ(x, z); - var chunk = basicChunks.get(chunkHash); - if (chunk != null) { - return chunk; - } - chunk = generateBasicChunkImmediately(x, z); - basicChunks.put(chunkHash, chunk); - return chunk; + return basicChunks.computeIfAbsent(HashUtils.hashXZ(x, z), unused -> generateBasicChunk(x, z)); } /** * 生成基本区块,基本区块的ChunkStatus为NOISED */ - private Chunk generateBasicChunkImmediately(int x, int z) { + private Chunk generateBasicChunk(int x, int z) { var chunk = AllayUnsafeChunk.builder().emptyChunk(x, z, dimension.getDimensionInfo()).toSafeChunk(); statusEmptyToNoised(chunk); return chunk; diff --git a/Allay-Server/src/main/java/org/allaymc/server/world/service/AllayChunkService.java b/Allay-Server/src/main/java/org/allaymc/server/world/service/AllayChunkService.java index a7b8bbd31..45fac7b2f 100644 --- a/Allay-Server/src/main/java/org/allaymc/server/world/service/AllayChunkService.java +++ b/Allay-Server/src/main/java/org/allaymc/server/world/service/AllayChunkService.java @@ -192,7 +192,7 @@ public CompletableFuture loadChunk(int x, int z) { .thenApplyAsync(chunk -> { if (chunk.getState() != FINISHED) { // 只要未完全加载好都重新加载 - chunk = getWorldGenerator().generateFinishedChunkSynchronously(x, z); + chunk = getWorldGenerator().generateChunk(x, z); } return chunk; }, Server.getInstance().getComputeThreadPool()) @@ -228,7 +228,7 @@ private Chunk loadChunkSynchronously(int x, int z, CompletableFuture futu } try { if (chunk.getState() != FINISHED) { - chunk = getWorldGenerator().generateFinishedChunkSynchronously(x, z); + chunk = getWorldGenerator().generateChunk(x, z); } } catch (Throwable t) { log.error("Error while generating chunk ({},{}) !", x, z, t);