Yatopia/patches/server/0059-Use-faster-block-collision-check-for-entity-suffocat.patch
Mykyta Komarn 9d72c63586 Remove faulty stream replacements
We had some old, faulty stream replacements in place before, which caused a lot of tick lag compared to just using Mojang's streams in vanilla.

Removing these stream replacements lowered average tick from 12ms w/ 1 player online to 3.5ms with 3 players online.

References and benchmarks:
Performance impact in ms: https://imgur.com/a/yuZs5Il
MSPT comparison: https://imgur.com/a/X4hqZ2P
Old, faulty stream replacement flow: https://imgur.com/a/meSXmaJ
Mojang's vanilla streams flow: https://imgur.com/a/9Yf6yQc
2020-10-05 17:40:09 -07:00

69 lines
3.6 KiB
Diff

From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: Mykyta Komarn <nkomarn@hotmail.com>
Date: Tue, 29 Sep 2020 17:27:30 -0700
Subject: [PATCH] Use faster block collision check for entity suffocation check
Improves the speed of checks by ~3,000ns per entity on average.
diff --git a/src/main/java/me/jellysquid/mods/lithium/common/entity/movement/ChunkAwareBlockCollisionSweeper.java b/src/main/java/me/jellysquid/mods/lithium/common/entity/movement/ChunkAwareBlockCollisionSweeper.java
index 7ed343cfb3130446c85dab2ca04d60f91e2c94fb..194d2f177b05c594c7a27b6191860a3f89394f06 100644
--- a/src/main/java/me/jellysquid/mods/lithium/common/entity/movement/ChunkAwareBlockCollisionSweeper.java
+++ b/src/main/java/me/jellysquid/mods/lithium/common/entity/movement/ChunkAwareBlockCollisionSweeper.java
@@ -16,6 +16,7 @@ import net.minecraft.server.VoxelShape;
import net.minecraft.server.VoxelShapeCollision;
import net.minecraft.server.VoxelShapes;
+import java.util.function.BiPredicate; // Yatopia
import static me.jellysquid.mods.lithium.common.entity.LithiumEntityCollisions.EPSILON;
/**
@@ -59,6 +60,21 @@ public class ChunkAwareBlockCollisionSweeper {
private ChunkSection cachedChunkSection;
private boolean needEntityCollisionCheck;
+ // Yatopia start
+ private boolean checkSuffocation;
+ private final BiPredicate<IBlockData, BlockPosition> suffocationPredicate = new BiPredicate<IBlockData, BlockPosition>() {
+ @Override
+ public boolean test(IBlockData iBlockData, BlockPosition blockPosition) {
+ return iBlockData.o(view, blockPosition);
+ }
+ };
+
+ public ChunkAwareBlockCollisionSweeper(ICollisionAccess view, Entity entity, AxisAlignedBB box, boolean checkSuffocation) {
+ this(view, entity, box);
+ this.checkSuffocation = checkSuffocation;
+ }
+ // Yatopia end
+
public ChunkAwareBlockCollisionSweeper(ICollisionAccess view, Entity entity, AxisAlignedBB box) {
this.box = box;
this.shape = VoxelShapes.of(box);
@@ -206,6 +222,11 @@ public class ChunkAwareBlockCollisionSweeper {
if (canInteractWithBlock(state, edgesHit)) {
this.pos.setValues(x, y, z);
+ // Yatopia start
+ if (checkSuffocation && !suffocationPredicate.test(state, this.pos)) {
+ continue;
+ }
+ // Yatopia end
VoxelShape collisionShape = state.getCollisionShape(this.view, this.pos, this.context);
if (collisionShape != VoxelShapes.empty()) {
diff --git a/src/main/java/net/minecraft/server/Entity.java b/src/main/java/net/minecraft/server/Entity.java
index a86f958ad01b5b935413b093540f8d3a2f4fb41a..9f953cc49d3bd770cb460f5fe6466a4c61ea4186 100644
--- a/src/main/java/net/minecraft/server/Entity.java
+++ b/src/main/java/net/minecraft/server/Entity.java
@@ -2156,9 +2156,7 @@ public abstract class Entity implements INamableTileEntity, ICommandListener, Ke
float f1 = this.size.width * 0.8F;
AxisAlignedBB axisalignedbb = AxisAlignedBB.g((double) f1, 0.10000000149011612D, (double) f1).d(this.locX(), this.getHeadY(), this.locZ());
- return this.world.b(this, axisalignedbb, (iblockdata, blockposition) -> {
- return iblockdata.o(this.world, blockposition);
- }).findAny().isPresent();
+ return new me.jellysquid.mods.lithium.common.entity.movement.ChunkAwareBlockCollisionSweeper(this.world, this, axisalignedbb, true).getNextCollidedShape() != null; // Yatopia - fast suffocation check
}
}