From d52d8059d6a382725261365b534a91ff351b17c2 Mon Sep 17 00:00:00 2001 From: Martin Panzer Date: Mon, 23 May 2016 12:12:37 +0200 Subject: [PATCH] Faster redstone torch rapid clock removal Only resize the the redstone torch list once, since resizing arrays / lists is costly diff --git a/src/main/java/net/minecraft/server/BlockRedstoneTorch.java b/src/main/java/net/minecraft/server/BlockRedstoneTorch.java index a99f979ef..919ba8a14 100644 --- a/src/main/java/net/minecraft/server/BlockRedstoneTorch.java +++ b/src/main/java/net/minecraft/server/BlockRedstoneTorch.java @@ -11,7 +11,7 @@ import org.bukkit.event.block.BlockRedstoneEvent; // CraftBukkit public class BlockRedstoneTorch extends BlockTorch { public static final BlockStateBoolean LIT = BlockProperties.r; - private static final Map> b = new WeakHashMap(); + // Paper - Move the mapped list to World protected BlockRedstoneTorch(Block.Info block_info) { super(block_info); @@ -66,11 +66,16 @@ public class BlockRedstoneTorch extends BlockTorch { } public static void a(IBlockData iblockdata, World world, BlockPosition blockposition, Random random, boolean flag) { - List list = (List) BlockRedstoneTorch.b.get(world); + // Paper start + java.util.ArrayDeque redstoneUpdateInfos = world.redstoneUpdateInfos; - while (list != null && !list.isEmpty() && world.getTime() - ((BlockRedstoneTorch.RedstoneUpdateInfo) list.get(0)).b > 60L) { - list.remove(0); + if (redstoneUpdateInfos != null) { + BlockRedstoneTorch.RedstoneUpdateInfo curr; + while ((curr = redstoneUpdateInfos.peek()) != null && world.getTime() - curr.getTime() > 60L) { + redstoneUpdateInfos.poll(); + } } + // Paper end // CraftBukkit start org.bukkit.plugin.PluginManager manager = world.getServer().getPluginManager(); @@ -140,9 +145,12 @@ public class BlockRedstoneTorch extends BlockTorch { } private static boolean a(World world, BlockPosition blockposition, boolean flag) { - List list = (List) BlockRedstoneTorch.b.computeIfAbsent(world, (iblockaccess) -> { - return Lists.newArrayList(); - }); + // Paper start + java.util.ArrayDeque list = world.redstoneUpdateInfos; + if (list == null) { + list = world.redstoneUpdateInfos = new java.util.ArrayDeque<>(); + } + if (flag) { list.add(new BlockRedstoneTorch.RedstoneUpdateInfo(blockposition.immutableCopy(), world.getTime())); @@ -150,9 +158,9 @@ public class BlockRedstoneTorch extends BlockTorch { int i = 0; - for (int j = 0; j < list.size(); ++j) { - BlockRedstoneTorch.RedstoneUpdateInfo blockredstonetorch_redstoneupdateinfo = (BlockRedstoneTorch.RedstoneUpdateInfo) list.get(j); - + for (java.util.Iterator iterator = list.iterator(); iterator.hasNext();) { + BlockRedstoneTorch.RedstoneUpdateInfo blockredstonetorch_redstoneupdateinfo = iterator.next(); + // Paper end if (blockredstonetorch_redstoneupdateinfo.a.equals(blockposition)) { ++i; if (i >= 8) { @@ -167,7 +175,7 @@ public class BlockRedstoneTorch extends BlockTorch { public static class RedstoneUpdateInfo { private final BlockPosition a; - private final long b; + private final long b; final long getTime() { return this.b; } // Paper - OBFHELPER public RedstoneUpdateInfo(BlockPosition blockposition, long i) { this.a = blockposition; diff --git a/src/main/java/net/minecraft/server/World.java b/src/main/java/net/minecraft/server/World.java index de09ed97e..3305e110c 100644 --- a/src/main/java/net/minecraft/server/World.java +++ b/src/main/java/net/minecraft/server/World.java @@ -99,6 +99,7 @@ public abstract class World implements IIBlockAccess, GeneratorAccess, AutoClose private org.spigotmc.TickLimiter tileLimiter; private int tileTickPosition; public final Map explosionDensityCache = new HashMap<>(); // Paper - Optimize explosions + public java.util.ArrayDeque redstoneUpdateInfos; // Paper - Move from Map in BlockRedstoneTorch to here public CraftWorld getWorld() { return this.world; -- 2.21.0