From 3b827802bdcd7237803bbae9e61d950f63292868 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kobe=20=E2=91=A7?= <102713261+HaHaWTH@users.noreply.github.com> Date: Wed, 20 Nov 2024 02:41:23 +0800 Subject: [PATCH] Cleanup Lithium patches & Faster distanceTo & Optimize worldgen math (#166) * dbqq * Cleanup patch * uwu * import now back * include info in patch header * FMA for distanceTo * Add detailed headers --- .../0135-Optimize-Entity-distanceToSqr.patch | 6 +- .../0152-Lithium-equipment-tracking.patch | 31 +++---- .../0154-C2ME-Optimize-world-gen-math.patch | 91 +++++++++++++++++++ 3 files changed, 106 insertions(+), 22 deletions(-) create mode 100644 patches/server/0154-C2ME-Optimize-world-gen-math.patch diff --git a/patches/server/0135-Optimize-Entity-distanceToSqr.patch b/patches/server/0135-Optimize-Entity-distanceToSqr.patch index dceae9e33..27e08b6c5 100644 --- a/patches/server/0135-Optimize-Entity-distanceToSqr.patch +++ b/patches/server/0135-Optimize-Entity-distanceToSqr.patch @@ -4,11 +4,11 @@ Date: Fri, 29 Oct 2077 00:00:00 +0800 Subject: [PATCH] Optimize Entity distanceToSqr This patch optimizes Entity#distanceToSqr call by using Math#fma which is around 1.2x to 4x faster than original method, -avoids multiple casting in Entity#distanceTo, using Math#hypot instead of Mojang's Mth#sqrt. Additionally, this patch makes +avoids multiple casting in Entity#distanceTo, using Math#sqrt directly instead of Mojang's Mth#sqrt. Additionally, this patch makes these methods more able to be inlined by the JIT compiler. diff --git a/src/main/java/net/minecraft/world/entity/Entity.java b/src/main/java/net/minecraft/world/entity/Entity.java -index 08a3714c530fb375ee729e91965c65efb9e6e3d2..976d72b611011cccf4b4efadc9772ce1c68ef5ee 100644 +index 08a3714c530fb375ee729e91965c65efb9e6e3d2..6a19390aff7c8f7170467d2c6306b00779f23082 100644 --- a/src/main/java/net/minecraft/world/entity/Entity.java +++ b/src/main/java/net/minecraft/world/entity/Entity.java @@ -2368,33 +2368,41 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess @@ -28,7 +28,7 @@ index 08a3714c530fb375ee729e91965c65efb9e6e3d2..976d72b611011cccf4b4efadc9772ce1 + // Leaf end - Optimize distanceTo - Avoid casting - return Mth.sqrt(f * f + f1 * f1 + f2 * f2); -+ return (float) Math.hypot(dx, Math.hypot(dy, dz)); // Leaf - Use Math#hypot instead of Mojang's Mth#sqrt ++ return (float) Math.sqrt(org.dreeam.leaf.LeafBootstrap.enableFMA ? Math.fma(dx, dx, Math.fma(dy, dy, dz * dz)) : dx * dx + dy * dy + dz * dz); // Leaf - Use Math#sqrt instead of Mojang's Mth#sqrt - only cast once } + // Leaf end - Optimize distanceTo - inlining diff --git a/patches/server/0152-Lithium-equipment-tracking.patch b/patches/server/0152-Lithium-equipment-tracking.patch index 761870ce4..8340c5c18 100644 --- a/patches/server/0152-Lithium-equipment-tracking.patch +++ b/patches/server/0152-Lithium-equipment-tracking.patch @@ -315,7 +315,7 @@ index 22da75d8197de29a150c9eade7994deecae53a10..aa8a5938984d6860deb67a36f85c83d9 public boolean equals(Object object) { if (this == object) { diff --git a/src/main/java/net/minecraft/world/entity/LivingEntity.java b/src/main/java/net/minecraft/world/entity/LivingEntity.java -index 9de85972ba32fd2373f70f708aa1bfc6067e6e1c..3ae75230a4250665df7a72aff1d84317b81fc077 100644 +index 9de85972ba32fd2373f70f708aa1bfc6067e6e1c..0e68d854955aea1068d4a605bca701f0a0e2f297 100644 --- a/src/main/java/net/minecraft/world/entity/LivingEntity.java +++ b/src/main/java/net/minecraft/world/entity/LivingEntity.java @@ -157,7 +157,7 @@ import org.bukkit.event.entity.EntityTeleportEvent; @@ -371,7 +371,7 @@ index 9de85972ba32fd2373f70f708aa1bfc6067e6e1c..3ae75230a4250665df7a72aff1d84317 Map map = null; EquipmentSlot[] aenumitemslot = EquipmentSlot.VALUES; // Gale - JettPack - reduce array allocations int i = aenumitemslot.length; -@@ -4848,6 +4855,80 @@ public abstract class LivingEntity extends Entity implements Attackable { +@@ -4848,6 +4855,79 @@ public abstract class LivingEntity extends Entity implements Attackable { flag = true; return flag; } @@ -419,8 +419,7 @@ index 9de85972ba32fd2373f70f708aa1bfc6067e6e1c..3ae75230a4250665df7a72aff1d84317 + @Override + public void notifyCount(ItemStack publisher, int zero, int newCount) { + if (newCount == 0) { -+ //noinspection unchecked -+ ((net.caffeinemc.mods.lithium.common.util.change_tracking.ChangePublisher) (Object) publisher).unsubscribeWithData(this, zero); ++ publisher.unsubscribeWithData(this, zero); + } + + this.onEquipmentReplaced(publisher, ItemStack.EMPTY); @@ -442,10 +441,10 @@ index 9de85972ba32fd2373f70f708aa1bfc6067e6e1c..3ae75230a4250665df7a72aff1d84317 + } + + if (!oldStack.isEmpty()) { -+ ((net.caffeinemc.mods.lithium.common.util.change_tracking.ChangePublisher) oldStack).unsubscribeWithData(this, 0); ++ oldStack.unsubscribeWithData(this, 0); + } + if (!newStack.isEmpty()) { -+ ((net.caffeinemc.mods.lithium.common.util.change_tracking.ChangePublisher) newStack).subscribe(this, 0); ++ newStack.subscribe(this, 0); + } + } + // Leaf end - Lithium entity equipment tracking @@ -599,7 +598,7 @@ index 3bb46ed871fd56bbbe52cfd2575f9e853e03cd73..6d73ae2a453feeae0aea67bb555c64a0 + // Leaf end - Lithium equipment tracking } diff --git a/src/main/java/net/minecraft/world/item/ItemStack.java b/src/main/java/net/minecraft/world/item/ItemStack.java -index 933b7519da5330ea8acd05c337201f52cab12c3c..b4fc8fcfb7994705a4307d9b0731bcd55f81d1fd 100644 +index 933b7519da5330ea8acd05c337201f52cab12c3c..e5579b15f305fb216dadd8023c16178a342b4add 100644 --- a/src/main/java/net/minecraft/world/item/ItemStack.java +++ b/src/main/java/net/minecraft/world/item/ItemStack.java @@ -120,7 +120,7 @@ import org.bukkit.event.player.PlayerItemDamageEvent; @@ -623,7 +622,7 @@ index 933b7519da5330ea8acd05c337201f52cab12c3c..b4fc8fcfb7994705a4307d9b0731bcd5 private static DataResult validateStrict(ItemStack stack) { DataResult dataresult = ItemStack.validateComponents(stack.getComponents()); -@@ -1368,6 +1373,23 @@ public final class ItemStack implements DataComponentHolder { +@@ -1368,6 +1373,21 @@ public final class ItemStack implements DataComponentHolder { } public void setCount(int count) { @@ -633,9 +632,7 @@ index 933b7519da5330ea8acd05c337201f52cab12c3c..b4fc8fcfb7994705a4307d9b0731bcd5 + countChangeSubscriber.notifyCount(this, this.subscriberData, count); + } + if (count == 0) { -+ //Safe because ComponentMapImplMixin implements the interface -+ //noinspection unchecked -+ ((net.caffeinemc.mods.lithium.common.util.change_tracking.ChangePublisher) (Object) this.components).unsubscribe(this); ++ this.components.unsubscribe(this); + if (this.subscriber != null) { + this.subscriber.forceUnsubscribe(this, this.subscriberData); + this.subscriber = null; @@ -647,7 +644,7 @@ index 933b7519da5330ea8acd05c337201f52cab12c3c..b4fc8fcfb7994705a4307d9b0731bcd5 this.count = count; } -@@ -1423,4 +1445,91 @@ public final class ItemStack implements DataComponentHolder { +@@ -1423,4 +1443,87 @@ public final class ItemStack implements DataComponentHolder { public boolean canBeHurtBy(DamageSource source) { return !this.has(DataComponents.FIRE_RESISTANT) || !source.is(DamageTypeTags.IS_FIRE); } @@ -681,8 +678,7 @@ index 933b7519da5330ea8acd05c337201f52cab12c3c..b4fc8fcfb7994705a4307d9b0731bcd5 + this.subscriber = net.caffeinemc.mods.lithium.common.util.change_tracking.ChangeSubscriber.without(this.subscriber, subscriber); + + if (this.subscriber == null) { -+ //noinspection unchecked -+ ((net.caffeinemc.mods.lithium.common.util.change_tracking.ChangePublisher) (Object) this.components).unsubscribe(this); ++ this.components.unsubscribe(this); + } + return retval; + } @@ -697,8 +693,7 @@ index 933b7519da5330ea8acd05c337201f52cab12c3c..b4fc8fcfb7994705a4307d9b0731bcd5 + this.subscriber = net.caffeinemc.mods.lithium.common.util.change_tracking.ChangeSubscriber.without(this.subscriber, subscriber, subscriberData, true); + + if (this.subscriber == null) { -+ //noinspection unchecked -+ ((net.caffeinemc.mods.lithium.common.util.change_tracking.ChangePublisher) (Object) this.components).unsubscribe(this); ++ this.components.unsubscribe(this); + } + } + @@ -733,9 +728,7 @@ index 933b7519da5330ea8acd05c337201f52cab12c3c..b4fc8fcfb7994705a4307d9b0731bcd5 + } + + private void startTrackingChanges() { -+ //Safe because ComponentMapImplMixin -+ //noinspection unchecked -+ ((net.caffeinemc.mods.lithium.common.util.change_tracking.ChangePublisher) (Object) this.components).subscribe(this, 0); ++ this.components.subscribe(this, 0); + } + // Leaf end - Lithium equipment tracking } diff --git a/patches/server/0154-C2ME-Optimize-world-gen-math.patch b/patches/server/0154-C2ME-Optimize-world-gen-math.patch new file mode 100644 index 000000000..99b2d1773 --- /dev/null +++ b/patches/server/0154-C2ME-Optimize-world-gen-math.patch @@ -0,0 +1,91 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: HaHaWTH <102713261+HaHaWTH@users.noreply.github.com> +Date: Tue, 9 Nov 2077 00:00:00 +0800 +Subject: [PATCH] C2ME: Optimize world gen math + +This patch is based on following mixins: +* "com/ishland/c2me/opts/math/mixin/MixinChunkPos.java" +* "com/ishland/c2me/opts/worldgen/vanilla/mixin/aquifer/MixinNoiseChunkGenerator.java" + +As part of: C2ME-fabric (https://github.com/RelativityMC/C2ME-fabric) +Licensed under: MIT + +Co-authored-by: Taiyou06 + +diff --git a/src/main/java/net/minecraft/world/level/ChunkPos.java b/src/main/java/net/minecraft/world/level/ChunkPos.java +index fa58eeec2b652f0fa251eedf11cfabde5fd3198b..4976627098381f70b10c7370529bb5000bc5626f 100644 +--- a/src/main/java/net/minecraft/world/level/ChunkPos.java ++++ b/src/main/java/net/minecraft/world/level/ChunkPos.java +@@ -84,7 +84,12 @@ public class ChunkPos { + + @Override + public boolean equals(Object object) { +- return this == object || object instanceof ChunkPos chunkPos && this.x == chunkPos.x && this.z == chunkPos.z; ++ // Leaf start - Use standard equals ++ if (object == this) return true; ++ if (object == null || object.getClass() != this.getClass()) return false; ++ ChunkPos thatPos = (ChunkPos) object; ++ return this.x == thatPos.x && this.z == thatPos.z; ++ // Leaf end - Use standard equals + } + + public int getMiddleBlockX() { +diff --git a/src/main/java/net/minecraft/world/level/levelgen/Beardifier.java b/src/main/java/net/minecraft/world/level/levelgen/Beardifier.java +index ca93a97256350789ca56f910862c9d717ca7670b..3a1a5257e1a98cc1d520f407bb1f8c745cadd3df 100644 +--- a/src/main/java/net/minecraft/world/level/levelgen/Beardifier.java ++++ b/src/main/java/net/minecraft/world/level/levelgen/Beardifier.java +@@ -132,8 +132,14 @@ public class Beardifier implements DensityFunctions.BeardifierOrMarker { + } + + private static double getBuryContribution(double x, double y, double z) { +- double d = Mth.length(x, y, z); +- return Mth.clampedMap(d, 0.0, 6.0, 1.0, 0.0); ++ // Leaf start - Optimize method for beardifier ++ double d = Math.sqrt(x * x + y * y + z * z); ++ if (d > 6.0) { ++ return 0.0; ++ } else { ++ return 1.0 - d / 6.0; ++ } ++ // Leaf end - Optimize method for beardifier + } + + private static double getBeardContribution(int x, int y, int z, int yy) { +diff --git a/src/main/java/net/minecraft/world/level/levelgen/NoiseBasedChunkGenerator.java b/src/main/java/net/minecraft/world/level/levelgen/NoiseBasedChunkGenerator.java +index c991da3d975e07f3e1e59d5b2e91ed629ea608e6..4a56c06fef4efbed9fa72cf11583f25854c5a9c2 100644 +--- a/src/main/java/net/minecraft/world/level/levelgen/NoiseBasedChunkGenerator.java ++++ b/src/main/java/net/minecraft/world/level/levelgen/NoiseBasedChunkGenerator.java +@@ -76,14 +76,13 @@ public final class NoiseBasedChunkGenerator extends ChunkGenerator { + } + + private static Aquifer.FluidPicker createFluidPicker(NoiseGeneratorSettings settings) { ++ // Leaf start - Optimize world gen + Aquifer.FluidStatus aquifer_b = new Aquifer.FluidStatus(-54, Blocks.LAVA.defaultBlockState()); + int i = settings.seaLevel(); + Aquifer.FluidStatus aquifer_b1 = new Aquifer.FluidStatus(i, settings.defaultFluid()); +- Aquifer.FluidStatus aquifer_b2 = new Aquifer.FluidStatus(DimensionType.MIN_Y * 2, Blocks.AIR.defaultBlockState()); +- +- return (j, k, l) -> { +- return k < Math.min(-54, i) ? aquifer_b : aquifer_b1; +- }; ++ final int min = Math.min(-54, i); ++ return (j, k, l) -> k < min ? aquifer_b : aquifer_b1; ++ // Leaf end - Optimize world gen + } + + @Override +diff --git a/src/main/java/net/minecraft/world/level/levelgen/synth/PerlinNoise.java b/src/main/java/net/minecraft/world/level/levelgen/synth/PerlinNoise.java +index 022dda9dded1bd96dcaf377b1d1a9711ea9c49e7..1b0c92f3c20a4edc85a976a0eec620d0a96b5bba 100644 +--- a/src/main/java/net/minecraft/world/level/levelgen/synth/PerlinNoise.java ++++ b/src/main/java/net/minecraft/world/level/levelgen/synth/PerlinNoise.java +@@ -215,7 +215,9 @@ public class PerlinNoise { + } + + public static double wrap(double value) { +- return value - (double)Mth.lfloor(value / 3.3554432E7 + 0.5) * 3.3554432E7; ++ // Leaf start - Avoid casting ++ return value - Math.floor(value / 3.3554432E7 + 0.5) * 3.3554432E7; ++ // Leaf end - Avoid casting + } + + protected int firstOctave() {