Skip to content

Commit

Permalink
increase block/biome registry performance (#1)
Browse files Browse the repository at this point in the history
  • Loading branch information
granny authored and OptimisticDeving committed Jun 29, 2024
1 parent 05cb280 commit 956fe32
Show file tree
Hide file tree
Showing 7 changed files with 64 additions and 15 deletions.
11 changes: 10 additions & 1 deletion bukkit/src/main/java/net/pl3x/map/bukkit/BukkitWorld.java
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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;
Expand All @@ -62,7 +65,13 @@ public BukkitWorld(@NotNull ServerLevel level, @NotNull String name) {
init();

// register biomes
for (Map.Entry<ResourceKey<Biome>, Biome> entry : level.registryAccess().registryOrThrow(Registries.BIOME).entrySet()) {
Set<Map.Entry<ResourceKey<Biome>, Biome>> entries = level.registryAccess().registryOrThrow(Registries.BIOME).entrySet();
for (Map.Entry<ResourceKey<Biome>, 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());
Expand Down
12 changes: 11 additions & 1 deletion bukkit/src/main/java/net/pl3x/map/bukkit/Pl3xMapImpl.java
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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;
Expand Down Expand Up @@ -166,7 +170,13 @@ public int getColorForPower(byte power) {

@Override
protected void loadBlocks() {
for (Map.Entry<ResourceKey<Block>, Block> entry : MinecraftServer.getServer().registryAccess().registryOrThrow(Registries.BLOCK).entrySet()) {
Set<Map.Entry<ResourceKey<Block>, Block>> entries = MinecraftServer.getServer().registryAccess().registryOrThrow(Registries.BLOCK).entrySet();
for (Map.Entry<ResourceKey<Block>, 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);
Expand Down
13 changes: 8 additions & 5 deletions core/src/main/java/net/pl3x/map/core/registry/BiomeRegistry.java
Original file line number Diff line number Diff line change
Expand Up @@ -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<String, Integer> indexMap;
private int lastIndex = 0;

public BiomeRegistry() {
this.indexMap = new HashMap<>();
Expand All @@ -67,20 +69,21 @@ 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++;
}
}

public @NotNull Biome register(@NotNull String id, int color, int foliage, int grass, int water, Biome.@NotNull GrassModifier grassModifier) {
if (has(id)) {
throw new KeyAlreadyExistsException("Biome already registered: " + id);
}

return register(id, new Biome(getNextIndex(id), id, color, foliage, grass, water, grassModifier));
}

Expand Down
16 changes: 11 additions & 5 deletions core/src/main/java/net/pl3x/map/core/registry/BlockRegistry.java
Original file line number Diff line number Diff line change
Expand Up @@ -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<String, Integer> indexMap;
private int lastIndex = 0;

public BlockRegistry() {
this.indexMap = new HashMap<>();
Expand All @@ -64,18 +66,22 @@ public void init() {
}
}

public Map<String, Integer> 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++;
}
}

Expand Down
5 changes: 4 additions & 1 deletion core/src/main/java/net/pl3x/map/core/world/Blocks.java
Original file line number Diff line number Diff line change
Expand Up @@ -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());
});
}
}
11 changes: 10 additions & 1 deletion fabric/src/main/java/net/pl3x/map/fabric/server/FabricWorld.java
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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;
Expand All @@ -62,7 +65,13 @@ public FabricWorld(@NotNull ServerLevel level, @NotNull String name) {
init();

// register biomes
for (Map.Entry<ResourceKey<Biome>, Biome> entry : level.registryAccess().registryOrThrow(Registries.BIOME).entrySet()) {
Set<Map.Entry<ResourceKey<Biome>, Biome>> entries = level.registryAccess().registryOrThrow(Registries.BIOME).entrySet();
for (Map.Entry<ResourceKey<Biome>, 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());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -229,7 +232,13 @@ public int getColorForPower(byte power) {

@Override
protected void loadBlocks() {
for (Map.Entry<ResourceKey<Block>, Block> entry : this.server.registryAccess().registryOrThrow(Registries.BLOCK).entrySet()) {
Set<Map.Entry<ResourceKey<Block>, Block>> entries = this.server.registryAccess().registryOrThrow(Registries.BLOCK).entrySet();
for (Map.Entry<ResourceKey<Block>, 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);
Expand Down

0 comments on commit 956fe32

Please sign in to comment.