Reduce allocation of Vec3D by entity tracker

This commit is contained in:
Spottedleaf
2020-04-27 00:04:16 -07:00
parent 0449ede4a6
commit 46c2fbfb74
3 changed files with 39 additions and 14 deletions

View File

@@ -1,6 +1,11 @@
--- a/net/minecraft/network/protocol/game/VecDeltaCodec.java --- a/net/minecraft/network/protocol/game/VecDeltaCodec.java
+++ b/net/minecraft/network/protocol/game/VecDeltaCodec.java +++ b/net/minecraft/network/protocol/game/VecDeltaCodec.java
@@ -9,12 +9,12 @@ @@ -5,16 +5,16 @@
public class VecDeltaCodec {
private static final double TRUNCATION_STEPS = 4096.0;
- private Vec3 base = Vec3.ZERO;
+ public Vec3 base = Vec3.ZERO; // Paper
@VisibleForTesting @VisibleForTesting
static long encode(double value) { static long encode(double value) {

View File

@@ -11,11 +11,10 @@
public class ChunkMap extends ChunkStorage implements ChunkHolder.PlayerProvider, GeneratingChunkMap { public class ChunkMap extends ChunkStorage implements ChunkHolder.PlayerProvider, GeneratingChunkMap {
private static final ChunkResult<List<ChunkAccess>> UNLOADED_CHUNK_LIST_RESULT = ChunkResult.error("Unloaded chunks found in range"); private static final ChunkResult<List<ChunkAccess>> UNLOADED_CHUNK_LIST_RESULT = ChunkResult.error("Unloaded chunks found in range");
@@ -148,7 +152,34 @@ @@ -149,6 +153,33 @@
private final AtomicInteger activeChunkWrites;
public int serverViewDistance; public int serverViewDistance;
private final WorldGenContext worldGenContext; private final WorldGenContext worldGenContext;
+
+ // CraftBukkit start - recursion-safe executor for Chunk loadCallback() and unloadCallback() + // CraftBukkit start - recursion-safe executor for Chunk loadCallback() and unloadCallback()
+ public final CallbackExecutor callbackExecutor = new CallbackExecutor(); + public final CallbackExecutor callbackExecutor = new CallbackExecutor();
+ public static final class CallbackExecutor implements java.util.concurrent.Executor, Runnable { + public static final class CallbackExecutor implements java.util.concurrent.Executor, Runnable {
@@ -36,7 +35,7 @@
+ } + }
+ }; + };
+ // CraftBukkit end + // CraftBukkit end
+
+ // Paper start + // Paper start
+ public final ChunkHolder getUnloadingChunkHolder(int chunkX, int chunkZ) { + public final ChunkHolder getUnloadingChunkHolder(int chunkX, int chunkZ) {
+ return this.pendingUnloads.get(ca.spottedleaf.moonrise.common.util.CoordinateUtils.getChunkKey(chunkX, chunkZ)); + return this.pendingUnloads.get(ca.spottedleaf.moonrise.common.util.CoordinateUtils.getChunkKey(chunkX, chunkZ));
@@ -379,16 +378,22 @@
if (this.seenBy.remove(player.connection)) { if (this.seenBy.remove(player.connection)) {
this.serverEntity.removePairing(player); this.serverEntity.removePairing(player);
} }
@@ -1476,17 +1564,37 @@ @@ -1476,17 +1564,41 @@
} }
public void updatePlayer(ServerPlayer player) { public void updatePlayer(ServerPlayer player) {
+ org.spigotmc.AsyncCatcher.catchOp("player tracker update"); // Spigot + org.spigotmc.AsyncCatcher.catchOp("player tracker update"); // Spigot
if (player != this.entity) { if (player != this.entity) {
Vec3 vec3d = player.position().subtract(this.entity.position()); - Vec3 vec3d = player.position().subtract(this.entity.position());
+ // Paper start - remove allocation of Vec3D here
+ // Vec3 vec3d = player.position().subtract(this.entity.position());
+ double vec3d_dx = player.getX() - this.entity.getX();
+ double vec3d_dz = player.getZ() - this.entity.getZ();
+ // Paper end - remove allocation of Vec3D here
int i = ChunkMap.this.getPlayerViewDistance(player); int i = ChunkMap.this.getPlayerViewDistance(player);
double d0 = (double) Math.min(this.getEffectiveRange(), i * 16); double d0 = (double) Math.min(this.getEffectiveRange(), i * 16);
double d1 = vec3d.x * vec3d.x + vec3d.z * vec3d.z; - double d1 = vec3d.x * vec3d.x + vec3d.z * vec3d.z;
+ double d1 = vec3d_dx * vec3d_dx + vec3d_dz * vec3d_dz; // Paper
double d2 = d0 * d0; double d2 = d0 * d0;
- boolean flag = d1 <= d2 && this.entity.broadcastToPlayer(player) && ChunkMap.this.isChunkTracked(player, this.entity.chunkPosition().x, this.entity.chunkPosition().z); - boolean flag = d1 <= d2 && this.entity.broadcastToPlayer(player) && ChunkMap.this.isChunkTracked(player, this.entity.chunkPosition().x, this.entity.chunkPosition().z);
+ // Paper start - Configurable entity tracking range by Y + // Paper start - Configurable entity tracking range by Y
@@ -418,7 +423,7 @@
} }
} else if (this.seenBy.remove(player.connection)) { } else if (this.seenBy.remove(player.connection)) {
this.serverEntity.removePairing(player); this.serverEntity.removePairing(player);
@@ -1506,6 +1614,7 @@ @@ -1506,6 +1618,7 @@
while (iterator.hasNext()) { while (iterator.hasNext()) {
Entity entity = (Entity) iterator.next(); Entity entity = (Entity) iterator.next();
int j = entity.getType().clientTrackingRange() * 16; int j = entity.getType().clientTrackingRange() * 16;

View File

@@ -86,7 +86,22 @@
worldmap.tickCarriedBy(entityplayer, itemstack); worldmap.tickCarriedBy(entityplayer, itemstack);
Packet<?> packet = worldmap.getUpdatePacket(mapid, entityplayer); Packet<?> packet = worldmap.getUpdatePacket(mapid, entityplayer);
@@ -248,6 +258,27 @@ @@ -168,7 +178,13 @@
++this.teleportDelay;
Vec3 vec3d = this.entity.trackingPosition();
- boolean flag1 = this.positionCodec.delta(vec3d).lengthSqr() >= 7.62939453125E-6D;
+ // Paper start - reduce allocation of Vec3D here
+ Vec3 base = this.positionCodec.base;
+ double vec3d_dx = vec3d.x - base.x;
+ double vec3d_dy = vec3d.y - base.y;
+ double vec3d_dz = vec3d.z - base.z;
+ boolean flag1 = (vec3d_dx * vec3d_dx + vec3d_dy * vec3d_dy + vec3d_dz * vec3d_dz) >= 7.62939453125E-6D;
+ // Paper end - reduce allocation of Vec3D here
Packet<?> packet1 = null;
boolean flag2 = flag1 || this.tickCount % 60 == 0;
boolean flag3 = false;
@@ -248,6 +264,27 @@
++this.tickCount; ++this.tickCount;
if (this.entity.hurtMarked) { if (this.entity.hurtMarked) {
@@ -114,7 +129,7 @@
this.entity.hurtMarked = false; this.entity.hurtMarked = false;
this.broadcastAndSend(new ClientboundSetEntityMotionPacket(this.entity)); this.broadcastAndSend(new ClientboundSetEntityMotionPacket(this.entity));
} }
@@ -298,7 +329,10 @@ @@ -298,7 +335,10 @@
public void sendPairingData(ServerPlayer player, Consumer<Packet<ClientGamePacketListener>> sender) { public void sendPairingData(ServerPlayer player, Consumer<Packet<ClientGamePacketListener>> sender) {
if (this.entity.isRemoved()) { if (this.entity.isRemoved()) {
@@ -126,7 +141,7 @@
} }
Packet<ClientGamePacketListener> packet = this.entity.getAddEntityPacket(this); Packet<ClientGamePacketListener> packet = this.entity.getAddEntityPacket(this);
@@ -313,6 +347,12 @@ @@ -313,6 +353,12 @@
if (this.entity instanceof LivingEntity) { if (this.entity instanceof LivingEntity) {
Collection<AttributeInstance> collection = ((LivingEntity) this.entity).getAttributes().getSyncableAttributes(); Collection<AttributeInstance> collection = ((LivingEntity) this.entity).getAttributes().getSyncableAttributes();
@@ -139,7 +154,7 @@
if (!collection.isEmpty()) { if (!collection.isEmpty()) {
sender.accept(new ClientboundUpdateAttributesPacket(this.entity.getId(), collection)); sender.accept(new ClientboundUpdateAttributesPacket(this.entity.getId(), collection));
} }
@@ -344,6 +384,7 @@ @@ -344,6 +390,7 @@
if (!list.isEmpty()) { if (!list.isEmpty()) {
sender.accept(new ClientboundSetEquipmentPacket(this.entity.getId(), list)); sender.accept(new ClientboundSetEquipmentPacket(this.entity.getId(), list));
} }
@@ -147,7 +162,7 @@
} }
if (!this.entity.getPassengers().isEmpty()) { if (!this.entity.getPassengers().isEmpty()) {
@@ -396,6 +437,11 @@ @@ -396,6 +443,11 @@
Set<AttributeInstance> set = ((LivingEntity) this.entity).getAttributes().getAttributesToSync(); Set<AttributeInstance> set = ((LivingEntity) this.entity).getAttributes().getAttributesToSync();
if (!set.isEmpty()) { if (!set.isEmpty()) {