From 956fe320424e568222ae45699cf84a38845a7830 Mon Sep 17 00:00:00 2001 From: granny Date: Tue, 24 Oct 2023 06:47:15 -0700 Subject: [PATCH] increase block/biome registry performance (#1) --- .../java/net/pl3x/map/bukkit/BukkitWorld.java | 11 ++++++++++- .../java/net/pl3x/map/bukkit/Pl3xMapImpl.java | 12 +++++++++++- .../pl3x/map/core/registry/BiomeRegistry.java | 13 ++++++++----- .../pl3x/map/core/registry/BlockRegistry.java | 16 +++++++++++----- .../java/net/pl3x/map/core/world/Blocks.java | 5 ++++- .../net/pl3x/map/fabric/server/FabricWorld.java | 11 ++++++++++- .../map/fabric/server/Pl3xMapFabricServer.java | 11 ++++++++++- 7 files changed, 64 insertions(+), 15 deletions(-) diff --git a/bukkit/src/main/java/net/pl3x/map/bukkit/BukkitWorld.java b/bukkit/src/main/java/net/pl3x/map/bukkit/BukkitWorld.java index 65e3319b1..f09a27da4 100644 --- a/bukkit/src/main/java/net/pl3x/map/bukkit/BukkitWorld.java +++ b/bukkit/src/main/java/net/pl3x/map/bukkit/BukkitWorld.java @@ -26,6 +26,7 @@ import java.util.Collection; import java.util.Map; import java.util.Objects; +import java.util.Set; import java.util.stream.Collectors; import net.minecraft.core.registries.Registries; import net.minecraft.resources.ResourceKey; @@ -35,8 +36,10 @@ import net.pl3x.map.core.Pl3xMap; import net.pl3x.map.core.configuration.ColorsConfig; import net.pl3x.map.core.event.world.WorldLoadedEvent; +import net.pl3x.map.core.log.Logger; import net.pl3x.map.core.markers.Point; import net.pl3x.map.core.player.Player; +import net.pl3x.map.core.registry.BiomeRegistry; import net.pl3x.map.core.util.Colors; import net.pl3x.map.core.util.Mathf; import net.pl3x.map.core.world.World; @@ -62,7 +65,13 @@ public BukkitWorld(@NotNull ServerLevel level, @NotNull String name) { init(); // register biomes - for (Map.Entry, Biome> entry : level.registryAccess().registryOrThrow(Registries.BIOME).entrySet()) { + Set, Biome>> entries = level.registryAccess().registryOrThrow(Registries.BIOME).entrySet(); + for (Map.Entry, Biome> entry : entries) { + if (getBiomeRegistry().size() > BiomeRegistry.MAX_INDEX) { + Logger.debug(String.format("Cannot register any more biomes. Registered: %d Unregistered: %d", getBiomeRegistry().size(), entries.size() - getBiomeRegistry().size())); + break; + } + String id = entry.getKey().location().toString(); Biome biome = entry.getValue(); float temperature = Mathf.clamp(0.0F, 1.0F, biome.getBaseTemperature()); diff --git a/bukkit/src/main/java/net/pl3x/map/bukkit/Pl3xMapImpl.java b/bukkit/src/main/java/net/pl3x/map/bukkit/Pl3xMapImpl.java index 91004ab94..70df4e01d 100644 --- a/bukkit/src/main/java/net/pl3x/map/bukkit/Pl3xMapImpl.java +++ b/bukkit/src/main/java/net/pl3x/map/bukkit/Pl3xMapImpl.java @@ -28,6 +28,7 @@ import java.util.List; import java.util.Locale; import java.util.Map; +import java.util.Set; import java.util.UUID; import net.kyori.adventure.platform.AudienceProvider; import net.kyori.adventure.platform.bukkit.BukkitAudiences; @@ -46,6 +47,9 @@ import net.minecraft.world.level.levelgen.feature.configurations.RandomPatchConfiguration; import net.minecraft.world.level.levelgen.feature.configurations.SimpleBlockConfiguration; import net.pl3x.map.core.Pl3xMap; +import net.pl3x.map.core.log.Logger; +import net.pl3x.map.core.registry.BiomeRegistry; +import net.pl3x.map.core.registry.BlockRegistry; import net.pl3x.map.core.world.World; import org.bukkit.Bukkit; import org.bukkit.craftbukkit.v1_20_R1.CraftWorld; @@ -166,7 +170,13 @@ public int getColorForPower(byte power) { @Override protected void loadBlocks() { - for (Map.Entry, Block> entry : MinecraftServer.getServer().registryAccess().registryOrThrow(Registries.BLOCK).entrySet()) { + Set, Block>> entries = MinecraftServer.getServer().registryAccess().registryOrThrow(Registries.BLOCK).entrySet(); + for (Map.Entry, Block> entry : entries) { + if (getBlockRegistry().size() > BlockRegistry.MAX_INDEX) { + Logger.debug(String.format("Cannot register any more biomes. Registered: %d Unregistered: %d", getBlockRegistry().size(), entries.size() - getBlockRegistry().size())); + break; + } + String id = entry.getKey().location().toString(); int color = entry.getValue().defaultMapColor().col; getBlockRegistry().register(id, color); diff --git a/core/src/main/java/net/pl3x/map/core/registry/BiomeRegistry.java b/core/src/main/java/net/pl3x/map/core/registry/BiomeRegistry.java index 618992a8b..4b5c33ca1 100644 --- a/core/src/main/java/net/pl3x/map/core/registry/BiomeRegistry.java +++ b/core/src/main/java/net/pl3x/map/core/registry/BiomeRegistry.java @@ -40,8 +40,10 @@ public class BiomeRegistry extends Registry<@NotNull Biome> { private static final Gson GSON = new GsonBuilder().create(); + public static final int MAX_INDEX = 1023; private final Map indexMap; + private int lastIndex = 0; public BiomeRegistry() { this.indexMap = new HashMap<>(); @@ -67,13 +69,13 @@ private int getNextIndex(String id) { if (index > -1) { return index; } - int i = 0; + while (true) { - if (!this.indexMap.containsValue(i)) { - this.indexMap.put(id, i); - return i; + if (!this.indexMap.containsValue(this.lastIndex)) { + this.indexMap.put(id, this.lastIndex); + return this.lastIndex; } - i++; + this.lastIndex++; } } @@ -81,6 +83,7 @@ private int getNextIndex(String id) { if (has(id)) { throw new KeyAlreadyExistsException("Biome already registered: " + id); } + return register(id, new Biome(getNextIndex(id), id, color, foliage, grass, water, grassModifier)); } diff --git a/core/src/main/java/net/pl3x/map/core/registry/BlockRegistry.java b/core/src/main/java/net/pl3x/map/core/registry/BlockRegistry.java index 823cf1429..603a52219 100644 --- a/core/src/main/java/net/pl3x/map/core/registry/BlockRegistry.java +++ b/core/src/main/java/net/pl3x/map/core/registry/BlockRegistry.java @@ -41,8 +41,10 @@ public class BlockRegistry extends Registry<@NotNull Block> { private static final Gson GSON = new GsonBuilder().create(); + public static final int MAX_INDEX = 1023; private final Map indexMap; + private int lastIndex = 0; public BlockRegistry() { this.indexMap = new HashMap<>(); @@ -64,18 +66,22 @@ public void init() { } } + public Map getIndexMap() { + return indexMap; + } + private int getNextIndex(String id) { int index = this.indexMap.getOrDefault(id, -1); if (index > -1) { return index; } - int i = 0; + while (true) { - if (!this.indexMap.containsValue(i)) { - this.indexMap.put(id, i); - return i; + if (!this.indexMap.containsValue(this.lastIndex)) { + this.indexMap.put(id, this.lastIndex); + return this.lastIndex; } - i++; + this.lastIndex++; } } diff --git a/core/src/main/java/net/pl3x/map/core/world/Blocks.java b/core/src/main/java/net/pl3x/map/core/world/Blocks.java index 8e4bd08a4..6f8abb963 100644 --- a/core/src/main/java/net/pl3x/map/core/world/Blocks.java +++ b/core/src/main/java/net/pl3x/map/core/world/Blocks.java @@ -1042,6 +1042,9 @@ public class Blocks { } public static void registerDefaults() { - blocks.forEach((id, block) -> Pl3xMap.api().getBlockRegistry().register(id, block)); + blocks.forEach((id, block) -> { + Pl3xMap.api().getBlockRegistry().register(id, block); + Pl3xMap.api().getBlockRegistry().getIndexMap().put(id, block.getIndex()); + }); } } diff --git a/fabric/src/main/java/net/pl3x/map/fabric/server/FabricWorld.java b/fabric/src/main/java/net/pl3x/map/fabric/server/FabricWorld.java index 9b65cfce1..02b78dbf9 100644 --- a/fabric/src/main/java/net/pl3x/map/fabric/server/FabricWorld.java +++ b/fabric/src/main/java/net/pl3x/map/fabric/server/FabricWorld.java @@ -26,6 +26,7 @@ import java.util.Collection; import java.util.Map; import java.util.Objects; +import java.util.Set; import java.util.stream.Collectors; import net.minecraft.core.registries.Registries; import net.minecraft.resources.ResourceKey; @@ -35,8 +36,10 @@ import net.pl3x.map.core.Pl3xMap; import net.pl3x.map.core.configuration.ColorsConfig; import net.pl3x.map.core.event.world.WorldLoadedEvent; +import net.pl3x.map.core.log.Logger; import net.pl3x.map.core.markers.Point; import net.pl3x.map.core.player.Player; +import net.pl3x.map.core.registry.BiomeRegistry; import net.pl3x.map.core.util.Colors; import net.pl3x.map.core.util.Mathf; import net.pl3x.map.core.world.World; @@ -62,7 +65,13 @@ public FabricWorld(@NotNull ServerLevel level, @NotNull String name) { init(); // register biomes - for (Map.Entry, Biome> entry : level.registryAccess().registryOrThrow(Registries.BIOME).entrySet()) { + Set, Biome>> entries = level.registryAccess().registryOrThrow(Registries.BIOME).entrySet(); + for (Map.Entry, Biome> entry : entries) { + if (getBiomeRegistry().size() > BiomeRegistry.MAX_INDEX) { + Logger.debug(String.format("Cannot register any more biomes. Registered: %d Unregistered: %d", getBiomeRegistry().size(), entries.size() - getBiomeRegistry().size())); + break; + } + String id = entry.getKey().location().toString(); Biome biome = entry.getValue(); float temperature = Mathf.clamp(0.0F, 1.0F, biome.getBaseTemperature()); diff --git a/fabric/src/main/java/net/pl3x/map/fabric/server/Pl3xMapFabricServer.java b/fabric/src/main/java/net/pl3x/map/fabric/server/Pl3xMapFabricServer.java index a19f90938..393a56ab6 100644 --- a/fabric/src/main/java/net/pl3x/map/fabric/server/Pl3xMapFabricServer.java +++ b/fabric/src/main/java/net/pl3x/map/fabric/server/Pl3xMapFabricServer.java @@ -27,6 +27,7 @@ import java.util.List; import java.util.Locale; import java.util.Map; +import java.util.Set; import java.util.UUID; import net.fabricmc.api.DedicatedServerModInitializer; import net.fabricmc.fabric.api.entity.event.v1.ServerPlayerEvents; @@ -56,8 +57,10 @@ import net.minecraft.world.level.levelgen.feature.configurations.SimpleBlockConfiguration; import net.pl3x.map.core.Pl3xMap; import net.pl3x.map.core.event.server.ServerLoadedEvent; +import net.pl3x.map.core.log.Logger; import net.pl3x.map.core.player.Player; import net.pl3x.map.core.player.PlayerListener; +import net.pl3x.map.core.registry.BlockRegistry; import net.pl3x.map.core.world.World; import net.pl3x.map.fabric.server.command.FabricCommandManager; import org.jetbrains.annotations.NotNull; @@ -229,7 +232,13 @@ public int getColorForPower(byte power) { @Override protected void loadBlocks() { - for (Map.Entry, Block> entry : this.server.registryAccess().registryOrThrow(Registries.BLOCK).entrySet()) { + Set, Block>> entries = this.server.registryAccess().registryOrThrow(Registries.BLOCK).entrySet(); + for (Map.Entry, Block> entry : entries) { + if (getBlockRegistry().size() > BlockRegistry.MAX_INDEX) { + Logger.debug(String.format("Cannot register any more biomes. Registered: %d Unregistered: %d", getBlockRegistry().size(), entries.size() - getBlockRegistry().size())); + break; + } + String id = entry.getKey().location().toString(); int color = entry.getValue().defaultMapColor().col; getBlockRegistry().register(id, color);