papermc/CraftBukkit-Patches/0045-Entity-ticking-chunk-caching.patch

67 lines
3.3 KiB
Diff
Raw Normal View History

2014-03-09 22:14:45 +00:00
From 74ec77bc8eb2e4ed29c5fddf1038eb1815b4e657 Mon Sep 17 00:00:00 2001
2013-07-16 11:21:55 +00:00
From: Ammar Askar <ammar@ammaraskar.com>
Date: Tue, 16 Jul 2013 03:32:32 +0500
Subject: [PATCH] Entity ticking chunk caching
Cache known loaded chunks so we avoid making a potentially expensive contains call for every single entity in exchange for some simple arithmetic. Best case scenario, this cuts down contains call to once per chunk, worst case it adds on some simple arithmetic operations
diff --git a/src/main/java/net/minecraft/server/World.java b/src/main/java/net/minecraft/server/World.java
2014-02-12 13:48:26 +00:00
index 0eeed14..5fb3fbf 100644
2013-07-16 11:21:55 +00:00
--- a/src/main/java/net/minecraft/server/World.java
+++ b/src/main/java/net/minecraft/server/World.java
2014-02-12 13:48:26 +00:00
@@ -1188,6 +1188,7 @@ public abstract class World implements IBlockAccess {
2013-07-16 11:21:55 +00:00
CrashReport crashreport;
CrashReportSystemDetails crashreportsystemdetails;
+ long lastChunk = Long.MIN_VALUE; // Spigot - cache chunk x, z cords for unload queue
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
2014-02-12 13:48:26 +00:00
@@ -1196,10 +1197,15 @@ public abstract class World implements IBlockAccess {
2013-07-16 11:21:55 +00:00
}
ChunkProviderServer chunkProviderServer = ((WorldServer) this).chunkProviderServer;
- if (chunkProviderServer.unloadQueue.contains(MathHelper.floor(entity.locX) >> 4, MathHelper.floor(entity.locZ) >> 4)) {
- continue;
+ // Spigot start - check last chunk to see if this loaded (fast cache)
+ long chunk = org.bukkit.craftbukkit.util.LongHash.toLong(MathHelper.floor(entity.locX) >> 4, MathHelper.floor(entity.locZ) >> 4);
+ if (lastChunk != chunk) {
+ if (chunkProviderServer.unloadQueue.contains(chunk)) { // Spigot end
+ continue;
+ }
}
// CraftBukkit end
+ lastChunk = chunk; // Spigot
try {
++entity.ticksLived;
2014-02-12 13:48:26 +00:00
@@ -1220,6 +1226,7 @@ public abstract class World implements IBlockAccess {
2013-07-16 11:21:55 +00:00
this.i.remove(i--);
}
}
+ lastChunk = Long.MIN_VALUE; // Spigot
this.methodProfiler.c("remove");
this.entityList.removeAll(this.f);
2014-02-12 13:48:26 +00:00
@@ -1251,10 +1258,15 @@ public abstract class World implements IBlockAccess {
2013-07-16 11:21:55 +00:00
2014-02-12 13:48:26 +00:00
// Don't tick entities in chunks queued for unload
2013-07-16 11:21:55 +00:00
ChunkProviderServer chunkProviderServer = ((WorldServer) this).chunkProviderServer;
- if (chunkProviderServer.unloadQueue.contains(MathHelper.floor(entity.locX) >> 4, MathHelper.floor(entity.locZ) >> 4)) {
- continue;
+ // Spigot start - check last chunk to see if this loaded (fast cache)
+ long chunk = org.bukkit.craftbukkit.util.LongHash.toLong(MathHelper.floor(entity.locX) >> 4, MathHelper.floor(entity.locZ) >> 4);
+ if (lastChunk != chunk) {
+ if (chunkProviderServer.unloadQueue.contains(chunk)) { // Spigot end
+ continue;
+ }
}
// CraftBukkit end
+ lastChunk = Long.MIN_VALUE; // Spigot
2013-07-16 11:21:55 +00:00
if (entity.vehicle != null) {
if (!entity.vehicle.dead && entity.vehicle.passenger == entity) {
--
2014-03-09 22:14:45 +00:00
1.8.3.2
2013-08-03 22:51:09 +00:00