From 3ced95903a1618914382f46aaecde3e0e7be16fc Mon Sep 17 00:00:00 2001 From: Nassim Jahnke Date: Sun, 5 Mar 2023 14:45:58 +0100 Subject: [PATCH] Cache identifiers files --- .../api/data/Int2IntMapBiMappings.java | 1 + .../api/data/Int2IntMapMappings.java | 1 + .../viaversion/api/data/IntArrayMappings.java | 4 ++- .../viaversion/api/data/MappingDataBase.java | 5 ++- .../api/data/MappingDataLoader.java | 33 +++++++++++++++++- .../protocol/ProtocolManagerImpl.java | 4 +++ .../viaversion/data/mappings-1.12to1.13.nbt | Bin 23558 -> 23564 bytes .../viaversion/data/mappings-1.14to1.15.nbt | Bin 456 -> 456 bytes 8 files changed, 43 insertions(+), 5 deletions(-) diff --git a/api/src/main/java/com/viaversion/viaversion/api/data/Int2IntMapBiMappings.java b/api/src/main/java/com/viaversion/viaversion/api/data/Int2IntMapBiMappings.java index 7dd7d038b..4d7bdc61d 100644 --- a/api/src/main/java/com/viaversion/viaversion/api/data/Int2IntMapBiMappings.java +++ b/api/src/main/java/com/viaversion/viaversion/api/data/Int2IntMapBiMappings.java @@ -74,6 +74,7 @@ public class Int2IntMapBiMappings implements BiMappings { @Override public Mappings createInverse() { final Int2IntBiMap inverseCopy = new Int2IntBiHashMap(inverse.mappings.size()); + inverseCopy.defaultReturnValue(-1); for (final Int2IntMap.Entry entry : inverse.mappings.int2IntEntrySet()) { inverseCopy.put(entry.getIntKey(), entry.getIntValue()); } diff --git a/api/src/main/java/com/viaversion/viaversion/api/data/Int2IntMapMappings.java b/api/src/main/java/com/viaversion/viaversion/api/data/Int2IntMapMappings.java index 8257387f5..95c0a88f9 100644 --- a/api/src/main/java/com/viaversion/viaversion/api/data/Int2IntMapMappings.java +++ b/api/src/main/java/com/viaversion/viaversion/api/data/Int2IntMapMappings.java @@ -66,6 +66,7 @@ public class Int2IntMapMappings implements Mappings { @Override public Mappings createInverse() { final Int2IntMap inverse = new Int2IntOpenHashMap(); + inverse.defaultReturnValue(-1); for (final Int2IntMap.Entry entry : mappings.int2IntEntrySet()) { inverse.put(entry.getIntValue(), entry.getIntKey()); } diff --git a/api/src/main/java/com/viaversion/viaversion/api/data/IntArrayMappings.java b/api/src/main/java/com/viaversion/viaversion/api/data/IntArrayMappings.java index 97a39d2cd..b91fe831d 100644 --- a/api/src/main/java/com/viaversion/viaversion/api/data/IntArrayMappings.java +++ b/api/src/main/java/com/viaversion/viaversion/api/data/IntArrayMappings.java @@ -67,7 +67,9 @@ public class IntArrayMappings implements Mappings { Arrays.fill(inverse, -1); for (int id = 0; id < mappings.length; id++) { final int mappedId = mappings[id]; - inverse[mappedId] = id; + if (mappedId != -1) { + inverse[mappedId] = id; + } } return of(inverse, mappings.length); } diff --git a/api/src/main/java/com/viaversion/viaversion/api/data/MappingDataBase.java b/api/src/main/java/com/viaversion/viaversion/api/data/MappingDataBase.java index 7c244f69e..03b90d686 100644 --- a/api/src/main/java/com/viaversion/viaversion/api/data/MappingDataBase.java +++ b/api/src/main/java/com/viaversion/viaversion/api/data/MappingDataBase.java @@ -75,9 +75,8 @@ public class MappingDataBase implements MappingData { paintingMappings = loadMappings(data, "paintings"); itemMappings = loadBiMappings(data, "items"); - // TODO Don't load one file multiple times - final CompoundTag unmappedIdentifierData = MappingDataLoader.loadNBT("identifiers-" + unmappedVersion + ".nbt"); - final CompoundTag mappedIdentifierData = MappingDataLoader.loadNBT("identifiers-" + mappedVersion + ".nbt"); + final CompoundTag unmappedIdentifierData = MappingDataLoader.loadNBT("identifiers-" + unmappedVersion + ".nbt", true); + final CompoundTag mappedIdentifierData = MappingDataLoader.loadNBT("identifiers-" + mappedVersion + ".nbt", true); if (unmappedIdentifierData != null && mappedIdentifierData != null) { entityMappings = loadFullMappings(data, unmappedIdentifierData, mappedIdentifierData, "entities"); argumentTypeMappings = loadFullMappings(data, unmappedIdentifierData, mappedIdentifierData, "argumenttypes"); diff --git a/api/src/main/java/com/viaversion/viaversion/api/data/MappingDataLoader.java b/api/src/main/java/com/viaversion/viaversion/api/data/MappingDataLoader.java index aed24b36c..faaf2ccd5 100644 --- a/api/src/main/java/com/viaversion/viaversion/api/data/MappingDataLoader.java +++ b/api/src/main/java/com/viaversion/viaversion/api/data/MappingDataLoader.java @@ -44,6 +44,7 @@ import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.util.Arrays; +import java.util.HashMap; import java.util.Map; import java.util.stream.Collectors; import org.checkerframework.checker.nullness.qual.Nullable; @@ -54,9 +55,17 @@ public final class MappingDataLoader { private static final byte SHIFTS_ID = 1; private static final byte CHANGES_ID = 2; private static final byte IDENTITY_ID = 3; + private static final Map MAPPINGS_CACHE = new HashMap<>(); + private static boolean cacheValid = true; + @Deprecated/*(forRemoval = true)*/ public static void enableMappingsCache() { - //TODO + // Always enabled + } + + public static void clearCache() { + MAPPINGS_CACHE.clear(); + cacheValid = false; } /** @@ -100,7 +109,29 @@ public final class MappingDataLoader { } } + public static @Nullable CompoundTag loadNBT(final String name, final boolean cache) { + if (!cacheValid) { + return loadNBTFromFile(name); + } + + CompoundTag data = MAPPINGS_CACHE.get(name); + if (data != null) { + return data; + } + + data = loadNBTFromFile(name); + + if (cache && data != null) { + MAPPINGS_CACHE.put(name, data); + } + return data; + } + public static @Nullable CompoundTag loadNBT(final String name) { + return loadNBT(name, false); + } + + private static @Nullable CompoundTag loadNBTFromFile(final String name) { final InputStream resource = getResource(name); if (resource == null) { return null; diff --git a/common/src/main/java/com/viaversion/viaversion/protocol/ProtocolManagerImpl.java b/common/src/main/java/com/viaversion/viaversion/protocol/ProtocolManagerImpl.java index 31ee5cc6b..4fc6f39c6 100644 --- a/common/src/main/java/com/viaversion/viaversion/protocol/ProtocolManagerImpl.java +++ b/common/src/main/java/com/viaversion/viaversion/protocol/ProtocolManagerImpl.java @@ -23,6 +23,7 @@ import com.google.common.collect.Range; import com.google.common.util.concurrent.ThreadFactoryBuilder; import com.viaversion.viaversion.api.Via; import com.viaversion.viaversion.api.connection.UserConnection; +import com.viaversion.viaversion.api.data.MappingDataLoader; import com.viaversion.viaversion.api.protocol.Protocol; import com.viaversion.viaversion.api.protocol.ProtocolManager; import com.viaversion.viaversion.api.protocol.ProtocolPathEntry; @@ -517,6 +518,9 @@ public class ProtocolManagerImpl implements ProtocolManager { mappingLoaderExecutor = null; mappingLoaderFutures.clear(); mappingLoaderFutures = null; + + // Clear cached mapping files + MappingDataLoader.clearCache(); } private Function mappingLoaderThrowable(Class protocolClass) { diff --git a/common/src/main/resources/assets/viaversion/data/mappings-1.12to1.13.nbt b/common/src/main/resources/assets/viaversion/data/mappings-1.12to1.13.nbt index bec00d014a740f1555a96551adf7d5398794c95d..848c5a698ae566afe20460dc7c477346031f37b6 100644 GIT binary patch delta 24 fcmZqM!Pv8dk(Y~sfti85EVZaOGe2)5`~PSFR<;Me delta 18 ZcmeC#!PvHgk)4Zyfti7^Y$NagXaF#q1t