Fixes PaperMC/Paper#883 same issue as MinecraftForge/MinecraftForge#4386 A more detailed anaylsis of what is probably going on, courtesy of @bs2609 and the MCForge Issue Tracker is: When a chunk is unloaded, the entities and tile entities it contains are marked for removal. The actual removal (from the world) occurs later, when the world ticks its entities. Conversely, when a chunk is loaded, it generally adds its entities to the world promptly, without queuing. Here's the normal sequence of events: Chunk unloaded Old entities removed Chunk loaded New entities added However, what can happen: Chunk unloaded Chunk loaded New entities added Old entities removed This occurs when an unloaded chunk is reloaded before its corresponding entities have been removed.
39 lines
1.9 KiB
Diff
39 lines
1.9 KiB
Diff
From ed74bb4fedd0ddfc6385eb36ae705420be3b6c50 Mon Sep 17 00:00:00 2001
|
|
From: mezz <tehgeek@gmail.com>
|
|
Date: Wed, 9 Aug 2017 17:51:22 -0500
|
|
Subject: [PATCH] Fix MC-117075: TE Unload Lag Spike
|
|
|
|
|
|
diff --git a/src/main/java/net/minecraft/server/ChunkCoordIntPair.java b/src/main/java/net/minecraft/server/ChunkCoordIntPair.java
|
|
index 23944088..e8d1a1c6 100644
|
|
--- a/src/main/java/net/minecraft/server/ChunkCoordIntPair.java
|
|
+++ b/src/main/java/net/minecraft/server/ChunkCoordIntPair.java
|
|
@@ -15,6 +15,7 @@ public class ChunkCoordIntPair {
|
|
this.z = blockposition.getZ() >> 4;
|
|
}
|
|
|
|
+ public static long asLong(int x, int z) { return a(x, z); } // Paper - OBFHELPER
|
|
public static long a(int i, int j) {
|
|
return (long) i & 4294967295L | ((long) j & 4294967295L) << 32;
|
|
}
|
|
diff --git a/src/main/java/net/minecraft/server/World.java b/src/main/java/net/minecraft/server/World.java
|
|
index 12938b9f..4585f2ef 100644
|
|
--- a/src/main/java/net/minecraft/server/World.java
|
|
+++ b/src/main/java/net/minecraft/server/World.java
|
|
@@ -1576,7 +1576,11 @@ public abstract class World implements IBlockAccess {
|
|
timings.tileEntityTick.startTiming(); // Spigot
|
|
// CraftBukkit start - From below, clean up tile entities before ticking them
|
|
if (!this.tileEntityListUnload.isEmpty()) {
|
|
- this.tileEntityListTick.removeAll(this.tileEntityListUnload);
|
|
+ // Paper start - Use alternate implementation with faster contains
|
|
+ java.util.Set<TileEntity> toRemove = java.util.Collections.newSetFromMap(new java.util.IdentityHashMap<>());
|
|
+ toRemove.addAll(tileEntityListUnload);
|
|
+ this.tileEntityListTick.removeAll(toRemove);
|
|
+ // Paper end
|
|
//this.tileEntityList.removeAll(this.tileEntityListUnload); // Paper - remove unused list
|
|
this.tileEntityListUnload.clear();
|
|
}
|
|
--
|
|
2.14.1.windows.1
|
|
|