From 0fb3c220fb93fdac182dae17d5f463098ea959ad Mon Sep 17 00:00:00 2001 From: Guillaume Mercier <10gui-gui10@live.ca> Date: Fri, 23 Jan 2026 10:17:35 -0500 Subject: [PATCH] Speedup simple transformers by caching meta map into lambda capture. --- .../utility/SimpleTransformationMap.java | 32 ++++++++------ .../postea/utility/TransformerRegistry.java | 42 +++++++++++-------- 2 files changed, 45 insertions(+), 29 deletions(-) diff --git a/src/main/java/com/gtnewhorizons/postea/utility/SimpleTransformationMap.java b/src/main/java/com/gtnewhorizons/postea/utility/SimpleTransformationMap.java index b5d3930..5fd18e5 100644 --- a/src/main/java/com/gtnewhorizons/postea/utility/SimpleTransformationMap.java +++ b/src/main/java/com/gtnewhorizons/postea/utility/SimpleTransformationMap.java @@ -8,11 +8,9 @@ import javax.annotation.Nullable; import net.minecraftforge.oredict.OreDictionary; -import org.apache.commons.lang3.tuple.Pair; +public class SimpleTransformationMap { -public class SimpleTransformationMap { - - private final Map>> registry = new HashMap<>(); + private final Map> registry = new HashMap<>(); /** * Puts a mapping in this registry. @@ -20,14 +18,11 @@ public class SimpleTransformationMap { * @param originalId The original id of the item/block to replace. * @param originalMeta The metadata of the item/block to replace. OreDictionary.WILDCARD_VALUE can be used as a * wildcard. - * @param newId The id of the replacement block/item. - * @param newMeta The new meta of the block to block/item. */ - public void put(String originalId, int originalMeta, int newId, int newMeta) { + public void put(String originalId, int originalMeta, T data) { if (originalMeta == -1) originalMeta = OreDictionary.WILDCARD_VALUE; - if (newMeta == -1) newMeta = OreDictionary.WILDCARD_VALUE; this.registry.computeIfAbsent(originalId, k -> new HashMap<>()) - .put(originalMeta, Pair.of(newId, (short) newMeta)); + .put(originalMeta, data); } /** @@ -37,10 +32,16 @@ public class SimpleTransformationMap { * @param meta The meta of the item/block to replace. * @return The new id and meta for the item/block if found. */ - public @Nullable Pair get(String id, int meta) { - Map> metaMap = this.registry.get(id); + public @Nullable T get(String id, int meta) { + Map metaMap = this.registry.get(id); if (metaMap == null) return null; - Pair mapping = metaMap.get(meta); + T mapping = metaMap.get(meta); + if (mapping != null) return mapping; + return metaMap.get(OreDictionary.WILDCARD_VALUE); + } + + public static @Nullable T getFromSubmap(Map metaMap, int meta) { + T mapping = metaMap.get(meta); if (mapping != null) return mapping; return metaMap.get(OreDictionary.WILDCARD_VALUE); } @@ -51,4 +52,11 @@ public class SimpleTransformationMap { public Set keySet() { return this.registry.keySet(); } + + /** + * @return the set of all registered item ids. + */ + public Set>> entrySet() { + return this.registry.entrySet(); + } } diff --git a/src/main/java/com/gtnewhorizons/postea/utility/TransformerRegistry.java b/src/main/java/com/gtnewhorizons/postea/utility/TransformerRegistry.java index de4c21b..f3ea427 100644 --- a/src/main/java/com/gtnewhorizons/postea/utility/TransformerRegistry.java +++ b/src/main/java/com/gtnewhorizons/postea/utility/TransformerRegistry.java @@ -1,6 +1,7 @@ package com.gtnewhorizons.postea.utility; import java.util.Collection; +import java.util.Map; import java.util.function.BiFunction; import java.util.function.Function; @@ -28,8 +29,8 @@ public class TransformerRegistry { .create(); public static final IntOpenHashSet POSTEA_MARKED_IDS = new IntOpenHashSet(); - public static final SimpleTransformationMap SIMPLE_ITEM_TRANSFORMATION_MAP = new SimpleTransformationMap(); - public static final SimpleTransformationMap SIMPLE_BLOCK_TRANSFORMATION_MAP = new SimpleTransformationMap(); + public static final SimpleTransformationMap> SIMPLE_ITEM_TRANSFORMATION_MAP = new SimpleTransformationMap<>(); + public static final SimpleTransformationMap> SIMPLE_BLOCK_TRANSFORMATION_MAP = new SimpleTransformationMap<>(); public static void addBlockReplacement(String originalId, BiFunction transformer) { @@ -44,37 +45,43 @@ public class TransformerRegistry { public static void addSimpleTransformer(String originalId, int originalMeta, Block newBlock, int newMeta, boolean skipStackRemap) { - SIMPLE_BLOCK_TRANSFORMATION_MAP.put(originalId, originalMeta, Block.getIdFromBlock(newBlock), newMeta); + if (newMeta == -1) newMeta = OreDictionary.WILDCARD_VALUE; + SIMPLE_BLOCK_TRANSFORMATION_MAP + .put(originalId, originalMeta, Pair.of(Block.getIdFromBlock(newBlock), (short) newMeta)); if (!skipStackRemap) { Item item = Item.getItemFromBlock(newBlock); if (item != null) { - SIMPLE_ITEM_TRANSFORMATION_MAP.put(originalId, originalMeta, Item.getIdFromItem(item), newMeta); + SIMPLE_ITEM_TRANSFORMATION_MAP + .put(originalId, originalMeta, Pair.of(Item.getIdFromItem(item), (short) newMeta)); } } } public static void addSimpleTransformer(String originalId, int originalMeta, Item newItem, int newMeta, boolean skipBlockRemap) { + if (newMeta == -1) newMeta = OreDictionary.WILDCARD_VALUE; if (!skipBlockRemap && newItem instanceof ItemBlock ib) { SIMPLE_BLOCK_TRANSFORMATION_MAP - .put(originalId, originalMeta, Block.getIdFromBlock(ib.field_150939_a), newMeta); + .put(originalId, originalMeta, Pair.of(Block.getIdFromBlock(ib.field_150939_a), (short) newMeta)); } - SIMPLE_ITEM_TRANSFORMATION_MAP.put(originalId, originalMeta, Item.getIdFromItem(newItem), newMeta); + SIMPLE_ITEM_TRANSFORMATION_MAP + .put(originalId, originalMeta, Pair.of(Item.getIdFromItem(newItem), (short) newMeta)); } public static void onLoadCompleted() { - for (String originalId : SIMPLE_BLOCK_TRANSFORMATION_MAP.keySet()) { - MissingMappingHandler.createDummyBlockIfNeeded(originalId); - BLOCK_REPLACEMENT_MAP.put(originalId, TransformerRegistry::simpleBlockTransformer); + for (Map.Entry>> kv : SIMPLE_BLOCK_TRANSFORMATION_MAP.entrySet()) { + MissingMappingHandler.createDummyBlockIfNeeded(kv.getKey()); + BLOCK_REPLACEMENT_MAP.put(kv.getKey(), (info, world) -> simpleBlockTransformer(info, world, kv.getValue())); } - for (String originalId : SIMPLE_ITEM_TRANSFORMATION_MAP.keySet()) { - MissingMappingHandler.createDummyItemIfNeeded(originalId); - ITEM_REPLACEMENT_MAP.put(originalId, tag -> simpleItemStackTransformer(tag, originalId)); + for (Map.Entry>> kv : SIMPLE_ITEM_TRANSFORMATION_MAP.entrySet()) { + MissingMappingHandler.createDummyItemIfNeeded(kv.getKey()); + ITEM_REPLACEMENT_MAP.put(kv.getKey(), tag -> simpleItemStackTransformer(tag, kv.getValue())); } } - private static @Nullable BlockConversionInfo simpleBlockTransformer(BlockConversionInfo info, World world) { - Pair mapping = SIMPLE_BLOCK_TRANSFORMATION_MAP.get(info.blockName, info.metadata); + private static @Nullable BlockConversionInfo simpleBlockTransformer(BlockConversionInfo info, World world, + Map> metaMap) { + Pair mapping = SimpleTransformationMap.getFromSubmap(metaMap, info.metadata); if (mapping == null) return null; info.blockID = mapping.getKey(); if (mapping.getValue() != OreDictionary.WILDCARD_VALUE) { @@ -83,9 +90,10 @@ public class TransformerRegistry { return info; } - private static @Nullable NBTTagCompound simpleItemStackTransformer(NBTTagCompound tag, String originalId) { - short damage = tag.getShort("Damage"); - Pair mapping = SIMPLE_ITEM_TRANSFORMATION_MAP.get(originalId, damage); + private static @Nullable NBTTagCompound simpleItemStackTransformer(NBTTagCompound tag, + Map> metaMap) { + short meta = tag.getShort("Damage"); + Pair mapping = SimpleTransformationMap.getFromSubmap(metaMap, meta); if (mapping == null) return null; IDExtenderCompat.setItemStackID(tag, mapping.getKey()); if (mapping.getValue() != OreDictionary.WILDCARD_VALUE) {