From 6cfc179e861f5ba5e4650ef2c75558b3d3f6dabf Mon Sep 17 00:00:00 2001 From: "Blue (Lukas Rieger)" Date: Sun, 23 Aug 2020 12:36:29 +0200 Subject: [PATCH 1/2] Switched to caffeine caches and more optimizations --- BlueMapBukkit/build.gradle | 3 + BlueMapCLI/build.gradle | 3 + .../bluemap/common/RenderTask.java | 8 +-- BlueMapCore/build.gradle | 1 + .../core/config/BlockPropertiesConfig.java | 20 ++----- .../bluemap/core/logger/AbstractLogger.java | 7 +-- .../bluemap/core/mca/MCAWorld.java | 56 +++++-------------- .../core/resourcepack/BlockStateResource.java | 6 +- BlueMapFabric/build.gradle | 5 +- .../bluecolored/bluemap/fabric/FabricMod.java | 17 ++---- BlueMapForge/build.gradle | 3 + .../bluecolored/bluemap/forge/ForgeMod.java | 17 ++---- BlueMapSponge/build.gradle | 5 +- 13 files changed, 56 insertions(+), 95 deletions(-) diff --git a/BlueMapBukkit/build.gradle b/BlueMapBukkit/build.gradle index 85909d4d..cda22d35 100644 --- a/BlueMapBukkit/build.gradle +++ b/BlueMapBukkit/build.gradle @@ -33,6 +33,9 @@ build.dependsOn shadowJar { relocate 'org.apache.commons.lang3', 'de.bluecolored.shadow.apache.commons.lang3' relocate 'org.bstats.bukkit', 'de.bluecolored.shadow.bstats.bukkit' relocate 'com.mojang.brigadier', 'de.bluecolored.shadow.mojang.brigadier' + relocate 'com.github.benmanes.caffeine', 'de.bluecolored.shadow.benmanes.caffeine' + relocate 'com.google.errorprone', 'de.bluecolored.shadow.google.errorprone' + relocate 'org.checkerframework', 'de.bluecolored.shadow.checkerframework' } processResources { diff --git a/BlueMapCLI/build.gradle b/BlueMapCLI/build.gradle index ac14e0af..9ba8f697 100644 --- a/BlueMapCLI/build.gradle +++ b/BlueMapCLI/build.gradle @@ -25,4 +25,7 @@ build.dependsOn shadowJar { relocate 'org.apache.commons.lang3', 'de.bluecolored.shadow.apache.commons.lang3' relocate 'org.bstats.bukkit', 'de.bluecolored.shadow.bstats.bukkit' relocate 'org.yaml.snakeyaml', 'de.bluecolored.shadow.yaml.snakeyaml' + relocate 'com.github.benmanes.caffeine', 'de.bluecolored.shadow.benmanes.caffeine' + relocate 'com.google.errorprone', 'de.bluecolored.shadow.google.errorprone' + relocate 'org.checkerframework', 'de.bluecolored.shadow.checkerframework' } \ No newline at end of file diff --git a/BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/RenderTask.java b/BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/RenderTask.java index bd10bd15..45fb36f5 100644 --- a/BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/RenderTask.java +++ b/BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/RenderTask.java @@ -29,7 +29,6 @@ import java.io.DataOutputStream; import java.io.IOException; import java.util.ArrayDeque; import java.util.ArrayList; -import java.util.Arrays; import java.util.Collection; import java.util.Deque; import java.util.List; @@ -65,8 +64,8 @@ public class RenderTask { Vector2d sortGridSize = new Vector2d(20, 20).div(mapType.getTileRenderer().getHiresModelManager().getTileSize().toDouble().div(16)).ceil().max(1, 1); synchronized (renderTiles) { - Vector2i[] array = renderTiles.toArray(new Vector2i[renderTiles.size()]); - Arrays.sort(array, (v1, v2) -> { + ArrayList tileList = new ArrayList<>(renderTiles); + tileList.sort((v1, v2) -> { Vector2i v1SortGridPos = v1.toDouble().div(sortGridSize).floor().toInt(); Vector2i v2SortGridPos = v2.toDouble().div(sortGridSize).floor().toInt(); @@ -90,8 +89,9 @@ public class RenderTask { return 0; }); + renderTiles.clear(); - for (Vector2i tile : array) { + for (Vector2i tile : tileList) { renderTiles.add(tile); } } diff --git a/BlueMapCore/build.gradle b/BlueMapCore/build.gradle index bfd61afe..582b6741 100644 --- a/BlueMapCore/build.gradle +++ b/BlueMapCore/build.gradle @@ -3,6 +3,7 @@ plugins { } dependencies { + compile 'com.github.ben-manes.caffeine:caffeine:2.8.5' compile 'com.google.guava:guava:21.0' compile 'com.google.code.gson:gson:2.8.0' compile 'org.apache.commons:commons-lang3:3.6' diff --git a/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/config/BlockPropertiesConfig.java b/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/config/BlockPropertiesConfig.java index 9949cf1e..bfb2bf81 100644 --- a/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/config/BlockPropertiesConfig.java +++ b/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/config/BlockPropertiesConfig.java @@ -26,11 +26,9 @@ package de.bluecolored.bluemap.core.config; import java.io.IOException; import java.util.Map.Entry; -import java.util.concurrent.ExecutionException; -import com.google.common.cache.CacheBuilder; -import com.google.common.cache.CacheLoader; -import com.google.common.cache.LoadingCache; +import com.github.benmanes.caffeine.cache.Caffeine; +import com.github.benmanes.caffeine.cache.LoadingCache; import com.google.common.collect.Multimap; import com.google.common.collect.MultimapBuilder; import com.google.common.collect.Multimaps; @@ -80,22 +78,14 @@ public class BlockPropertiesConfig implements BlockPropertiesMapper { } } - mappingCache = CacheBuilder.newBuilder() - .concurrencyLevel(8) + mappingCache = Caffeine.newBuilder() .maximumSize(10000) - .build(new CacheLoader(){ - @Override public BlockProperties load(BlockState key) { return mapNoCache(key); } - }); + .build(key -> mapNoCache(key)); } @Override public BlockProperties get(BlockState from){ - try { - return mappingCache.get(from); - } catch (ExecutionException neverHappens) { - //should never happen, since the CacheLoader does not throw any exceptions - throw new RuntimeException("Unexpected error while trying to map a BlockState's properties", neverHappens.getCause()); - } + return mappingCache.get(from); } private BlockProperties mapNoCache(BlockState bs){ diff --git a/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/logger/AbstractLogger.java b/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/logger/AbstractLogger.java index 027c9ee6..1ea89c8f 100644 --- a/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/logger/AbstractLogger.java +++ b/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/logger/AbstractLogger.java @@ -26,8 +26,8 @@ package de.bluecolored.bluemap.core.logger; import java.util.concurrent.TimeUnit; -import com.google.common.cache.Cache; -import com.google.common.cache.CacheBuilder; +import com.github.benmanes.caffeine.cache.Cache; +import com.github.benmanes.caffeine.cache.Caffeine; public abstract class AbstractLogger extends Logger { @@ -36,8 +36,7 @@ public abstract class AbstractLogger extends Logger { private Cache noFloodCache; public AbstractLogger() { - noFloodCache = CacheBuilder.newBuilder() - .concurrencyLevel(4) + noFloodCache = Caffeine.newBuilder() .expireAfterWrite(1, TimeUnit.HOURS) .maximumSize(10000) .build(); diff --git a/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/mca/MCAWorld.java b/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/mca/MCAWorld.java index 200793f1..ee284730 100644 --- a/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/mca/MCAWorld.java +++ b/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/mca/MCAWorld.java @@ -39,16 +39,15 @@ import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.UUID; -import java.util.concurrent.ExecutionException; +import java.util.concurrent.TimeUnit; import java.util.function.Predicate; import com.flowpowered.math.vector.Vector2i; import com.flowpowered.math.vector.Vector3i; -import com.google.common.cache.Cache; -import com.google.common.cache.CacheBuilder; +import com.github.benmanes.caffeine.cache.Caffeine; +import com.github.benmanes.caffeine.cache.LoadingCache; import com.google.common.collect.Multimap; import com.google.common.collect.MultimapBuilder; -import com.google.common.util.concurrent.UncheckedExecutionException; import de.bluecolored.bluemap.core.logger.Logger; import de.bluecolored.bluemap.core.mca.extensions.BlockStateExtension; @@ -82,7 +81,6 @@ import net.querz.nbt.mca.MCAUtil; public class MCAWorld implements World { - private static final Cache CHUNK_CACHE = CacheBuilder.newBuilder().maximumSize(500).build(); private static final Multimap BLOCK_STATE_EXTENSIONS = MultimapBuilder.hashKeys().arrayListValues().build(); static { @@ -106,6 +104,8 @@ public class MCAWorld implements World { private int seaLevel; private Vector3i spawnPoint; + private final LoadingCache chunkCache; + private BlockIdMapper blockIdMapper; private BlockPropertiesMapper blockPropertiesMapper; private BiomeMapper biomeMapper; @@ -139,6 +139,11 @@ public class MCAWorld implements World { this.ignoreMissingLightData = ignoreMissingLightData; this.forgeBlockMappings = new HashMap<>(); + + this.chunkCache = Caffeine.newBuilder() + .maximumSize(500) + .expireAfterWrite(1, TimeUnit.MINUTES) + .build(chunkPos -> this.loadChunkOrEmpty(chunkPos, 2, 1000)); } public BlockState getBlockState(Vector3i pos) { @@ -191,11 +196,11 @@ public class MCAWorld implements World { public Chunk getChunk(Vector2i chunkPos) { try { - Chunk chunk = CHUNK_CACHE.get(new WorldChunkHash(this, chunkPos), () -> this.loadChunkOrEmpty(chunkPos, 2, 1000)); + Chunk chunk = chunkCache.get(chunkPos); return chunk; - } catch (UncheckedExecutionException | ExecutionException e) { + } catch (RuntimeException e) { if (e.getCause() instanceof InterruptedException) Thread.currentThread().interrupt(); - throw new RuntimeException(e.getCause()); + throw e; } } @@ -341,12 +346,12 @@ public class MCAWorld implements World { @Override public void invalidateChunkCache() { - CHUNK_CACHE.invalidateAll(); + chunkCache.invalidateAll(); } @Override public void invalidateChunkCache(Vector2i chunk) { - CHUNK_CACHE.invalidate(new WorldChunkHash(this, chunk)); + chunkCache.invalidate(chunk); } public BlockIdMapper getBlockIdMapper() { @@ -422,9 +427,6 @@ public class MCAWorld implements World { levelData.getInt("SpawnZ") ); - - CHUNK_CACHE.invalidateAll(); - MCAWorld world = new MCAWorld( worldFolder, uuid, @@ -487,32 +489,4 @@ public class MCAWorld implements World { } } - private static class WorldChunkHash { - - private final UUID world; - private final Vector2i chunk; - - public WorldChunkHash(MCAWorld world, Vector2i chunk) { - this.world = world.getUUID(); - this.chunk = chunk; - } - - @Override - public int hashCode() { - return (world.hashCode() * 31 + chunk.getX()) * 31 + chunk.getY(); - } - - @Override - public boolean equals(Object obj) { - - if (obj instanceof WorldChunkHash) { - WorldChunkHash other = (WorldChunkHash) obj; - return other.chunk.equals(chunk) && world.equals(other.world); - } - - return false; - } - - } - } diff --git a/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/resourcepack/BlockStateResource.java b/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/resourcepack/BlockStateResource.java index 983924c6..875d5978 100644 --- a/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/resourcepack/BlockStateResource.java +++ b/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/resourcepack/BlockStateResource.java @@ -51,8 +51,8 @@ import ninja.leaping.configurate.gson.GsonConfigurationLoader; public class BlockStateResource { - private List variants = new ArrayList<>(); - private Collection multipart = new ArrayList<>(); + private List variants = new ArrayList<>(0); + private Collection multipart = new ArrayList<>(0); private BlockStateResource() { } @@ -62,7 +62,7 @@ public class BlockStateResource { } public Collection getModels(BlockState blockState, Vector3i pos) { - Collection models = new ArrayList<>(); + Collection models = new ArrayList<>(1); Variant allMatch = null; for (Variant variant : variants) { diff --git a/BlueMapFabric/build.gradle b/BlueMapFabric/build.gradle index 860b9efc..c2e0f459 100644 --- a/BlueMapFabric/build.gradle +++ b/BlueMapFabric/build.gradle @@ -45,8 +45,9 @@ shadowJar { relocate 'net.querz.nbt', 'de.bluecolored.shadow.querz.nbt' relocate 'ninja.leaping.configurate', 'de.bluecolored.shadow.ninja.leaping.configurate' relocate 'org.yaml.snakeyaml', 'de.bluecolored.shadow.yaml.snakeyaml' - - //exclude '/mappings/*' + relocate 'com.github.benmanes.caffeine', 'de.bluecolored.shadow.benmanes.caffeine' + relocate 'com.google.errorprone', 'de.bluecolored.shadow.google.errorprone' + relocate 'org.checkerframework', 'de.bluecolored.shadow.checkerframework' } task ramappedShadowJar(type: RemapJarTask) { diff --git a/BlueMapFabric/src/main/java/de/bluecolored/bluemap/fabric/FabricMod.java b/BlueMapFabric/src/main/java/de/bluecolored/bluemap/fabric/FabricMod.java index 70cbedac..61040730 100644 --- a/BlueMapFabric/src/main/java/de/bluecolored/bluemap/fabric/FabricMod.java +++ b/BlueMapFabric/src/main/java/de/bluecolored/bluemap/fabric/FabricMod.java @@ -34,13 +34,11 @@ import java.util.Map; import java.util.Optional; import java.util.UUID; import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.ExecutionException; import org.apache.logging.log4j.LogManager; -import com.google.common.cache.CacheBuilder; -import com.google.common.cache.CacheLoader; -import com.google.common.cache.LoadingCache; +import com.github.benmanes.caffeine.cache.Caffeine; +import com.github.benmanes.caffeine.cache.LoadingCache; import de.bluecolored.bluemap.common.plugin.Plugin; import de.bluecolored.bluemap.common.plugin.commands.Commands; @@ -84,15 +82,10 @@ public class FabricMod implements ModInitializer, ServerInterface { this.worldUUIDs = new ConcurrentHashMap<>(); this.eventForwarder = new FabricEventForwarder(this); - this.worldUuidCache = CacheBuilder.newBuilder() + this.worldUuidCache = Caffeine.newBuilder() .weakKeys() .maximumSize(1000) - .build(new CacheLoader() { - @Override - public UUID load(ServerWorld key) throws Exception { - return loadUUIDForWorld(key); - } - }); + .build(this::loadUUIDForWorld); } @Override @@ -158,7 +151,7 @@ public class FabricMod implements ModInitializer, ServerInterface { public UUID getUUIDForWorld(ServerWorld world) throws IOException { try { return worldUuidCache.get(world); - } catch (ExecutionException e) { + } catch (RuntimeException e) { Throwable cause = e.getCause(); if (cause instanceof IOException) throw (IOException) cause; else throw new IOException(cause); diff --git a/BlueMapForge/build.gradle b/BlueMapForge/build.gradle index 6660743a..1ecce8cf 100644 --- a/BlueMapForge/build.gradle +++ b/BlueMapForge/build.gradle @@ -43,6 +43,9 @@ build.dependsOn shadowJar { relocate 'net.querz.nbt', 'de.bluecolored.shadow.querz.nbt' relocate 'ninja.leaping.configurate', 'de.bluecolored.shadow.ninja.leaping.configurate' relocate 'org.yaml.snakeyaml', 'de.bluecolored.shadow.yaml.snakeyaml' + relocate 'com.github.benmanes.caffeine', 'de.bluecolored.shadow.benmanes.caffeine' + relocate 'com.google.errorprone', 'de.bluecolored.shadow.google.errorprone' + relocate 'org.checkerframework', 'de.bluecolored.shadow.checkerframework' } processResources { diff --git a/BlueMapForge/src/main/java/de/bluecolored/bluemap/forge/ForgeMod.java b/BlueMapForge/src/main/java/de/bluecolored/bluemap/forge/ForgeMod.java index ea047f9f..d7da618a 100644 --- a/BlueMapForge/src/main/java/de/bluecolored/bluemap/forge/ForgeMod.java +++ b/BlueMapForge/src/main/java/de/bluecolored/bluemap/forge/ForgeMod.java @@ -34,13 +34,11 @@ import java.util.Map; import java.util.Optional; import java.util.UUID; import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.ExecutionException; import org.apache.logging.log4j.LogManager; -import com.google.common.cache.CacheBuilder; -import com.google.common.cache.CacheLoader; -import com.google.common.cache.LoadingCache; +import com.github.benmanes.caffeine.cache.Caffeine; +import com.github.benmanes.caffeine.cache.LoadingCache; import de.bluecolored.bluemap.common.plugin.Plugin; import de.bluecolored.bluemap.common.plugin.commands.Commands; @@ -87,15 +85,10 @@ public class ForgeMod implements ServerInterface { this.worldUUIDs = new ConcurrentHashMap<>(); this.eventForwarder = new ForgeEventForwarder(this); - this.worldUuidCache = CacheBuilder.newBuilder() + this.worldUuidCache = Caffeine.newBuilder() .weakKeys() .maximumSize(1000) - .build(new CacheLoader() { - @Override - public UUID load(ServerWorld key) throws Exception { - return loadUUIDForWorld(key); - } - }); + .build(this::loadUUIDForWorld); MinecraftForge.EVENT_BUS.register(this); } @@ -157,7 +150,7 @@ public class ForgeMod implements ServerInterface { public UUID getUUIDForWorld(ServerWorld world) throws IOException { try { return worldUuidCache.get(world); - } catch (ExecutionException e) { + } catch (RuntimeException e) { Throwable cause = e.getCause(); if (cause instanceof IOException) throw (IOException) cause; else throw new IOException(cause); diff --git a/BlueMapSponge/build.gradle b/BlueMapSponge/build.gradle index 51d9a1b3..9003ea3d 100644 --- a/BlueMapSponge/build.gradle +++ b/BlueMapSponge/build.gradle @@ -22,8 +22,9 @@ build.dependsOn shadowJar { relocate 'net.querz.nbt', 'de.bluecolored.shadow.querz.nbt' relocate 'org.apache.commons.io', 'de.bluecolored.shadow.apache.commons.io' relocate 'com.mojang.brigadier', 'de.bluecolored.shadow.mojang.brigadier' - - minimize() + relocate 'com.github.benmanes.caffeine', 'de.bluecolored.shadow.benmanes.caffeine' + relocate 'com.google.errorprone', 'de.bluecolored.shadow.google.errorprone' + relocate 'org.checkerframework', 'de.bluecolored.shadow.checkerframework' } processResources { From ef7345bed9cf720fbb0230133027ebfa613d7797 Mon Sep 17 00:00:00 2001 From: "Blue (Lukas Rieger)" Date: Sun, 23 Aug 2020 12:38:39 +0200 Subject: [PATCH 2/2] Push version --- gradle.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle.properties b/gradle.properties index f97e5c4a..7da01009 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,6 +1,6 @@ org.gradle.jvmargs=-Xmx3G org.gradle.daemon=false -coreVersion=0.10.3 +coreVersion=0.11.0 targetVersion=mc1.13 \ No newline at end of file