3
0
Mirror von https://github.com/PaperMC/Paper.git synchronisiert 2024-12-19 04:50:06 +01:00

don't store weak references for EmptyChunks or cache CraftBlocks

Dieser Commit ist enthalten in:
Tahg 2011-10-05 11:31:23 -04:00
Ursprung 8ab90b344c
Commit 696349884b
2 geänderte Dateien mit 14 neuen und 21 gelöschten Zeilen

Datei anzeigen

@ -56,12 +56,14 @@ public class Chunk {
Arrays.fill(this.c, -999); Arrays.fill(this.c, -999);
// CraftBukkit start // CraftBukkit start
if (!(this instanceof EmptyChunk)) {
org.bukkit.craftbukkit.CraftWorld cworld = this.world.getWorld(); org.bukkit.craftbukkit.CraftWorld cworld = this.world.getWorld();
this.bukkitChunk = (cworld == null) ? null : cworld.popPreservedChunk(i, j); this.bukkitChunk = (cworld == null) ? null : cworld.popPreservedChunk(i, j);
if (this.bukkitChunk == null) { if (this.bukkitChunk == null) {
this.bukkitChunk = new org.bukkit.craftbukkit.CraftChunk(this); this.bukkitChunk = new org.bukkit.craftbukkit.CraftChunk(this);
} }
} }
}
public org.bukkit.Chunk bukkitChunk; public org.bukkit.Chunk bukkitChunk;
// CraftBukkit end // CraftBukkit end

Datei anzeigen

@ -1,10 +1,9 @@
package org.bukkit.craftbukkit; package org.bukkit.craftbukkit;
import com.google.common.collect.MapMaker;
import java.lang.ref.WeakReference; import java.lang.ref.WeakReference;
import java.util.concurrent.ConcurrentMap;
import net.minecraft.server.ChunkPosition; import net.minecraft.server.ChunkPosition;
import net.minecraft.server.EmptyChunk;
import net.minecraft.server.WorldServer; import net.minecraft.server.WorldServer;
import org.bukkit.Chunk; import org.bukkit.Chunk;
@ -19,13 +18,14 @@ import net.minecraft.server.WorldChunkManager;
public class CraftChunk implements Chunk { public class CraftChunk implements Chunk {
private WeakReference<net.minecraft.server.Chunk> weakChunk; private WeakReference<net.minecraft.server.Chunk> weakChunk;
private final ConcurrentMap<Integer, Block> cache = new MapMaker().softValues().makeMap();
private WorldServer worldServer; private WorldServer worldServer;
private int x; private int x;
private int z; private int z;
public CraftChunk(net.minecraft.server.Chunk chunk) { public CraftChunk(net.minecraft.server.Chunk chunk) {
if(!(chunk instanceof EmptyChunk)) {
this.weakChunk = new WeakReference<net.minecraft.server.Chunk>(chunk); this.weakChunk = new WeakReference<net.minecraft.server.Chunk>(chunk);
}
worldServer = (WorldServer) getHandle().world; worldServer = (WorldServer) getHandle().world;
x = getHandle().x; x = getHandle().x;
z = getHandle().z; z = getHandle().z;
@ -39,8 +39,10 @@ public class CraftChunk implements Chunk {
net.minecraft.server.Chunk c = weakChunk.get(); net.minecraft.server.Chunk c = weakChunk.get();
if (c == null) { if (c == null) {
c = worldServer.getChunkAt(x, z); c = worldServer.getChunkAt(x, z);
if(!(c instanceof EmptyChunk)) {
weakChunk = new WeakReference<net.minecraft.server.Chunk>(c); weakChunk = new WeakReference<net.minecraft.server.Chunk>(c);
} }
}
return c; return c;
} }
@ -62,18 +64,7 @@ public class CraftChunk implements Chunk {
} }
public Block getBlock(int x, int y, int z) { public Block getBlock(int x, int y, int z) {
int pos = (x & 0xF) << 11 | (z & 0xF) << 7 | (y & 0x7F); return new CraftBlock(this, (getX() << 4) | (x & 0xF), y & 0x7F, (getZ() << 4) | (z & 0xF));
Block block = this.cache.get(pos);
if (block == null) {
Block newBlock = new CraftBlock(this, (getX() << 4) | (x & 0xF), y & 0x7F, (getZ() << 4) | (z & 0xF));
Block oldBlock = this.cache.put(pos, newBlock);
if (oldBlock == null) {
block = newBlock;
} else {
block = oldBlock;
}
}
return block;
} }
public Entity[] getEntities() { public Entity[] getEntities() {