From e9ded59f2d2f5dfeaa0c9997ba6478a3f7b1bc59 Mon Sep 17 00:00:00 2001 From: Aikar Date: Wed, 4 Jul 2018 03:39:51 -0400 Subject: [PATCH] Avoid Chunk Lookups for Entity/TileEntity Current Chunk SPECIAL 1.14.1 NOTE: This patch caused a memory leak since the tile entity's chunk was set to null before it was removed. Ensure this issue is resolved! In many places where we simply want the current chunk the entity is in, instead of doing a hashmap lookup for it, we now have access to the object directly on the Entity/TileEntity object we can directly grab. Use that local value instead to reduce lookups in many hot places. diff --git a/src/main/java/net/minecraft/server/World.java b/src/main/java/net/minecraft/server/World.java index 0baa884bbf..373ea71e64 100644 --- a/src/main/java/net/minecraft/server/World.java +++ b/src/main/java/net/minecraft/server/World.java @@ -784,7 +784,7 @@ public abstract class World implements GeneratorAccess, AutoCloseable { if (!tileentity.isRemoved() && tileentity.hasWorld()) { BlockPosition blockposition = tileentity.getPosition(); - if (this.chunkProvider.a(blockposition) && this.getWorldBorder().a(blockposition)) { + if (tileentity.getCurrentChunk() != null && this.getWorldBorder().a(blockposition)) { // Paper try { gameprofilerfiller.a(() -> { return String.valueOf(TileEntityTypes.a(tileentity.getTileType())); @@ -823,8 +823,11 @@ public abstract class World implements GeneratorAccess, AutoCloseable { this.tileEntityListTick.remove(tileTickPosition--); // Spigot end //this.tileEntityList.remove(tileentity); // Paper - remove unused list - if (this.isLoaded(tileentity.getPosition())) { - this.getChunkAtWorldCoords(tileentity.getPosition()).removeTileEntity(tileentity.getPosition()); + // Paper start - use local chunk reference + Chunk chunk = tileentity.getCurrentChunk(); + if (chunk != null) { + chunk.removeTileEntity(tileentity.getPosition()); + // Paper end } } } @@ -844,8 +847,8 @@ public abstract class World implements GeneratorAccess, AutoCloseable { } // CraftBukkit end */ - if (this.isLoaded(tileentity1.getPosition())) { - Chunk chunk = this.getChunkAtWorldCoords(tileentity1.getPosition()); + Chunk chunk = tileentity1.getCurrentChunk(); // Paper + if (chunk != null) { // Paper IBlockData iblockdata = chunk.getType(tileentity1.getPosition()); chunk.setTileEntity(tileentity1.getPosition(), tileentity1); diff --git a/src/main/java/net/minecraft/server/WorldServer.java b/src/main/java/net/minecraft/server/WorldServer.java index 3739a95c5a..1e00908671 100644 --- a/src/main/java/net/minecraft/server/WorldServer.java +++ b/src/main/java/net/minecraft/server/WorldServer.java @@ -1390,9 +1390,12 @@ public class WorldServer extends World { } private void removeEntityFromChunk(Entity entity) { - IChunkAccess ichunkaccess = this.getChunkAt(entity.chunkX, entity.chunkZ, ChunkStatus.FULL, false); + // Paper start + if (!entity.inChunk) return; + IChunkAccess ichunkaccess = this.getChunkIfLoaded(entity.chunkX, entity.chunkZ); + // Paper start - if (ichunkaccess instanceof Chunk) { + if (ichunkaccess != null) { // Paper ((Chunk) ichunkaccess).b(entity); } -- 2.24.1