Optimize memory allocation for checking entity fluid collisions. Backport of #10745

Co-authored-by: LexManos <LexManos@gmail.com>
This commit is contained in:
Matt 2026-01-16 16:13:06 -05:00 committed by GitHub
parent 7187d8d97f
commit e7629d5ae4
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -422,7 +422,7 @@
});
}
@@ -2980,9 +_,22 @@
@@ -2980,9 +_,31 @@
this.f_19859_ = this.m_146908_();
}
@ -439,6 +439,15 @@
+ this.updateFluidHeightAndDoFluidPushing(com.google.common.base.Predicates.alwaysTrue());
+ }
+
+ private static final class FluidCalcs {
+ double height = 0.0D;
+ Vec3 direction = Vec3.f_82478_;
+ int count = 0;
+ double height(double height) {
+ return (this.height = this.height >= height ? this.height : height);
+ }
+ }
+
+ public void updateFluidHeightAndDoFluidPushing(Predicate<FluidState> shouldUpdate) {
if (this.m_146899_()) {
- return false;
@ -446,11 +455,14 @@
} else {
AABB aabb = this.m_20191_().m_82406_(0.001D);
int i = Mth.m_14107_(aabb.f_82288_);
@@ -2997,25 +_,28 @@
Vec3 vec3 = Vec3.f_82478_;
int k1 = 0;
@@ -2994,28 +_,32 @@
double d0 = 0.0D;
boolean flag = this.m_6063_();
boolean flag1 = false;
- Vec3 vec3 = Vec3.f_82478_;
- int k1 = 0;
BlockPos.MutableBlockPos blockpos$mutableblockpos = new BlockPos.MutableBlockPos();
+ it.unimi.dsi.fastutil.objects.Object2ObjectMap<net.minecraftforge.fluids.FluidType, org.apache.commons.lang3.tuple.MutableTriple<Double, Vec3, Integer>> interimCalcs = new it.unimi.dsi.fastutil.objects.Object2ObjectArrayMap<>(net.minecraftforge.fluids.FluidType.SIZE.get() - 1);
+ it.unimi.dsi.fastutil.objects.Object2ObjectArrayMap<net.minecraftforge.fluids.FluidType, FluidCalcs> fluidPushCalcs = null;
for(int l1 = i; l1 < j; ++l1) {
for(int i2 = k; i2 < l; ++i2) {
@ -464,59 +476,50 @@
if (d1 >= aabb.f_82289_) {
flag1 = true;
- d0 = Math.max(d1 - aabb.f_82289_, d0);
- if (flag) {
+ org.apache.commons.lang3.tuple.MutableTriple<Double, Vec3, Integer> interim = interimCalcs.computeIfAbsent(fluidType, t -> org.apache.commons.lang3.tuple.MutableTriple.of(0.0D, Vec3.f_82478_, 0));
+ interim.setLeft(Math.max(d1 - aabb.f_82289_, interim.getLeft()));
+ if (this.isPushedByFluid(fluidType)) {
+ if (fluidPushCalcs == null)
+ fluidPushCalcs = new it.unimi.dsi.fastutil.objects.Object2ObjectArrayMap<net.minecraftforge.fluids.FluidType, FluidCalcs>(2);
+ var interim = fluidPushCalcs.computeIfAbsent(fluidType, type -> new FluidCalcs());
+ d0 = interim.height(d1 - aabb.f_82289_);
+ flag = this.isPushedByFluid(fluidType);
if (flag) {
Vec3 vec31 = fluidstate.m_76179_(this.m_9236_(), blockpos$mutableblockpos);
- if (d0 < 0.4D) {
- vec31 = vec31.m_82490_(d0);
+ if (interim.getLeft() < 0.4D) {
+ vec31 = vec31.m_82490_(interim.getLeft());
if (d0 < 0.4D) {
vec31 = vec31.m_82490_(d0);
}
- vec3 = vec3.m_82549_(vec31);
- ++k1;
+ interim.setMiddle(interim.getMiddle().m_82549_(vec31));
+ interim.setRight(interim.getRight() + 1);
+ interim.direction = interim.direction.m_82549_(vec31);
+ interim.count++;
}
}
}
@@ -3023,27 +_,28 @@
@@ -3023,6 +_,10 @@
}
}
- if (vec3.m_82553_() > 0.0D) {
- if (k1 > 0) {
- vec3 = vec3.m_82490_(1.0D / (double)k1);
+ interimCalcs.forEach((fluidType, interim) -> {
+ if (interim.getMiddle().m_82553_() > 0.0D) {
+ if (interim.getRight() > 0) {
+ interim.setMiddle(interim.getMiddle().m_82490_(1.0D / (double)interim.getRight()));
}
if (!(this instanceof Player)) {
- vec3 = vec3.m_82541_();
+ interim.setMiddle(interim.getMiddle().m_82541_());
+ if (fluidPushCalcs == null) return;
+ fluidPushCalcs.forEach((fluidType, interim) -> {
+ var vec3 = interim.direction;
+ var k1 = interim.count;
if (vec3.m_82553_() > 0.0D) {
if (k1 > 0) {
vec3 = vec3.m_82490_(1.0D / (double)k1);
@@ -3033,6 +_,7 @@
}
Vec3 vec32 = this.m_20184_();
- vec3 = vec3.m_82490_(p_204033_ * 1.0D);
+ interim.setMiddle(interim.getMiddle().m_82490_(this.getFluidMotionScale(fluidType)));
+ var p_204033_ = this.getFluidMotionScale(fluidType);
vec3 = vec3.m_82490_(p_204033_ * 1.0D);
double d2 = 0.003D;
- if (Math.abs(vec32.f_82479_) < 0.003D && Math.abs(vec32.f_82481_) < 0.003D && vec3.m_82553_() < 0.0045000000000000005D) {
- vec3 = vec3.m_82541_().m_82490_(0.0045000000000000005D);
+ if (Math.abs(vec32.f_82479_) < 0.003D && Math.abs(vec32.f_82481_) < 0.003D && interim.getMiddle().m_82553_() < 0.0045000000000000005D) {
+ interim.setMiddle(interim.getMiddle().m_82541_().m_82490_(0.0045000000000000005D));
}
- this.m_20256_(this.m_20184_().m_82549_(vec3));
+ this.m_20256_(this.m_20184_().m_82549_(interim.getMiddle()));
if (Math.abs(vec32.f_82479_) < 0.003D && Math.abs(vec32.f_82481_) < 0.003D && vec3.m_82553_() < 0.0045000000000000005D) {
@@ -3042,8 +_,8 @@
this.m_20256_(this.m_20184_().m_82549_(vec3));
}
- this.f_19799_.put(p_204032_, d0);
- return flag1;
+ this.setFluidTypeHeight(fluidType, interim.getLeft());
+ this.setFluidTypeHeight(fluidType, interim.height);
+ });
}
}