2019-04-22 23:36:14 +02:00
From 7f9d6eaeea4c3a7fd2d75d413016e01b7b2d30d8 Mon Sep 17 00:00:00 2001
2018-08-23 22:44:41 +02:00
From: miclebrick <miclebrick@outlook.com>
Date: Thu, 23 Aug 2018 11:45:32 -0400
2018-08-25 06:20:58 +02:00
Subject: [PATCH] Optimize CraftBlockData Creation
2018-08-23 22:44:41 +02:00
2018-08-25 06:20:58 +02:00
Avoids a hashmap lookup by cacheing a reference to the CraftBlockData
and cloning it when one is needed.
2018-08-23 22:44:41 +02:00
diff --git a/src/main/java/net/minecraft/server/BlockData.java b/src/main/java/net/minecraft/server/BlockData.java
2019-04-22 23:36:14 +02:00
index 4dd6c32761..1b226a77e0 100644
2018-08-23 22:44:41 +02:00
--- a/src/main/java/net/minecraft/server/BlockData.java
+++ b/src/main/java/net/minecraft/server/BlockData.java
@@ -1,6 +1,7 @@
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 {
2019-01-01 04:15:55 +01:00
@@ -11,4 +12,14 @@ public class BlockData extends BlockDataAbstract<Block, IBlockData> implements I
2018-08-23 22:44:41 +02:00
public Block getBlock() {
2019-01-01 04:15:55 +01:00
return (Block) this.e_;
2018-08-23 22:44:41 +02:00
}
+
+ // 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
2019-04-22 23:36:14 +02:00
index e4e4c55130..08a5acb0ac 100644
2018-08-23 22:44:41 +02:00
--- a/src/main/java/net/minecraft/server/IBlockData.java
+++ b/src/main/java/net/minecraft/server/IBlockData.java
2019-01-01 04:15:55 +01:00
@@ -27,6 +27,8 @@ public interface IBlockData extends IBlockDataHolder<IBlockData> {
2018-08-23 22:44:41 +02:00
Block getBlock();
+ org.bukkit.craftbukkit.block.data.CraftBlockData createCraftBlockData(); // Paper - property for converting IBlockData to CraftBlockData, should only be used by CraftBlockData#fromData and should return a clone
+
default Material getMaterial() {
return this.getBlock().n(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
2019-04-22 23:36:14 +02:00
index 7755e4f7a6..4bb43e360d 100644
2018-08-23 22:44:41 +02:00
--- a/src/main/java/org/bukkit/craftbukkit/block/data/CraftBlockData.java
+++ b/src/main/java/org/bukkit/craftbukkit/block/data/CraftBlockData.java
2019-01-01 04:15:55 +01:00
@@ -521,7 +521,17 @@ public class CraftBlockData implements BlockData {
2018-08-23 22:44:41 +02:00
return craft;
}
2018-08-25 06:20:58 +02:00
+ // 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);
+ }
2018-08-23 22:44:41 +02:00
public static CraftBlockData fromData(IBlockData data) {
+ return data.createCraftBlockData();
+ }
+
+ public static CraftBlockData createData(IBlockData data) {
+ // Paper end
2018-08-25 06:20:58 +02:00
return MAP.getOrDefault(data.getBlock().getClass(), CraftBlockData::new).apply(data);
}
}
2018-08-23 22:44:41 +02:00
--
2019-03-20 02:46:00 +01:00
2.21.0
2018-08-23 22:44:41 +02:00