Improvements to ChunkMap caching
This commit is contained in:
@@ -13,39 +13,77 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
|
|||||||
// PaperSpigot end
|
// PaperSpigot end
|
||||||
|
|
||||||
+ // PaperSpigot start - ChunkMap caching
|
+ // PaperSpigot start - ChunkMap caching
|
||||||
+ private final Object chunkMapLock = new Object();
|
|
||||||
+ private PacketPlayOutMapChunk.ChunkMap chunkMap;
|
+ private PacketPlayOutMapChunk.ChunkMap chunkMap;
|
||||||
+ private boolean chunkMapDirty = true;
|
+ private int emptySectionBits;
|
||||||
+
|
|
||||||
+ public void setDirty() {
|
|
||||||
+ synchronized (chunkMapLock) {
|
|
||||||
+ chunkMapDirty = true;
|
|
||||||
+ }
|
|
||||||
+ }
|
|
||||||
+
|
+
|
||||||
+ public PacketPlayOutMapChunk.ChunkMap getChunkMap() {
|
+ public PacketPlayOutMapChunk.ChunkMap getChunkMap() {
|
||||||
+ synchronized (chunkMapLock) {
|
+ boolean isDirty = false;
|
||||||
+ if (chunkMapDirty || chunkMap == null) {
|
+ for (int i = 0; i < sections.length; ++i) {
|
||||||
+ chunkMapDirty = false;
|
+ ChunkSection section = sections[i];
|
||||||
+ chunkMap = PacketPlayOutMapChunk.a(this, true, !world.worldProvider.o(), '\uffff');
|
+ if (section == null) {
|
||||||
|
+ if ((emptySectionBits & (1 << i)) == 0) {
|
||||||
|
+ isDirty = true;
|
||||||
|
+ emptySectionBits |= (1 << i);
|
||||||
|
+ }
|
||||||
|
+ } else {
|
||||||
|
+ if ((emptySectionBits & (1 << i)) == 1) {
|
||||||
|
+ isDirty = true;
|
||||||
|
+ emptySectionBits &= ~(1 << i);
|
||||||
|
+ section.isDirty = false;
|
||||||
|
+ } else if (section.isDirty) {
|
||||||
|
+ isDirty = true;
|
||||||
|
+ section.isDirty = false;
|
||||||
|
+ }
|
||||||
+ }
|
+ }
|
||||||
+
|
|
||||||
+ return chunkMap;
|
|
||||||
+ }
|
+ }
|
||||||
|
+
|
||||||
|
+ if (isDirty || chunkMap == null) {
|
||||||
|
+ chunkMap = PacketPlayOutMapChunk.a(this, true, !world.worldProvider.o(), '\uffff');
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ return chunkMap;
|
||||||
+ }
|
+ }
|
||||||
+ // PaperSpigot end
|
+ // PaperSpigot end
|
||||||
+
|
+
|
||||||
// CraftBukkit start - Neighbor loaded cache for chunk lighting and entity ticking
|
// CraftBukkit start - Neighbor loaded cache for chunk lighting and entity ticking
|
||||||
private int neighbors = 0x1 << 12;
|
private int neighbors = 0x1 << 12;
|
||||||
|
|
||||||
@@ -0,0 +0,0 @@ public class Chunk {
|
diff --git a/src/main/java/net/minecraft/server/ChunkSection.java b/src/main/java/net/minecraft/server/ChunkSection.java
|
||||||
|
index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
|
||||||
|
--- a/src/main/java/net/minecraft/server/ChunkSection.java
|
||||||
|
+++ b/src/main/java/net/minecraft/server/ChunkSection.java
|
||||||
|
@@ -0,0 +0,0 @@ public class ChunkSection {
|
||||||
|
private char[] blockIds;
|
||||||
|
private NibbleArray emittedLight;
|
||||||
|
private NibbleArray skyLight;
|
||||||
|
+ boolean isDirty; // PaperSpigot
|
||||||
|
|
||||||
|
public ChunkSection(int i, boolean flag) {
|
||||||
|
this.yPos = i;
|
||||||
|
@@ -0,0 +0,0 @@ public class ChunkSection {
|
||||||
|
}
|
||||||
|
|
||||||
|
this.blockIds[j << 8 | k << 4 | i] = (char) Block.d.b(iblockdata);
|
||||||
|
+ isDirty = true; // PaperSpigot
|
||||||
}
|
}
|
||||||
|
|
||||||
public IBlockData a(BlockPosition blockposition, IBlockData iblockdata) {
|
public Block b(int i, int j, int k) {
|
||||||
+ setDirty(); // PaperSpigot
|
@@ -0,0 +0,0 @@ public class ChunkSection {
|
||||||
int i = blockposition.getX() & 15;
|
|
||||||
int j = blockposition.getY();
|
public void a(int i, int j, int k, int l) {
|
||||||
int k = blockposition.getZ() & 15;
|
this.skyLight.a(i, j, k, l);
|
||||||
|
+ isDirty = true; // PaperSpigot
|
||||||
|
}
|
||||||
|
|
||||||
|
public int d(int i, int j, int k) {
|
||||||
|
@@ -0,0 +0,0 @@ public class ChunkSection {
|
||||||
|
|
||||||
|
public void b(int i, int j, int k, int l) {
|
||||||
|
this.emittedLight.a(i, j, k, l);
|
||||||
|
+ isDirty = true; // PaperSpigot
|
||||||
|
}
|
||||||
|
|
||||||
|
public int e(int i, int j, int k) {
|
||||||
diff --git a/src/main/java/net/minecraft/server/PacketPlayOutMapChunk.java b/src/main/java/net/minecraft/server/PacketPlayOutMapChunk.java
|
diff --git a/src/main/java/net/minecraft/server/PacketPlayOutMapChunk.java b/src/main/java/net/minecraft/server/PacketPlayOutMapChunk.java
|
||||||
index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
|
index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
|
||||||
--- a/src/main/java/net/minecraft/server/PacketPlayOutMapChunk.java
|
--- a/src/main/java/net/minecraft/server/PacketPlayOutMapChunk.java
|
||||||
@@ -59,18 +97,19 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
|
|||||||
chunk.world.spigotConfig.antiXrayInstance.obfuscateSync(chunk.locX, chunk.locZ, c.b, c.a, chunk.world);
|
chunk.world.spigotConfig.antiXrayInstance.obfuscateSync(chunk.locX, chunk.locZ, c.b, c.a, chunk.world);
|
||||||
}
|
}
|
||||||
|
|
||||||
diff --git a/src/main/java/net/minecraft/server/World.java b/src/main/java/net/minecraft/server/World.java
|
diff --git a/src/main/java/net/minecraft/server/PacketPlayOutMapChunkBulk.java b/src/main/java/net/minecraft/server/PacketPlayOutMapChunkBulk.java
|
||||||
index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
|
index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
|
||||||
--- a/src/main/java/net/minecraft/server/World.java
|
--- a/src/main/java/net/minecraft/server/PacketPlayOutMapChunkBulk.java
|
||||||
+++ b/src/main/java/net/minecraft/server/World.java
|
+++ b/src/main/java/net/minecraft/server/PacketPlayOutMapChunkBulk.java
|
||||||
@@ -0,0 +0,0 @@ public abstract class World implements IBlockAccess {
|
@@ -0,0 +0,0 @@ public class PacketPlayOutMapChunkBulk implements Packet<PacketListenerPlayOut>
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
+ chunk.setDirty(); // PaperSpigot
|
for (int j = 0; j < i; ++j) {
|
||||||
// PaperSpigot start - Asynchronous light updates
|
Chunk chunk = (Chunk) list.get(j);
|
||||||
if (chunk.world.paperSpigotConfig.useAsyncLighting) {
|
- PacketPlayOutMapChunk.ChunkMap packetplayoutmapchunk_chunkmap = PacketPlayOutMapChunk.a(chunk, true, this.d, '\uffff');
|
||||||
chunk.pendingLightUpdates.decrementAndGet();
|
+ PacketPlayOutMapChunk.ChunkMap packetplayoutmapchunk_chunkmap = chunk.getChunkMap(); // PaperSpigot
|
||||||
|
|
||||||
|
this.a[j] = chunk.locX;
|
||||||
|
this.b[j] = chunk.locZ;
|
||||||
--
|
--
|
||||||
1.9.5.msysgit.1
|
1.9.5.msysgit.1
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user