Paper/Spigot-Server-Patches/0295-Optimize-CraftBlockData-Creation.patch
2019-05-05 04:33:40 -07:00

95 lines
3.6 KiB
Diff

From 9c821668fb448e021731f6a8975fc7aa7ba0d6b3 Mon Sep 17 00:00:00 2001
From: miclebrick <miclebrick@outlook.com>
Date: Thu, 23 Aug 2018 11:45:32 -0400
Subject: [PATCH] Optimize CraftBlockData Creation
Avoids a hashmap lookup by cacheing a reference to the CraftBlockData
and cloning it when one is needed.
diff --git a/src/main/java/net/minecraft/server/BlockData.java b/src/main/java/net/minecraft/server/BlockData.java
new file mode 100644
index 000000000..1b226a77e
--- /dev/null
+++ b/src/main/java/net/minecraft/server/BlockData.java
@@ -0,0 +1,25 @@
+package net.minecraft.server;
+
+import com.google.common.collect.ImmutableMap;
+import org.bukkit.craftbukkit.block.data.CraftBlockData;
+
+public class BlockData extends BlockDataAbstract<Block, IBlockData> implements IBlockData {
+
+ public BlockData(Block block, ImmutableMap<IBlockState<?>, Comparable<?>> immutablemap) {
+ super(block, immutablemap);
+ }
+
+ public Block getBlock() {
+ return (Block) this.e_;
+ }
+
+ // Paper start - impl cached craft block data, lazy load to fix issue with loading at the wrong time
+ private CraftBlockData cachedCraftBlockData;
+
+ @Override
+ public CraftBlockData createCraftBlockData() {
+ if(cachedCraftBlockData == null) cachedCraftBlockData = CraftBlockData.createData(this);
+ return (CraftBlockData) cachedCraftBlockData.clone();
+ }
+ // Paper end
+}
diff --git a/src/main/java/net/minecraft/server/IBlockData.java b/src/main/java/net/minecraft/server/IBlockData.java
index e8ae4b5e4..5413fe5b1 100644
--- a/src/main/java/net/minecraft/server/IBlockData.java
+++ b/src/main/java/net/minecraft/server/IBlockData.java
@@ -4,6 +4,8 @@ import com.google.common.collect.ImmutableMap;
import com.mojang.datafixers.Dynamic;
import com.mojang.datafixers.types.DynamicOps;
import com.mojang.datafixers.util.Pair;
+import org.bukkit.craftbukkit.block.data.CraftBlockData;
+
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
@@ -38,6 +40,16 @@ public class IBlockData extends BlockDataAbstract<Block, IBlockData> implements
return (Block) this.a;
}
+ // Paper start - impl cached craft block data, lazy load to fix issue with loading at the wrong time
+ private CraftBlockData cachedCraftBlockData;
+
+ @Override
+ public CraftBlockData createCraftBlockData() {
+ if(cachedCraftBlockData == null) cachedCraftBlockData = CraftBlockData.createData(this);
+ return (CraftBlockData) cachedCraftBlockData.clone();
+ }
+ // Paper end
+
public Material getMaterial() {
return this.getBlock().l(this);
}
diff --git a/src/main/java/org/bukkit/craftbukkit/block/data/CraftBlockData.java b/src/main/java/org/bukkit/craftbukkit/block/data/CraftBlockData.java
index c1666a9ba..3c29abd52 100644
--- a/src/main/java/org/bukkit/craftbukkit/block/data/CraftBlockData.java
+++ b/src/main/java/org/bukkit/craftbukkit/block/data/CraftBlockData.java
@@ -539,7 +539,17 @@ public class CraftBlockData implements BlockData {
return craft;
}
+ // Paper start - optimize creating BlockData to not need a map lookup
+ static {
+ // Initialize cached data for all IBlockData instances after registration
+ Block.REGISTRY_ID.iterator().forEachRemaining(IBlockData::createCraftBlockData);
+ }
public static CraftBlockData fromData(IBlockData data) {
+ return data.createCraftBlockData();
+ }
+
+ public static CraftBlockData createData(IBlockData data) {
+ // Paper end
return MAP.getOrDefault(data.getBlock().getClass(), CraftBlockData::new).apply(data);
}
}
--
2.21.0