Improve random ticking behaviour - Fixes #3181

This commit is contained in:
Spottedleaf 2020-04-19 06:07:57 -07:00 committed by Aikar
parent a6ac47e502
commit ab36835ca0
No known key found for this signature in database
GPG key ID: 401ADFC9891FAAFE
6 changed files with 91 additions and 139 deletions

View file

@ -1,4 +1,4 @@
From 9cd5be8ad18822109b1121921ab8ac3b08cb475d Mon Sep 17 00:00:00 2001 From 2356450c9a501c6a5e3957a2fe1e3c6284e74cd2 Mon Sep 17 00:00:00 2001
From: Spottedleaf <Spottedleaf@users.noreply.github.com> From: Spottedleaf <Spottedleaf@users.noreply.github.com>
Date: Mon, 27 Jan 2020 21:28:00 -0800 Date: Mon, 27 Jan 2020 21:28:00 -0800
Subject: [PATCH] Optimise random block ticking Subject: [PATCH] Optimise random block ticking
@ -20,7 +20,7 @@ remains the same.
diff --git a/src/main/java/com/destroystokyo/paper/util/math/ThreadUnsafeRandom.java b/src/main/java/com/destroystokyo/paper/util/math/ThreadUnsafeRandom.java diff --git a/src/main/java/com/destroystokyo/paper/util/math/ThreadUnsafeRandom.java b/src/main/java/com/destroystokyo/paper/util/math/ThreadUnsafeRandom.java
new file mode 100644 new file mode 100644
index 00000000..3edc8e52 index 0000000000..3edc8e52e0
--- /dev/null --- /dev/null
+++ b/src/main/java/com/destroystokyo/paper/util/math/ThreadUnsafeRandom.java +++ b/src/main/java/com/destroystokyo/paper/util/math/ThreadUnsafeRandom.java
@@ -0,0 +1,46 @@ @@ -0,0 +1,46 @@
@ -71,7 +71,7 @@ index 00000000..3edc8e52
+ } + }
+} +}
diff --git a/src/main/java/net/minecraft/server/Block.java b/src/main/java/net/minecraft/server/Block.java diff --git a/src/main/java/net/minecraft/server/Block.java b/src/main/java/net/minecraft/server/Block.java
index e29ec958..e40375b6 100644 index e29ec958b3..e40375b67a 100644
--- a/src/main/java/net/minecraft/server/Block.java --- a/src/main/java/net/minecraft/server/Block.java
+++ b/src/main/java/net/minecraft/server/Block.java +++ b/src/main/java/net/minecraft/server/Block.java
@@ -109,8 +109,8 @@ public class Block implements IMaterial { @@ -109,8 +109,8 @@ public class Block implements IMaterial {
@ -86,7 +86,7 @@ index e29ec958..e40375b6 100644
} }
diff --git a/src/main/java/net/minecraft/server/BlockFluids.java b/src/main/java/net/minecraft/server/BlockFluids.java diff --git a/src/main/java/net/minecraft/server/BlockFluids.java b/src/main/java/net/minecraft/server/BlockFluids.java
index 6d351f09..a44f65f4 100644 index 6d351f0979..a44f65f40d 100644
--- a/src/main/java/net/minecraft/server/BlockFluids.java --- a/src/main/java/net/minecraft/server/BlockFluids.java
+++ b/src/main/java/net/minecraft/server/BlockFluids.java +++ b/src/main/java/net/minecraft/server/BlockFluids.java
@@ -27,7 +27,7 @@ public class BlockFluids extends Block implements IFluidSource { @@ -27,7 +27,7 @@ public class BlockFluids extends Block implements IFluidSource {
@ -99,7 +99,7 @@ index 6d351f09..a44f65f4 100644
@Override @Override
diff --git a/src/main/java/net/minecraft/server/BlockPosition.java b/src/main/java/net/minecraft/server/BlockPosition.java diff --git a/src/main/java/net/minecraft/server/BlockPosition.java b/src/main/java/net/minecraft/server/BlockPosition.java
index e76528f1..e650a2e4 100644 index e76528f199..e650a2e48d 100644
--- a/src/main/java/net/minecraft/server/BlockPosition.java --- a/src/main/java/net/minecraft/server/BlockPosition.java
+++ b/src/main/java/net/minecraft/server/BlockPosition.java +++ b/src/main/java/net/minecraft/server/BlockPosition.java
@@ -450,6 +450,7 @@ public class BlockPosition extends BaseBlockPosition implements MinecraftSeriali @@ -450,6 +450,7 @@ public class BlockPosition extends BaseBlockPosition implements MinecraftSeriali
@ -111,38 +111,10 @@ index e76528f1..e650a2e4 100644
return this.d(baseblockposition.getX(), baseblockposition.getY(), baseblockposition.getZ()); return this.d(baseblockposition.getX(), baseblockposition.getY(), baseblockposition.getZ());
} }
diff --git a/src/main/java/net/minecraft/server/Chunk.java b/src/main/java/net/minecraft/server/Chunk.java diff --git a/src/main/java/net/minecraft/server/Chunk.java b/src/main/java/net/minecraft/server/Chunk.java
index 03c25eae..92bb009b 100644 index 29cfef1605..8fc26aa4b8 100644
--- a/src/main/java/net/minecraft/server/Chunk.java --- a/src/main/java/net/minecraft/server/Chunk.java
+++ b/src/main/java/net/minecraft/server/Chunk.java +++ b/src/main/java/net/minecraft/server/Chunk.java
@@ -52,6 +52,8 @@ public class Chunk implements IChunkAccess { @@ -572,8 +572,8 @@ public class Chunk implements IChunkAccess {
private final ChunkCoordIntPair loc; public final long coordinateKey; // Paper - cache coordinate key
private volatile boolean x;
+ final com.destroystokyo.paper.util.maplist.IBlockDataList tickingList = new com.destroystokyo.paper.util.maplist.IBlockDataList(); // Paper
+
public Chunk(World world, ChunkCoordIntPair chunkcoordintpair, BiomeStorage biomestorage) {
this(world, chunkcoordintpair, biomestorage, ChunkConverter.a, TickListEmpty.b(), TickListEmpty.b(), 0L, (ChunkSection[]) null, (Consumer) null);
}
@@ -124,6 +126,18 @@ public class Chunk implements IChunkAccess {
this.v = consumer;
if (achunksection != null) {
if (this.sections.length == achunksection.length) {
+ // Paper start - maintain a list of ticking blocks in a chunk
+ for (ChunkSection section : achunksection) {
+ if (section != null) {
+ section.chunk = this;
+ int offset = com.destroystokyo.paper.util.maplist.IBlockDataList.getLocationKey(0, section.yPos, 0);
+ for (it.unimi.dsi.fastutil.longs.LongIterator iterator = section.tickingList.getRawIterator(); iterator.hasNext();) {
+ long raw = iterator.nextLong();
+ this.tickingList.add(com.destroystokyo.paper.util.maplist.IBlockDataList.getLocationFromRaw(raw) + offset, com.destroystokyo.paper.util.maplist.IBlockDataList.getBlockDataFromRaw(raw));
+ }
+ }
+ }
+ // Paper end
System.arraycopy(achunksection, 0, this.sections, 0, this.sections.length);
} else {
Chunk.LOGGER.warn("Could not set level chunk sections, array length is {} instead of {}", achunksection.length, this.sections.length);
@@ -572,8 +586,8 @@ public class Chunk implements IChunkAccess {
this.entities.remove(entity); // Paper this.entities.remove(entity); // Paper
} }
@ -154,7 +126,7 @@ index 03c25eae..92bb009b 100644
} }
diff --git a/src/main/java/net/minecraft/server/ChunkSection.java b/src/main/java/net/minecraft/server/ChunkSection.java diff --git a/src/main/java/net/minecraft/server/ChunkSection.java b/src/main/java/net/minecraft/server/ChunkSection.java
index 4526527a..8b28fb5e 100644 index 4526527aca..3eaf893cdf 100644
--- a/src/main/java/net/minecraft/server/ChunkSection.java --- a/src/main/java/net/minecraft/server/ChunkSection.java
+++ b/src/main/java/net/minecraft/server/ChunkSection.java +++ b/src/main/java/net/minecraft/server/ChunkSection.java
@@ -5,12 +5,15 @@ import javax.annotation.Nullable; @@ -5,12 +5,15 @@ import javax.annotation.Nullable;
@ -187,44 +159,31 @@ index 4526527a..8b28fb5e 100644
} }
public IBlockData getType(int i, int j, int k) { public IBlockData getType(int i, int j, int k) {
@@ -69,6 +77,12 @@ public class ChunkSection { @@ -69,6 +77,9 @@ public class ChunkSection {
--this.nonEmptyBlockCount; --this.nonEmptyBlockCount;
if (iblockdata1.q()) { if (iblockdata1.q()) {
--this.tickingBlockCount; --this.tickingBlockCount;
+ // Paper start + // Paper start
+ this.tickingList.remove(i, j, k); + this.tickingList.remove(i, j, k);
+ if (this.chunk != null) {
+ this.chunk.tickingList.remove(i, j + this.yPos, k);
+ }
+ // Paper end + // Paper end
} }
} }
@@ -80,6 +94,12 @@ public class ChunkSection { @@ -80,6 +91,9 @@ public class ChunkSection {
++this.nonEmptyBlockCount; ++this.nonEmptyBlockCount;
if (iblockdata.q()) { if (iblockdata.q()) {
++this.tickingBlockCount; ++this.tickingBlockCount;
+ // Paper start + // Paper start
+ this.tickingList.add(i, j, k, iblockdata); + this.tickingList.add(i, j, k, iblockdata);
+ if (this.chunk != null) {
+ this.chunk.tickingList.add(i, j + this.yPos, k, iblockdata);
+ }
+ // Paper end + // Paper end
} }
} }
@@ -115,23 +135,39 @@ public class ChunkSection { @@ -115,23 +129,29 @@ public class ChunkSection {
} }
public void recalcBlockCounts() { public void recalcBlockCounts() {
+ // Paper start + // Paper start
+ int offset = com.destroystokyo.paper.util.maplist.IBlockDataList.getLocationKey(0, this.yPos, 0);
+ if (this.chunk != null) {
+ for (it.unimi.dsi.fastutil.longs.LongIterator iterator = this.tickingList.getRawIterator(); iterator.hasNext();) {
+ long raw = iterator.nextLong();
+ this.chunk.tickingList.remove(com.destroystokyo.paper.util.maplist.IBlockDataList.getLocationFromRaw(raw) + offset);
+ }
+ }
+ this.tickingList.clear(); + this.tickingList.clear();
+ // Paper end + // Paper end
this.nonEmptyBlockCount = 0; this.nonEmptyBlockCount = 0;
@ -242,9 +201,6 @@ index 4526527a..8b28fb5e 100644
+ this.tickingBlockCount = (short) (this.tickingBlockCount + 1); // Paper + this.tickingBlockCount = (short) (this.tickingBlockCount + 1); // Paper
+ // Paper start + // Paper start
+ this.tickingList.add(location, iblockdata); + this.tickingList.add(location, iblockdata);
+ if (this.chunk != null) {
+ this.chunk.tickingList.add(location + offset, iblockdata);
+ }
+ // Paper end + // Paper end
} }
} }
@ -259,7 +215,7 @@ index 4526527a..8b28fb5e 100644
} }
diff --git a/src/main/java/net/minecraft/server/DataBits.java b/src/main/java/net/minecraft/server/DataBits.java diff --git a/src/main/java/net/minecraft/server/DataBits.java b/src/main/java/net/minecraft/server/DataBits.java
index f9680b68..a61cffa3 100644 index f9680b6830..a61cffa3f4 100644
--- a/src/main/java/net/minecraft/server/DataBits.java --- a/src/main/java/net/minecraft/server/DataBits.java
+++ b/src/main/java/net/minecraft/server/DataBits.java +++ b/src/main/java/net/minecraft/server/DataBits.java
@@ -127,4 +127,46 @@ public class DataBits { @@ -127,4 +127,46 @@ public class DataBits {
@ -310,7 +266,7 @@ index f9680b68..a61cffa3 100644
+ // Paper end + // Paper end
} }
diff --git a/src/main/java/net/minecraft/server/DataPaletteBlock.java b/src/main/java/net/minecraft/server/DataPaletteBlock.java diff --git a/src/main/java/net/minecraft/server/DataPaletteBlock.java b/src/main/java/net/minecraft/server/DataPaletteBlock.java
index 44aed672..fa664897 100644 index 44aed67274..fa664897fb 100644
--- a/src/main/java/net/minecraft/server/DataPaletteBlock.java --- a/src/main/java/net/minecraft/server/DataPaletteBlock.java
+++ b/src/main/java/net/minecraft/server/DataPaletteBlock.java +++ b/src/main/java/net/minecraft/server/DataPaletteBlock.java
@@ -287,6 +287,14 @@ public class DataPaletteBlock<T> implements DataPaletteExpandable<T> { @@ -287,6 +287,14 @@ public class DataPaletteBlock<T> implements DataPaletteExpandable<T> {
@ -329,7 +285,7 @@ index 44aed672..fa664897 100644
public interface a<T> { public interface a<T> {
diff --git a/src/main/java/net/minecraft/server/EntityTurtle.java b/src/main/java/net/minecraft/server/EntityTurtle.java diff --git a/src/main/java/net/minecraft/server/EntityTurtle.java b/src/main/java/net/minecraft/server/EntityTurtle.java
index dd02cb34..b24a5100 100644 index dd02cb3485..b24a5100b4 100644
--- a/src/main/java/net/minecraft/server/EntityTurtle.java --- a/src/main/java/net/minecraft/server/EntityTurtle.java
+++ b/src/main/java/net/minecraft/server/EntityTurtle.java +++ b/src/main/java/net/minecraft/server/EntityTurtle.java
@@ -29,7 +29,7 @@ public class EntityTurtle extends EntityAnimal { @@ -29,7 +29,7 @@ public class EntityTurtle extends EntityAnimal {
@ -342,7 +298,7 @@ index dd02cb34..b24a5100 100644
public final BlockPosition getHome() { return this.es(); } // Paper - OBFHELPER public final BlockPosition getHome() { return this.es(); } // Paper - OBFHELPER
diff --git a/src/main/java/net/minecraft/server/IBlockData.java b/src/main/java/net/minecraft/server/IBlockData.java diff --git a/src/main/java/net/minecraft/server/IBlockData.java b/src/main/java/net/minecraft/server/IBlockData.java
index de438816..e821c236 100644 index de43881653..e821c236b4 100644
--- a/src/main/java/net/minecraft/server/IBlockData.java --- a/src/main/java/net/minecraft/server/IBlockData.java
+++ b/src/main/java/net/minecraft/server/IBlockData.java +++ b/src/main/java/net/minecraft/server/IBlockData.java
@@ -22,11 +22,15 @@ public class IBlockData extends BlockDataAbstract<Block, IBlockData> implements @@ -22,11 +22,15 @@ public class IBlockData extends BlockDataAbstract<Block, IBlockData> implements
@ -395,7 +351,7 @@ index de438816..e821c236 100644
public final SoundEffectType getStepSound() { return this.r(); } // Paper - OBFHELPER public final SoundEffectType getStepSound() { return this.r(); } // Paper - OBFHELPER
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/World.java b/src/main/java/net/minecraft/server/World.java
index 28b6c9a0..d554d4cf 100644 index 5036348abf..5e6481f115 100644
--- a/src/main/java/net/minecraft/server/World.java --- a/src/main/java/net/minecraft/server/World.java
+++ b/src/main/java/net/minecraft/server/World.java +++ b/src/main/java/net/minecraft/server/World.java
@@ -1557,10 +1557,19 @@ public abstract class World implements GeneratorAccess, AutoCloseable { @@ -1557,10 +1557,19 @@ public abstract class World implements GeneratorAccess, AutoCloseable {
@ -420,21 +376,23 @@ index 28b6c9a0..d554d4cf 100644
public boolean isSavingDisabled() { public boolean isSavingDisabled() {
diff --git a/src/main/java/net/minecraft/server/WorldServer.java b/src/main/java/net/minecraft/server/WorldServer.java diff --git a/src/main/java/net/minecraft/server/WorldServer.java b/src/main/java/net/minecraft/server/WorldServer.java
index 71f5e3ce..ed41c814 100644 index 62fabb7ad5..9a2b4fa7a2 100644
--- a/src/main/java/net/minecraft/server/WorldServer.java --- a/src/main/java/net/minecraft/server/WorldServer.java
+++ b/src/main/java/net/minecraft/server/WorldServer.java +++ b/src/main/java/net/minecraft/server/WorldServer.java
@@ -531,6 +531,11 @@ public class WorldServer extends World { @@ -531,7 +531,12 @@ public class WorldServer extends World {
}); });
} }
- public void a(Chunk chunk, int i) {
+ // Paper start - optimise random block ticking + // Paper start - optimise random block ticking
+ private final BlockPosition.MutableBlockPosition chunkTickMutablePosition = new BlockPosition.MutableBlockPosition(); + private final BlockPosition.MutableBlockPosition chunkTickMutablePosition = new BlockPosition.MutableBlockPosition();
+ private final com.destroystokyo.paper.util.math.ThreadUnsafeRandom randomTickRandom = new com.destroystokyo.paper.util.math.ThreadUnsafeRandom(); + private final com.destroystokyo.paper.util.math.ThreadUnsafeRandom randomTickRandom = new com.destroystokyo.paper.util.math.ThreadUnsafeRandom();
+ // Paper end + // Paper end
+ +
public void a(Chunk chunk, int i) { + public void a(Chunk chunk, int i) { final int randomTickSpeed = i; // Paper
ChunkCoordIntPair chunkcoordintpair = chunk.getPos(); ChunkCoordIntPair chunkcoordintpair = chunk.getPos();
boolean flag = this.isRaining(); boolean flag = this.isRaining();
int j = chunkcoordintpair.d();
@@ -539,10 +544,10 @@ public class WorldServer extends World { @@ -539,10 +544,10 @@ public class WorldServer extends World {
GameProfilerFiller gameprofilerfiller = this.getMethodProfiler(); GameProfilerFiller gameprofilerfiller = this.getMethodProfiler();
@ -449,7 +407,7 @@ index 71f5e3ce..ed41c814 100644
if (this.isRainingAt(blockposition)) { if (this.isRainingAt(blockposition)) {
DifficultyDamageScaler difficultydamagescaler = this.getDamageScaler(blockposition); DifficultyDamageScaler difficultydamagescaler = this.getDamageScaler(blockposition);
boolean flag1 = this.getGameRules().getBoolean(GameRules.DO_MOB_SPAWNING) && this.random.nextDouble() < (double) difficultydamagescaler.b() * paperConfig.skeleHorseSpawnChance; // Paper boolean flag1 = this.getGameRules().getBoolean(GameRules.DO_MOB_SPAWNING) && this.random.nextDouble() < (double) difficultydamagescaler.b() * paperConfig.skeleHorseSpawnChance; // Paper
@@ -561,61 +566,81 @@ public class WorldServer extends World { @@ -561,61 +566,79 @@ public class WorldServer extends World {
} }
gameprofilerfiller.exitEnter("iceandsnow"); gameprofilerfiller.exitEnter("iceandsnow");
@ -491,40 +449,37 @@ index 71f5e3ce..ed41c814 100644
- gameprofilerfiller.exitEnter("tickBlocks"); - gameprofilerfiller.exitEnter("tickBlocks");
- timings.chunkTicksBlocks.startTiming(); // Paper - timings.chunkTicksBlocks.startTiming(); // Paper
- if (i > 0) {
- ChunkSection[] achunksection = chunk.getSections();
- int l = achunksection.length;
-
- for (int i1 = 0; i1 < l; ++i1) {
- ChunkSection chunksection = achunksection[i1];
-
- if (chunksection != Chunk.a && chunksection.d()) {
- int j1 = chunksection.getYPosition();
+ // Paper start - optimise random block ticking + // Paper start - optimise random block ticking
+ gameprofilerfiller.exit(); + gameprofilerfiller.exit();
+ int blocks = chunk.tickingList.size(); if (i > 0) {
+ if (i > 0 && blocks > 0) { - ChunkSection[] achunksection = chunk.getSections();
+ if ((this.randomTickRandom.nextInt() & (16 * 16 * 256 - 1)) > blocks) { - int l = achunksection.length;
+ // we optimise random block ticking by realising that most of the blocks we will try to tick + gameprofilerfiller.enter("randomTick");
+ // are not tickable. Instead we only tick tickable blocks, but only if the above
+ // statement is true
+ // Note: The number of blocks that get ticked per tick still REMAIN the same.
+ return;
+ }
+ gameprofilerfiller.enter("tickBlocks");
+ timings.chunkTicksBlocks.startTiming(); // Paper + timings.chunkTicksBlocks.startTiming(); // Paper
- for (int i1 = 0; i1 < l; ++i1) {
- ChunkSection chunksection = achunksection[i1];
+ ChunkSection[] sections = chunk.getSections();
- if (chunksection != Chunk.a && chunksection.d()) {
- int j1 = chunksection.getYPosition();
+ for (int sectionIndex = 0; sectionIndex < 16; ++sectionIndex) {
+ ChunkSection section = sections[sectionIndex];
+ if (section == null || section.tickingList.size() == 0) {
+ continue;
+ }
- for (int k1 = 0; k1 < i; ++k1) { - for (int k1 = 0; k1 < i; ++k1) {
- BlockPosition blockposition2 = this.a(j, j1, k, 15); - BlockPosition blockposition2 = this.a(j, j1, k, 15);
+ int toTick = i << 4; // i * 16 + int yPos = sectionIndex << 4;
- gameprofilerfiller.enter("randomTick"); - gameprofilerfiller.enter("randomTick");
- IBlockData iblockdata = chunksection.getType(blockposition2.getX() - j, blockposition2.getY() - j1, blockposition2.getZ() - k); - IBlockData iblockdata = chunksection.getType(blockposition2.getX() - j, blockposition2.getY() - j1, blockposition2.getZ() - k);
+ gameprofilerfiller.enter("randomTick"); + for (int a = 0; a < randomTickSpeed; ++a) {
+ for (int tick = 0; tick < toTick; ++tick) { + int tickingBlocks = section.tickingList.size();
+ int tickingSize = chunk.tickingList.size(); + int index = this.randomTickRandom.nextInt(16 * 16 * 16);
+ if (tickingSize == 0) { + if (index >= tickingBlocks) {
+ break; + continue;
+ } + }
- if (iblockdata.q()) { - if (iblockdata.q()) {
@ -532,11 +487,10 @@ index 71f5e3ce..ed41c814 100644
- iblockdata.b(this, blockposition2, this.random); - iblockdata.b(this, blockposition2, this.random);
- iblockdata.getBlock().randomTick = false; // Paper - fix MC-113809 - iblockdata.getBlock().randomTick = false; // Paper - fix MC-113809
- } - }
+ int index = this.randomTickRandom.nextInt(tickingSize); + long raw = section.tickingList.getRaw(index);
+ long raw = chunk.tickingList.getRaw(index);
+ int location = com.destroystokyo.paper.util.maplist.IBlockDataList.getLocationFromRaw(raw); + int location = com.destroystokyo.paper.util.maplist.IBlockDataList.getLocationFromRaw(raw);
+ int randomX = location & 15; + int randomX = location & 15;
+ int randomY = (location >>> (4 + 4)) & 255; + int randomY = ((location >>> (4 + 4)) & 255) | yPos;
+ int randomZ = (location >>> 4) & 15; + int randomZ = (location >>> 4) & 15;
- Fluid fluid = iblockdata.getFluid(); - Fluid fluid = iblockdata.getFluid();
@ -552,14 +506,12 @@ index 71f5e3ce..ed41c814 100644
- gameprofilerfiller.exit(); - gameprofilerfiller.exit();
- } - }
- }
+ // We drop the fluid tick since LAVA is ALREADY TICKED by the above method. + // We drop the fluid tick since LAVA is ALREADY TICKED by the above method.
+ // TODO CHECK ON UPDATE + // TODO CHECK ON UPDATE
} }
+ }
+ gameprofilerfiller.exit(); + gameprofilerfiller.exit();
+ timings.chunkTicksBlocks.stopTiming(); // Paper + timings.chunkTicksBlocks.stopTiming(); // Paper
+ gameprofilerfiller.exit();
+ // Paper end + // Paper end
} }
- timings.chunkTicksBlocks.stopTiming(); // Paper - timings.chunkTicksBlocks.stopTiming(); // Paper
@ -568,5 +520,5 @@ index 71f5e3ce..ed41c814 100644
protected BlockPosition a(BlockPosition blockposition) { protected BlockPosition a(BlockPosition blockposition) {
-- --
2.25.1.windows.1 2.25.1

View file

@ -1,4 +1,4 @@
From 5fd4592210f6d4fc991f1f24f09450472eff01fe Mon Sep 17 00:00:00 2001 From 0db5cf9de4d36d8d583b66f58a63c952e2c3df43 Mon Sep 17 00:00:00 2001
From: Spottedleaf <Spottedleaf@users.noreply.github.com> From: Spottedleaf <Spottedleaf@users.noreply.github.com>
Date: Tue, 14 Jan 2020 14:59:08 -0800 Date: Tue, 14 Jan 2020 14:59:08 -0800
Subject: [PATCH] Optimise Chunk#getFluid Subject: [PATCH] Optimise Chunk#getFluid
@ -8,10 +8,10 @@ faster on its own, however removing the try catch makes it
easier to inline due to code size easier to inline due to code size
diff --git a/src/main/java/net/minecraft/server/Chunk.java b/src/main/java/net/minecraft/server/Chunk.java diff --git a/src/main/java/net/minecraft/server/Chunk.java b/src/main/java/net/minecraft/server/Chunk.java
index 92bb009b..719c6f3e 100644 index 8fc26aa4b8..8695845445 100644
--- a/src/main/java/net/minecraft/server/Chunk.java --- a/src/main/java/net/minecraft/server/Chunk.java
+++ b/src/main/java/net/minecraft/server/Chunk.java +++ b/src/main/java/net/minecraft/server/Chunk.java
@@ -379,17 +379,20 @@ public class Chunk implements IChunkAccess { @@ -365,17 +365,20 @@ public class Chunk implements IChunkAccess {
} }
public Fluid a(int i, int j, int k) { public Fluid a(int i, int j, int k) {
@ -39,7 +39,7 @@ index 92bb009b..719c6f3e 100644
CrashReport crashreport = CrashReport.a(throwable, "Getting fluid state"); CrashReport crashreport = CrashReport.a(throwable, "Getting fluid state");
CrashReportSystemDetails crashreportsystemdetails = crashreport.a("Block being got"); CrashReportSystemDetails crashreportsystemdetails = crashreport.a("Block being got");
@@ -398,6 +401,7 @@ public class Chunk implements IChunkAccess { @@ -384,6 +387,7 @@ public class Chunk implements IChunkAccess {
}); });
throw new ReportedException(crashreport); throw new ReportedException(crashreport);
} }
@ -48,7 +48,7 @@ index 92bb009b..719c6f3e 100644
// CraftBukkit start // CraftBukkit start
diff --git a/src/main/java/net/minecraft/server/ChunkSection.java b/src/main/java/net/minecraft/server/ChunkSection.java diff --git a/src/main/java/net/minecraft/server/ChunkSection.java b/src/main/java/net/minecraft/server/ChunkSection.java
index 8b28fb5e..426221f7 100644 index 3eaf893cdf..cda718bba0 100644
--- a/src/main/java/net/minecraft/server/ChunkSection.java --- a/src/main/java/net/minecraft/server/ChunkSection.java
+++ b/src/main/java/net/minecraft/server/ChunkSection.java +++ b/src/main/java/net/minecraft/server/ChunkSection.java
@@ -46,7 +46,7 @@ public class ChunkSection { @@ -46,7 +46,7 @@ public class ChunkSection {
@ -61,5 +61,5 @@ index 8b28fb5e..426221f7 100644
public void a() { public void a() {
-- --
2.25.1.windows.1 2.25.1

View file

@ -1,4 +1,4 @@
From 3d8c3f58220937447eb6d9710b628c636c98d17a Mon Sep 17 00:00:00 2001 From 45ecc86e6bc96656bd8fc6509032739dac6978f6 Mon Sep 17 00:00:00 2001
From: Aikar <aikar@aikar.co> From: Aikar <aikar@aikar.co>
Date: Sun, 29 Mar 2020 18:26:14 -0400 Date: Sun, 29 Mar 2020 18:26:14 -0400
Subject: [PATCH] Ensure Entity is never double registered Subject: [PATCH] Ensure Entity is never double registered
@ -11,7 +11,7 @@ Vs behavior of non ticking of just overwriting state.
We will now simply log a warning when this happens instead of crashing the server. We will now simply log a warning when this happens instead of crashing the server.
diff --git a/src/main/java/net/minecraft/server/Entity.java b/src/main/java/net/minecraft/server/Entity.java diff --git a/src/main/java/net/minecraft/server/Entity.java b/src/main/java/net/minecraft/server/Entity.java
index 16f2e32d..9cb4e5a1 100644 index 16f2e32d23..9cb4e5a1e6 100644
--- a/src/main/java/net/minecraft/server/Entity.java --- a/src/main/java/net/minecraft/server/Entity.java
+++ b/src/main/java/net/minecraft/server/Entity.java +++ b/src/main/java/net/minecraft/server/Entity.java
@@ -59,6 +59,7 @@ public abstract class Entity implements INamableTileEntity, ICommandListener, Ke @@ -59,6 +59,7 @@ public abstract class Entity implements INamableTileEntity, ICommandListener, Ke
@ -23,7 +23,7 @@ index 16f2e32d..9cb4e5a1 100644
private boolean locked = false; private boolean locked = false;
@Override @Override
diff --git a/src/main/java/net/minecraft/server/WorldServer.java b/src/main/java/net/minecraft/server/WorldServer.java diff --git a/src/main/java/net/minecraft/server/WorldServer.java b/src/main/java/net/minecraft/server/WorldServer.java
index 9d35d650..d239afea 100644 index de24b487d2..e198b8c565 100644
--- a/src/main/java/net/minecraft/server/WorldServer.java --- a/src/main/java/net/minecraft/server/WorldServer.java
+++ b/src/main/java/net/minecraft/server/WorldServer.java +++ b/src/main/java/net/minecraft/server/WorldServer.java
@@ -520,6 +520,7 @@ public class WorldServer extends World { @@ -520,6 +520,7 @@ public class WorldServer extends World {
@ -34,7 +34,7 @@ index 9d35d650..d239afea 100644
this.registerEntity(entity); this.registerEntity(entity);
} }
} // Paper - timings } // Paper - timings
@@ -1344,6 +1345,19 @@ public class WorldServer extends World { @@ -1342,6 +1343,19 @@ public class WorldServer extends World {
public void unregisterEntity(Entity entity) { public void unregisterEntity(Entity entity) {
org.spigotmc.AsyncCatcher.catchOp("entity unregister"); // Spigot org.spigotmc.AsyncCatcher.catchOp("entity unregister"); // Spigot
@ -54,7 +54,7 @@ index 9d35d650..d239afea 100644
// Spigot start // Spigot start
if ( entity instanceof EntityHuman ) if ( entity instanceof EntityHuman )
{ {
@@ -1405,9 +1419,21 @@ public class WorldServer extends World { @@ -1403,9 +1417,21 @@ public class WorldServer extends World {
private void registerEntity(Entity entity) { private void registerEntity(Entity entity) {
org.spigotmc.AsyncCatcher.catchOp("entity register"); // Spigot org.spigotmc.AsyncCatcher.catchOp("entity register"); // Spigot
@ -78,5 +78,5 @@ index 9d35d650..d239afea 100644
if (entity instanceof EntityEnderDragon) { if (entity instanceof EntityEnderDragon) {
EntityComplexPart[] aentitycomplexpart = ((EntityEnderDragon) entity).eo(); EntityComplexPart[] aentitycomplexpart = ((EntityEnderDragon) entity).eo();
-- --
2.25.1.windows.1 2.25.1

View file

@ -1,4 +1,4 @@
From f285d3fdf296a363f5a1aad7871a095a98ca9943 Mon Sep 17 00:00:00 2001 From 3b90bd5d0498f4f789321cae8e45861b623847a3 Mon Sep 17 00:00:00 2001
From: Aikar <aikar@aikar.co> From: Aikar <aikar@aikar.co>
Date: Tue, 31 Mar 2020 03:01:45 -0400 Date: Tue, 31 Mar 2020 03:01:45 -0400
Subject: [PATCH] Fix unregistering entities from unloading chunks Subject: [PATCH] Fix unregistering entities from unloading chunks
@ -15,10 +15,10 @@ Combine that with a buggy detail of the previous implementation of
the Dupe UUID patch, then this was the likely source of the "Ghost entities" the Dupe UUID patch, then this was the likely source of the "Ghost entities"
diff --git a/src/main/java/net/minecraft/server/WorldServer.java b/src/main/java/net/minecraft/server/WorldServer.java diff --git a/src/main/java/net/minecraft/server/WorldServer.java b/src/main/java/net/minecraft/server/WorldServer.java
index d239afea..a9cb5245 100644 index e198b8c565..b3e1e3686b 100644
--- a/src/main/java/net/minecraft/server/WorldServer.java --- a/src/main/java/net/minecraft/server/WorldServer.java
+++ b/src/main/java/net/minecraft/server/WorldServer.java +++ b/src/main/java/net/minecraft/server/WorldServer.java
@@ -1498,9 +1498,9 @@ public class WorldServer extends World { @@ -1496,9 +1496,9 @@ public class WorldServer extends World {
} }
private void removeEntityFromChunk(Entity entity) { private void removeEntityFromChunk(Entity entity) {
@ -31,5 +31,5 @@ index d239afea..a9cb5245 100644
} }
-- --
2.25.1.windows.1 2.25.1

View file

@ -1,4 +1,4 @@
From a3fc9acd793ff194a4a64945d08799f360af077d Mon Sep 17 00:00:00 2001 From feee85c5270a67f4b6c53789ecf8509aeaf81ec3 Mon Sep 17 00:00:00 2001
From: Aikar <aikar@aikar.co> From: Aikar <aikar@aikar.co>
Date: Thu, 2 Apr 2020 01:42:39 -0400 Date: Thu, 2 Apr 2020 01:42:39 -0400
Subject: [PATCH] Prevent Double PlayerChunkMap adds crashing server Subject: [PATCH] Prevent Double PlayerChunkMap adds crashing server
@ -7,7 +7,7 @@ Suspected case would be around the technique used in .stopRiding
Stack will identify any causer of this and warn instead of crashing. Stack will identify any causer of this and warn instead of crashing.
diff --git a/src/main/java/net/minecraft/server/PlayerChunkMap.java b/src/main/java/net/minecraft/server/PlayerChunkMap.java diff --git a/src/main/java/net/minecraft/server/PlayerChunkMap.java b/src/main/java/net/minecraft/server/PlayerChunkMap.java
index 0186ab9e..e1e4ea79 100644 index 0186ab9e40..e1e4ea793a 100644
--- a/src/main/java/net/minecraft/server/PlayerChunkMap.java --- a/src/main/java/net/minecraft/server/PlayerChunkMap.java
+++ b/src/main/java/net/minecraft/server/PlayerChunkMap.java +++ b/src/main/java/net/minecraft/server/PlayerChunkMap.java
@@ -1484,6 +1484,14 @@ public class PlayerChunkMap extends IChunkLoader implements PlayerChunk.d { @@ -1484,6 +1484,14 @@ public class PlayerChunkMap extends IChunkLoader implements PlayerChunk.d {
@ -26,10 +26,10 @@ index 0186ab9e..e1e4ea79 100644
if (!(entity instanceof EntityLightning)) { if (!(entity instanceof EntityLightning)) {
EntityTypes<?> entitytypes = entity.getEntityType(); EntityTypes<?> entitytypes = entity.getEntityType();
diff --git a/src/main/java/net/minecraft/server/WorldServer.java b/src/main/java/net/minecraft/server/WorldServer.java diff --git a/src/main/java/net/minecraft/server/WorldServer.java b/src/main/java/net/minecraft/server/WorldServer.java
index a9cb5245..969c6aad 100644 index b3e1e3686b..142770bcd6 100644
--- a/src/main/java/net/minecraft/server/WorldServer.java --- a/src/main/java/net/minecraft/server/WorldServer.java
+++ b/src/main/java/net/minecraft/server/WorldServer.java +++ b/src/main/java/net/minecraft/server/WorldServer.java
@@ -1464,7 +1464,7 @@ public class WorldServer extends World { @@ -1462,7 +1462,7 @@ public class WorldServer extends World {
} }
} }
@ -38,7 +38,7 @@ index a9cb5245..969c6aad 100644
// CraftBukkit start - SPIGOT-5278 // CraftBukkit start - SPIGOT-5278
if (entity instanceof EntityDrowned) { if (entity instanceof EntityDrowned) {
this.navigators.add(((EntityDrowned) entity).navigationWater); this.navigators.add(((EntityDrowned) entity).navigationWater);
@@ -1475,6 +1475,7 @@ public class WorldServer extends World { @@ -1473,6 +1473,7 @@ public class WorldServer extends World {
this.navigators.add(((EntityInsentient) entity).getNavigation()); this.navigators.add(((EntityInsentient) entity).getNavigation());
} }
entity.valid = true; // CraftBukkit entity.valid = true; // CraftBukkit
@ -47,5 +47,5 @@ index a9cb5245..969c6aad 100644
if (entity.origin == null) { if (entity.origin == null) {
entity.origin = entity.getBukkitEntity().getLocation(); entity.origin = entity.getBukkitEntity().getLocation();
-- --
2.25.1.windows.1 2.25.1

View file

@ -1,4 +1,4 @@
From 10e05a26c3962896fd2bba8a9cc939c59c668093 Mon Sep 17 00:00:00 2001 From 0467c06a3ef19731b946d4240eb9ab19b22de245 Mon Sep 17 00:00:00 2001
From: Spottedleaf <Spottedleaf@users.noreply.github.com> From: Spottedleaf <Spottedleaf@users.noreply.github.com>
Date: Wed, 15 Apr 2020 18:08:53 -0700 Date: Wed, 15 Apr 2020 18:08:53 -0700
Subject: [PATCH] Optimise entity hard collision checking Subject: [PATCH] Optimise entity hard collision checking
@ -11,10 +11,10 @@ Less crammed entities are likely to show significantly less benefit.
Effectively, this patch optimises crammed entity situations. Effectively, this patch optimises crammed entity situations.
diff --git a/src/main/java/net/minecraft/server/Chunk.java b/src/main/java/net/minecraft/server/Chunk.java diff --git a/src/main/java/net/minecraft/server/Chunk.java b/src/main/java/net/minecraft/server/Chunk.java
index 719c6f3e..d745eae4 100644 index 8695845445..32c342d313 100644
--- a/src/main/java/net/minecraft/server/Chunk.java --- a/src/main/java/net/minecraft/server/Chunk.java
+++ b/src/main/java/net/minecraft/server/Chunk.java +++ b/src/main/java/net/minecraft/server/Chunk.java
@@ -92,6 +92,54 @@ public class Chunk implements IChunkAccess { @@ -90,6 +90,54 @@ public class Chunk implements IChunkAccess {
private final int[] inventoryEntityCounts = new int[16]; private final int[] inventoryEntityCounts = new int[16];
// Paper end // Paper end
@ -69,7 +69,7 @@ index 719c6f3e..d745eae4 100644
public Chunk(World world, ChunkCoordIntPair chunkcoordintpair, BiomeStorage biomestorage, ChunkConverter chunkconverter, TickList<Block> ticklist, TickList<FluidType> ticklist1, long i, @Nullable ChunkSection[] achunksection, @Nullable Consumer<Chunk> consumer) { public Chunk(World world, ChunkCoordIntPair chunkcoordintpair, BiomeStorage biomestorage, ChunkConverter chunkconverter, TickList<Block> ticklist, TickList<FluidType> ticklist1, long i, @Nullable ChunkSection[] achunksection, @Nullable Consumer<Chunk> consumer) {
this.sections = new ChunkSection[16]; this.sections = new ChunkSection[16];
this.e = Maps.newHashMap(); this.e = Maps.newHashMap();
@@ -539,7 +587,7 @@ public class Chunk implements IChunkAccess { @@ -525,7 +573,7 @@ public class Chunk implements IChunkAccess {
entity.chunkY = k; entity.chunkY = k;
entity.chunkZ = this.loc.z; entity.chunkZ = this.loc.z;
this.entities.add(entity); // Paper - per chunk entity list this.entities.add(entity); // Paper - per chunk entity list
@ -78,7 +78,7 @@ index 719c6f3e..d745eae4 100644
// Paper start // Paper start
if (entity instanceof EntityItem) { if (entity instanceof EntityItem) {
itemCounts[k]++; itemCounts[k]++;
@@ -576,7 +624,7 @@ public class Chunk implements IChunkAccess { @@ -562,7 +610,7 @@ public class Chunk implements IChunkAccess {
entity.entitySlice = null; entity.entitySlice = null;
entity.inChunk = false; entity.inChunk = false;
} }
@ -88,7 +88,7 @@ index 719c6f3e..d745eae4 100644
} }
if (entity instanceof EntityItem) { if (entity instanceof EntityItem) {
diff --git a/src/main/java/net/minecraft/server/Entity.java b/src/main/java/net/minecraft/server/Entity.java diff --git a/src/main/java/net/minecraft/server/Entity.java b/src/main/java/net/minecraft/server/Entity.java
index 9cb4e5a1..96a47dd1 100644 index 9cb4e5a1e6..96a47dd1c2 100644
--- a/src/main/java/net/minecraft/server/Entity.java --- a/src/main/java/net/minecraft/server/Entity.java
+++ b/src/main/java/net/minecraft/server/Entity.java +++ b/src/main/java/net/minecraft/server/Entity.java
@@ -210,6 +210,40 @@ public abstract class Entity implements INamableTileEntity, ICommandListener, Ke @@ -210,6 +210,40 @@ public abstract class Entity implements INamableTileEntity, ICommandListener, Ke
@ -133,7 +133,7 @@ index 9cb4e5a1..96a47dd1 100644
this.id = Entity.entityCount.incrementAndGet(); this.id = Entity.entityCount.incrementAndGet();
this.passengers = Lists.newArrayList(); this.passengers = Lists.newArrayList();
diff --git a/src/main/java/net/minecraft/server/EntityEnderDragon.java b/src/main/java/net/minecraft/server/EntityEnderDragon.java diff --git a/src/main/java/net/minecraft/server/EntityEnderDragon.java b/src/main/java/net/minecraft/server/EntityEnderDragon.java
index af10fc36..2887cb14 100644 index af10fc36e0..2887cb14e4 100644
--- a/src/main/java/net/minecraft/server/EntityEnderDragon.java --- a/src/main/java/net/minecraft/server/EntityEnderDragon.java
+++ b/src/main/java/net/minecraft/server/EntityEnderDragon.java +++ b/src/main/java/net/minecraft/server/EntityEnderDragon.java
@@ -847,6 +847,7 @@ public class EntityEnderDragon extends EntityInsentient implements IMonster { @@ -847,6 +847,7 @@ public class EntityEnderDragon extends EntityInsentient implements IMonster {
@ -145,7 +145,7 @@ index af10fc36..2887cb14 100644
return this.children; return this.children;
} }
diff --git a/src/main/java/net/minecraft/server/IEntityAccess.java b/src/main/java/net/minecraft/server/IEntityAccess.java diff --git a/src/main/java/net/minecraft/server/IEntityAccess.java b/src/main/java/net/minecraft/server/IEntityAccess.java
index 4157e50e..5135308f 100644 index 4157e50e4d..5135308fb6 100644
--- a/src/main/java/net/minecraft/server/IEntityAccess.java --- a/src/main/java/net/minecraft/server/IEntityAccess.java
+++ b/src/main/java/net/minecraft/server/IEntityAccess.java +++ b/src/main/java/net/minecraft/server/IEntityAccess.java
@@ -42,17 +42,26 @@ public interface IEntityAccess { @@ -42,17 +42,26 @@ public interface IEntityAccess {
@ -178,7 +178,7 @@ index 4157e50e..5135308f 100644
return stream.filter(axisalignedbb1::c).map(VoxelShapes::a); return stream.filter(axisalignedbb1::c).map(VoxelShapes::a);
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/World.java b/src/main/java/net/minecraft/server/World.java
index 46e19d91..09b03aff 100644 index d530508b61..1a3c7c148b 100644
--- a/src/main/java/net/minecraft/server/World.java --- a/src/main/java/net/minecraft/server/World.java
+++ b/src/main/java/net/minecraft/server/World.java +++ b/src/main/java/net/minecraft/server/World.java
@@ -1172,6 +1172,32 @@ public abstract class World implements GeneratorAccess, AutoCloseable { @@ -1172,6 +1172,32 @@ public abstract class World implements GeneratorAccess, AutoCloseable {
@ -215,5 +215,5 @@ index 46e19d91..09b03aff 100644
public List<Entity> getEntities(@Nullable Entity entity, AxisAlignedBB axisalignedbb, @Nullable Predicate<? super Entity> predicate) { public List<Entity> getEntities(@Nullable Entity entity, AxisAlignedBB axisalignedbb, @Nullable Predicate<? super Entity> predicate) {
this.getMethodProfiler().c("getEntities"); this.getMethodProfiler().c("getEntities");
-- --
2.25.1.windows.1 2.25.1