testserver/Spigot-Server-Patches/0430-Optimize-Bukkit-NMS-Ma...

259 lines
12 KiB
Diff

From 17c3e01aba9c7b56fdf6380dad0cfe3f9e23722f Mon Sep 17 00:00:00 2001
From: Aikar <aikar@aikar.co>
Date: Mon, 25 Mar 2019 21:07:58 -0400
Subject: [PATCH] Optimize Bukkit <-> NMS Mapping tables
Use O(1) patterns for mapping conversions to improve plugin performance.
Use optimized collections for legacy conversion
Log Legacy/API build up time
diff --git a/src/main/java/net/minecraft/server/Block.java b/src/main/java/net/minecraft/server/Block.java
index 2e460a7f6..10ee1421d 100644
--- a/src/main/java/net/minecraft/server/Block.java
+++ b/src/main/java/net/minecraft/server/Block.java
@@ -23,6 +23,8 @@ public class Block implements IMaterial {
protected final SoundEffectType stepSound;
protected final Material material;
// Paper start
+ private static int ID_POOL = 0;
+ public int internalId = ID_POOL++;
public co.aikar.timings.Timing timing;
public co.aikar.timings.Timing getTiming() {
if (timing == null) {
diff --git a/src/main/java/net/minecraft/server/DedicatedServer.java b/src/main/java/net/minecraft/server/DedicatedServer.java
index 21a05b2b2..0098843db 100644
--- a/src/main/java/net/minecraft/server/DedicatedServer.java
+++ b/src/main/java/net/minecraft/server/DedicatedServer.java
@@ -230,6 +230,13 @@ public class DedicatedServer extends MinecraftServer implements IMinecraftServer
}
}
+ // Paper start - preload legacy data here
+ long legacyStart = System.nanoTime();
+ LOGGER.info("Loading API Data");
+ int dataVersion = org.bukkit.craftbukkit.util.CraftMagicNumbers.INSTANCE.getDataVersion();
+ LOGGER.info("Loaded API Data (time: " + ((System.nanoTime() - legacyStart) / 1000000) + "ms|dataVersion=" +dataVersion + ")");
+ // Paper end
+
// CraftBukkit start
// this.a((PlayerList) (new DedicatedPlayerList(this))); // Spigot - moved up
server.loadPlugins();
diff --git a/src/main/java/net/minecraft/server/IDynamicTexture.java b/src/main/java/net/minecraft/server/IDynamicTexture.java
index 1ce4982e4..38a88bc39 100644
--- a/src/main/java/net/minecraft/server/IDynamicTexture.java
+++ b/src/main/java/net/minecraft/server/IDynamicTexture.java
@@ -1,3 +1,5 @@
package net.minecraft.server;
-public interface IDynamicTexture {}
+public interface IDynamicTexture {
+ float a(ItemStack itemstack, World world, EntityLiving entityliving); // Paper - restore client method
+}
diff --git a/src/main/java/net/minecraft/server/Item.java b/src/main/java/net/minecraft/server/Item.java
index e719769b7..ac84bbecd 100644
--- a/src/main/java/net/minecraft/server/Item.java
+++ b/src/main/java/net/minecraft/server/Item.java
@@ -32,11 +32,15 @@ public class Item implements IMaterial {
private final int maxStackSize;
private final int durability;
private final Item craftingResult;
+ // Paper start
+ private static int ID_POOL = 0;
+ public int internalId = ID_POOL++;
+ // Paper end
@Nullable
private String name;
public static int getId(Item item) {
- return item == null ? 0 : IRegistry.ITEM.a((Object) item);
+ return item == null ? 0 : IRegistry.ITEM.a(item); // Paper - decompile fix
}
public static Item getById(int i) {
@@ -1069,7 +1073,7 @@ public class Item implements IMaterial {
((ItemBlock) item).a(Item.f, item);
}
- IRegistry.ITEM.a(minecraftkey, (Object) item);
+ IRegistry.ITEM.a(minecraftkey, item); // Paper - decompile fix
}
public boolean a(Tag<Item> tag) {
diff --git a/src/main/java/org/bukkit/craftbukkit/util/CraftLegacy.java b/src/main/java/org/bukkit/craftbukkit/util/CraftLegacy.java
index c6aae8071..2602695d8 100644
--- a/src/main/java/org/bukkit/craftbukkit/util/CraftLegacy.java
+++ b/src/main/java/org/bukkit/craftbukkit/util/CraftLegacy.java
@@ -8,6 +8,9 @@ import java.util.HashSet;
import java.util.Map;
import java.util.Optional;
import java.util.Set;
+
+import it.unimi.dsi.fastutil.bytes.Byte2ObjectOpenHashMap;
+import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap;
import net.minecraft.server.Block;
import net.minecraft.server.BlockStateList;
import net.minecraft.server.Blocks;
@@ -42,14 +45,14 @@ import org.bukkit.material.MaterialData;
@Deprecated
public class CraftLegacy {
- private static final Map<Byte, Material> SPAWN_EGGS = new HashMap<>();
+ private static final Map<Byte, Material> SPAWN_EGGS = new Byte2ObjectOpenHashMap<>(); // Paper
private static final Set<String> whitelistedStates = new HashSet<>(Arrays.asList("explode", "check_decay", "decayable"));
private static final Map<MaterialData, Item> materialToItem = new HashMap<>(16384);
- private static final Map<Item, MaterialData> itemToMaterial = new HashMap<>(1024);
+ private static final Int2ObjectOpenHashMap<MaterialData> itemToMaterial = new Int2ObjectOpenHashMap<>(1024); // Paper
private static final Map<MaterialData, IBlockData> materialToData = new HashMap<>(4096);
private static final Map<IBlockData, MaterialData> dataToMaterial = new HashMap<>(4096);
private static final Map<MaterialData, Block> materialToBlock = new HashMap<>(4096);
- private static final Map<Block, MaterialData> blockToMaterial = new HashMap<>(1024);
+ private static final Int2ObjectOpenHashMap<MaterialData> blockToMaterial = new Int2ObjectOpenHashMap<>(1024); // Paper
public static Material toLegacy(Material material) {
if (material == null || material.isLegacy()) {
@@ -71,15 +74,15 @@ public class CraftLegacy {
mappedData = dataToMaterial.get(blockData);
// Fallback to any block
if (mappedData == null) {
- mappedData = blockToMaterial.get(block);
+ mappedData = blockToMaterial.get(block.internalId); // Paper
// Fallback to matching item
if (mappedData == null) {
- mappedData = itemToMaterial.get(block.getItem());
+ mappedData = itemToMaterial.get(block.getItem().internalId); // Paper
}
}
} else {
Item item = CraftMagicNumbers.getItem(material);
- mappedData = itemToMaterial.get(item);
+ mappedData = itemToMaterial.get(item.internalId); // Paper
}
return (mappedData == null) ? new MaterialData(Material.LEGACY_AIR) : mappedData;
@@ -147,14 +150,10 @@ public class CraftLegacy {
public static MaterialData toLegacy(IBlockData blockData) {
MaterialData mappedData;
- // Try exact match first
- mappedData = dataToMaterial.get(blockData);
- // Fallback to any block
- if (mappedData == null) {
- mappedData = blockToMaterial.get(blockData.getBlock());
- }
-
- return (mappedData == null) ? new MaterialData(Material.LEGACY_AIR) : mappedData;
+ return dataToMaterial.computeIfAbsent(blockData, k -> {
+ MaterialData materialData = blockToMaterial.get(blockData.getBlock().internalId);
+ return materialData != null ? materialData : new MaterialData(Material.LEGACY_AIR);
+ });
}
public static Material fromLegacy(Material material) {
@@ -366,14 +365,14 @@ public class CraftLegacy {
}
materialToData.put(matData, blockData);
- if (!dataToMaterial.containsKey(blockData)) {
- dataToMaterial.put(blockData, matData);
- }
+ //if (!dataToMaterial.containsKey(blockData)) {
+ dataToMaterial.putIfAbsent(blockData, matData);
+ //}
materialToBlock.put(matData, block);
- if (!blockToMaterial.containsKey(block)) {
- blockToMaterial.put(block, matData);
- }
+ //if (!blockToMaterial.containsKey(block.internalId)) { // Paper
+ blockToMaterial.putIfAbsent(block.internalId, matData); // Paper
+ //}
}
}
@@ -411,14 +410,14 @@ public class CraftLegacy {
// Preconditions.checkState(newId.contains("minecraft:"), "Unknown new material for " + matData);
Item newMaterial = IRegistry.ITEM.get(new MinecraftKey(newId));
- if (newMaterial == Items.AIR) {
+ if (newMaterial == Items.AIR || newMaterial == null) { // Paper
continue;
}
materialToItem.put(matData, newMaterial);
- if (!itemToMaterial.containsKey(newMaterial)) {
- itemToMaterial.put(newMaterial, matData);
- }
+ //if (!itemToMaterial.containsKey(newMaterial.internalId)) { // Paper
+ itemToMaterial.putIfAbsent(newMaterial.internalId, matData); // Paper
+ //} // Paper
}
for (Map.Entry<Byte, Material> entry : SPAWN_EGGS.entrySet()) {
@@ -426,7 +425,7 @@ public class CraftLegacy {
Item newMaterial = CraftMagicNumbers.getItem(entry.getValue());
materialToItem.put(matData, newMaterial);
- itemToMaterial.put(newMaterial, matData);
+ itemToMaterial.put(newMaterial.internalId, matData); // Paper
}
}
}
diff --git a/src/main/java/org/bukkit/craftbukkit/util/CraftMagicNumbers.java b/src/main/java/org/bukkit/craftbukkit/util/CraftMagicNumbers.java
index 72e83454f..058739f22 100644
--- a/src/main/java/org/bukkit/craftbukkit/util/CraftMagicNumbers.java
+++ b/src/main/java/org/bukkit/craftbukkit/util/CraftMagicNumbers.java
@@ -68,18 +68,27 @@ public final class CraftMagicNumbers implements UnsafeValues {
}
// ========================================================================
- private static final Map<Block, Material> BLOCK_MATERIAL = new HashMap<>();
- private static final Map<Item, Material> ITEM_MATERIAL = new HashMap<>();
- private static final Map<Material, Item> MATERIAL_ITEM = new HashMap<>();
- private static final Map<Material, Block> MATERIAL_BLOCK = new HashMap<>();
-
+ // Paper start - optimize Bukkit <-> NMS Mappings
+ private static final java.util.List<Material> BLOCK_MATERIAL = new java.util.ArrayList<>();
+ private static final java.util.List<Material> ITEM_MATERIAL = new java.util.ArrayList<>();
+ private static final Map<Material, Item> MATERIAL_ITEM = new java.util.EnumMap<>(Material.class);
+ private static final Map<Material, Block> MATERIAL_BLOCK = new java.util.EnumMap<>(Material.class);
+
+ static <T> void ensureListSize(java.util.List<T> list, int len) {
+ for (int i = list.size(); i <= len; i++) {
+ list.add(null);
+ }
+ }
+ // Paper end
static {
for (Block block : (Iterable<Block>) IRegistry.BLOCK) { // Eclipse fail
- BLOCK_MATERIAL.put(block, Material.getMaterial(IRegistry.BLOCK.getKey(block).getKey().toUpperCase(Locale.ROOT)));
+ ensureListSize(BLOCK_MATERIAL, block.internalId); // Paper
+ BLOCK_MATERIAL.set(block.internalId, Material.getMaterial(IRegistry.BLOCK.getKey(block).getKey().toUpperCase(Locale.ROOT))); // Paper
}
for (Item item : (Iterable<Item>) IRegistry.ITEM) { // Eclipse fail
- ITEM_MATERIAL.put(item, Material.getMaterial(IRegistry.ITEM.getKey(item).getKey().toUpperCase(Locale.ROOT)));
+ ensureListSize(ITEM_MATERIAL, item.internalId); // Paper
+ ITEM_MATERIAL.set(item.internalId, Material.getMaterial(IRegistry.ITEM.getKey(item).getKey().toUpperCase(Locale.ROOT))); // Paper
}
for (Material material : Material.values()) {
@@ -91,11 +100,12 @@ public final class CraftMagicNumbers implements UnsafeValues {
}
public static Material getMaterial(Block block) {
- return BLOCK_MATERIAL.get(block);
+ return BLOCK_MATERIAL.get(block.internalId); // Paper
}
public static Material getMaterial(Item item) {
- return ITEM_MATERIAL.getOrDefault(item, Material.AIR);
+ Material material = ITEM_MATERIAL.get(item.internalId);
+ return material != null ? material : Material.AIR; // Paper
}
public static Item getItem(Material material) {
--
2.21.0