mirror of
https://github.com/PaperMC/Paper.git
synced 2024-12-21 07:09:21 +08:00
82 lines
4.4 KiB
Diff
82 lines
4.4 KiB
Diff
|
From b8345560939d63b8f8e221f468aaf9792c61152a Mon Sep 17 00:00:00 2001
|
||
|
From: Aikar <aikar@aikar.co>
|
||
|
Date: Wed, 29 Aug 2018 21:59:22 -0400
|
||
|
Subject: [PATCH] Optimize getChunkIfLoaded type calls
|
||
|
|
||
|
Uses optimized check to avoid major locks and large method.
|
||
|
|
||
|
Will improve inlining across many hot methods.
|
||
|
|
||
|
Improve getBrightness to not do double chunk map lookups.
|
||
|
|
||
|
diff --git a/src/main/java/net/minecraft/server/ChunkProviderServer.java b/src/main/java/net/minecraft/server/ChunkProviderServer.java
|
||
|
index 96d49b469a..c0ec896eea 100644
|
||
|
--- a/src/main/java/net/minecraft/server/ChunkProviderServer.java
|
||
|
+++ b/src/main/java/net/minecraft/server/ChunkProviderServer.java
|
||
|
@@ -381,7 +381,7 @@ public class ChunkProviderServer implements IChunkProvider {
|
||
|
continue;
|
||
|
}
|
||
|
|
||
|
- Chunk neighbor = this.getChunkAt(chunk.locX + x, chunk.locZ + z, false, false);
|
||
|
+ Chunk neighbor = this.chunks.get(chunk.chunkKey); // Paper
|
||
|
if (neighbor != null) {
|
||
|
neighbor.setNeighborUnloaded(-x, -z);
|
||
|
chunk.setNeighborUnloaded(x, z);
|
||
|
diff --git a/src/main/java/net/minecraft/server/World.java b/src/main/java/net/minecraft/server/World.java
|
||
|
index 49809372d8..0437cfdd55 100644
|
||
|
--- a/src/main/java/net/minecraft/server/World.java
|
||
|
+++ b/src/main/java/net/minecraft/server/World.java
|
||
|
@@ -165,7 +165,7 @@ public abstract class World implements IEntityAccess, GeneratorAccess, IIBlockAc
|
||
|
}
|
||
|
|
||
|
public Chunk getChunkIfLoaded(int x, int z) {
|
||
|
- return ((ChunkProviderServer) this.chunkProvider).getChunkAt(x, z, false, false);
|
||
|
+ return ((ChunkProviderServer) this.chunkProvider).chunks.get(ChunkCoordIntPair.a(x, z)); // Paper - optimize getChunkIfLoaded
|
||
|
}
|
||
|
|
||
|
protected World(IDataManager idatamanager, @Nullable PersistentCollection persistentcollection, WorldData worlddata, WorldProvider worldprovider, MethodProfiler methodprofiler, boolean flag, ChunkGenerator gen, org.bukkit.World.Environment env) {
|
||
|
@@ -715,7 +715,8 @@ public abstract class World implements IEntityAccess, GeneratorAccess, IIBlockAc
|
||
|
blockposition = new BlockPosition(blockposition.getX(), 0, blockposition.getZ());
|
||
|
}
|
||
|
|
||
|
- return !blockposition.isValidLocation() ? enumskyblock.c : (!this.isLoaded(blockposition) ? enumskyblock.c : this.getChunkAtWorldCoords(blockposition).getBrightness(enumskyblock, blockposition)); // Paper
|
||
|
+ Chunk chunk; // Paper
|
||
|
+ return !blockposition.isValidLocation() ? enumskyblock.c : ((chunk = this.getChunkIfLoaded(blockposition)) == null ? enumskyblock.c : chunk.getBrightness(enumskyblock, blockposition)); // Paper - optimize ifChunkLoaded
|
||
|
}
|
||
|
|
||
|
public void a(EnumSkyBlock enumskyblock, BlockPosition blockposition, int i) {
|
||
|
@@ -2017,7 +2018,7 @@ public abstract class World implements IEntityAccess, GeneratorAccess, IIBlockAc
|
||
|
if (blockposition.isInvalidYLocation()) { // Paper
|
||
|
return false;
|
||
|
} else {
|
||
|
- Chunk chunk = this.chunkProvider.getChunkAt(blockposition.getX() >> 4, blockposition.getZ() >> 4, false, false);
|
||
|
+ Chunk chunk = this.getChunkIfLoaded(blockposition.getX() >> 4, blockposition.getZ() >> 4); // Paper - optimize ifLoaded
|
||
|
|
||
|
return chunk != null && !chunk.isEmpty();
|
||
|
}
|
||
|
diff --git a/src/main/java/org/bukkit/craftbukkit/CraftWorld.java b/src/main/java/org/bukkit/craftbukkit/CraftWorld.java
|
||
|
index 1ccf2a7609..d9766447de 100644
|
||
|
--- a/src/main/java/org/bukkit/craftbukkit/CraftWorld.java
|
||
|
+++ b/src/main/java/org/bukkit/craftbukkit/CraftWorld.java
|
||
|
@@ -227,7 +227,7 @@ public class CraftWorld implements World {
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
- net.minecraft.server.Chunk chunk = world.getChunkProviderServer().getChunkAt(x, z, false, false);
|
||
|
+ net.minecraft.server.Chunk chunk = world.getChunkIfLoaded(x, z); // Paper - optimize ifLaoded
|
||
|
if (chunk != null) {
|
||
|
world.getChunkProviderServer().unload(chunk);
|
||
|
}
|
||
|
@@ -246,7 +246,7 @@ public class CraftWorld implements World {
|
||
|
|
||
|
private boolean unloadChunk0(int x, int z, boolean save) {
|
||
|
Boolean result = MCUtil.ensureMain("Unload Chunk", () -> { // Paper - Ensure never async
|
||
|
- net.minecraft.server.Chunk chunk = world.getChunkProviderServer().getChunkAt(x, z, false, false);
|
||
|
+ net.minecraft.server.Chunk chunk = world.getChunkIfLoaded(x, z); // Paper - optimize ifLoaded
|
||
|
if (chunk == null) {
|
||
|
return true;
|
||
|
}
|
||
|
--
|
||
|
2.18.0
|
||
|
|