From ea126f98adfb3a54c1b0defb262ff583127b52b3 Mon Sep 17 00:00:00 2001 From: Travis Watkins Date: Mon, 16 Jun 2014 18:52:30 -0500 Subject: Don't check unload queue before ticking things anymore. In commits 71a238ee and c8591397 we added checks while ticking to ensure we never ticked anything in a chunk meant to be unloaded. We did this to prevent these chunks being removed from the unload queue and leaked. However, this causes a ridiculously large number of lookups on the queue for a somewhat rare occurance. We also now have the chunk GC which will take care of these leaked chunks when they do happen. With this in mind we now remove these checks which removes almost all uses of the LongHashSet backing the unload queue. --- src/main/java/net/minecraft/server/World.java | 40 ++++++++------------------- 1 file changed, 11 insertions(+), 29 deletions(-) (limited to 'src') diff --git a/src/main/java/net/minecraft/server/World.java b/src/main/java/net/minecraft/server/World.java index bbf61a39..af7069cb 100644 --- a/src/main/java/net/minecraft/server/World.java +++ b/src/main/java/net/minecraft/server/World.java @@ -250,8 +250,7 @@ public abstract class World implements IBlockAccess { for (int k1 = i; k1 <= l; ++k1) { for (int l1 = k; l1 <= j1; ++l1) { - // CraftBukkit - check unload queue too so we don't leak a chunk - if (!this.isChunkLoaded(k1, l1) || ((WorldServer) this).chunkProviderServer.unloadQueue.contains(k1, l1)) { + if (!this.isChunkLoaded(k1, l1)) { return false; } } @@ -1211,15 +1210,10 @@ public abstract class World implements IBlockAccess { for (i = 0; i < this.i.size(); ++i) { entity = (Entity) this.i.get(i); - // CraftBukkit start - Fixed an NPE, don't process entities in chunks queued for unload + // CraftBukkit start - Fixed an NPE if (entity == null) { continue; } - - ChunkProviderServer chunkProviderServer = ((WorldServer) this).chunkProviderServer; - if (chunkProviderServer.unloadQueue.contains(MathHelper.floor(entity.locX) >> 4, MathHelper.floor(entity.locZ) >> 4)) { - continue; - } // CraftBukkit end try { @@ -1267,14 +1261,6 @@ public abstract class World implements IBlockAccess { // CraftBukkit start - Use field for loop variable for (this.tickPosition = 0; this.tickPosition < this.entityList.size(); ++this.tickPosition) { entity = (Entity) this.entityList.get(this.tickPosition); - - // Don't tick entities in chunks queued for unload - ChunkProviderServer chunkProviderServer = ((WorldServer) this).chunkProviderServer; - if (chunkProviderServer.unloadQueue.contains(MathHelper.floor(entity.locX) >> 4, MathHelper.floor(entity.locZ) >> 4)) { - continue; - } - // CraftBukkit end - if (entity.vehicle != null) { if (!entity.vehicle.dead && entity.vehicle.passenger == entity) { continue; @@ -1314,16 +1300,17 @@ public abstract class World implements IBlockAccess { this.methodProfiler.c("blockEntities"); this.M = true; + // CraftBukkit start - From below, clean up tile entities before ticking them + if (!this.b.isEmpty()) { + this.tileEntityList.removeAll(this.b); + this.b.clear(); + } + // CraftBukkit end + Iterator iterator = this.tileEntityList.iterator(); while (iterator.hasNext()) { TileEntity tileentity = (TileEntity) iterator.next(); - // CraftBukkit start - Don't tick entities in chunks queued for unload - ChunkProviderServer chunkProviderServer = ((WorldServer) this).chunkProviderServer; - if (chunkProviderServer.unloadQueue.contains(tileentity.x >> 4, tileentity.z >> 4)) { - continue; - } - // CraftBukkit end if (!tileentity.r() && tileentity.o() && this.isLoaded(tileentity.x, tileentity.y, tileentity.z)) { try { @@ -1349,10 +1336,12 @@ public abstract class World implements IBlockAccess { } this.M = false; + /* CraftBukkit start - Moved up if (!this.b.isEmpty()) { this.tileEntityList.removeAll(this.b); this.b.clear(); } + */ // CraftBukkit end this.methodProfiler.c("pendingBlockEntities"); if (!this.a.isEmpty()) { @@ -1996,13 +1985,6 @@ public abstract class World implements IBlockAccess { for (int i1 = -l; i1 <= l; ++i1) { for (int j1 = -l; j1 <= l; ++j1) { - // CraftBukkit start - Don't tick chunks queued for unload - ChunkProviderServer chunkProviderServer = ((WorldServer) entityhuman.world).chunkProviderServer; - if (chunkProviderServer.unloadQueue.contains(i1 + j, j1 + k)) { - continue; - } - // CraftBukkit end - this.chunkTickList.add(org.bukkit.craftbukkit.util.LongHash.toLong(i1 + j, j1 + k)); // CraftBukkit } } -- cgit v1.2.3