From a9be79a6a000b1f0a874b8b539a3ccaf1aac0cf1 Mon Sep 17 00:00:00 2001 From: Taiyou06 Date: Sun, 7 Jul 2024 02:28:22 +0300 Subject: [PATCH] faster methods --- .../fast_util/AxisCycleDirectionMixin.java | 60 ++++++++++++++ .../nitori/mixin/math/fast_util/BoxMixin.java | 79 +++++++++++++++++++ .../mixin/math/fast_util/DirectionMixin.java | 38 +++++++++ src/main/resources/mixins.core.json | 5 +- 4 files changed, 181 insertions(+), 1 deletion(-) create mode 100644 src/main/java/net/gensokyoreimagined/nitori/mixin/math/fast_util/AxisCycleDirectionMixin.java create mode 100644 src/main/java/net/gensokyoreimagined/nitori/mixin/math/fast_util/BoxMixin.java create mode 100644 src/main/java/net/gensokyoreimagined/nitori/mixin/math/fast_util/DirectionMixin.java diff --git a/src/main/java/net/gensokyoreimagined/nitori/mixin/math/fast_util/AxisCycleDirectionMixin.java b/src/main/java/net/gensokyoreimagined/nitori/mixin/math/fast_util/AxisCycleDirectionMixin.java new file mode 100644 index 0000000..1a99da9 --- /dev/null +++ b/src/main/java/net/gensokyoreimagined/nitori/mixin/math/fast_util/AxisCycleDirectionMixin.java @@ -0,0 +1,60 @@ +package net.gensokyoreimagined.nitori.mixin.math.fast_util; + +import net.minecraft.core.Direction; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Overwrite; + +/** + * The JVM has difficulty optimizing these functions due to the use of dynamic dispatch. They can trivially be + * implemented as a simple switch lookup table. Switch-on-enum is avoided due to issues in Mixin hotswap. + */ +public class AxisCycleDirectionMixin { + static { + assert Direction.Axis.X.ordinal() == 0; + assert Direction.Axis.Y.ordinal() == 1; + assert Direction.Axis.Z.ordinal() == 2; + assert Direction.Axis.values().length == 3; + } + + @Mixin(targets = "net/minecraft/core/AxisCycle$2") + public static class ForwardMixin { + /** + * @reason Avoid expensive array/modulo operations + * @author JellySquid + */ + @Overwrite + public Direction.Axis cycle(Direction.Axis axis) { + switch (axis.ordinal()) { + case 0: //X + return Direction.Axis.Y; + case 1: //Y + return Direction.Axis.Z; + case 2: //Z + return Direction.Axis.X; + } + + throw new IllegalArgumentException(); + } + } + + @Mixin(targets = "net/minecraft/core/AxisCycle$3") + public static class BackwardMixin { + /** + * @reason Avoid expensive array/modulo operations + * @author JellySquid + */ + @Overwrite + public Direction.Axis cycle(Direction.Axis axis) { + switch (axis.ordinal()) { + case 0: //X + return Direction.Axis.Z; + case 1: //Y + return Direction.Axis.X; + case 2: //Z + return Direction.Axis.Y; + } + + throw new IllegalArgumentException(); + } + } +} \ No newline at end of file diff --git a/src/main/java/net/gensokyoreimagined/nitori/mixin/math/fast_util/BoxMixin.java b/src/main/java/net/gensokyoreimagined/nitori/mixin/math/fast_util/BoxMixin.java new file mode 100644 index 0000000..346b5ca --- /dev/null +++ b/src/main/java/net/gensokyoreimagined/nitori/mixin/math/fast_util/BoxMixin.java @@ -0,0 +1,79 @@ +package net.gensokyoreimagined.nitori.mixin.math.fast_util; + +import net.minecraft.world.phys.AABB; +import net.minecraft.core.Direction; +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Overwrite; +import org.spongepowered.asm.mixin.Shadow; + +@Mixin(AABB.class) +public class BoxMixin { + static { + assert Direction.Axis.X.ordinal() == 0; + assert Direction.Axis.Y.ordinal() == 1; + assert Direction.Axis.Z.ordinal() == 2; + assert Direction.Axis.values().length == 3; + } + + @Shadow + @Final + public double minX; + + @Shadow + @Final + public double minY; + + @Shadow + @Final + public double minZ; + + @Shadow + @Final + public double maxX; + + @Shadow + @Final + public double maxY; + + @Shadow + @Final + public double maxZ; + + /** + * @reason Simplify the code to better help the JVM optimize it + * @author JellySquid + */ + @Overwrite + public double min(Direction.Axis axis) { + switch (axis.ordinal()) { + case 0: //X + return this.minX; + case 1: //Y + return this.minY; + case 2: //Z + return this.minZ; + } + + throw new IllegalArgumentException(); + } + + /** + * @reason Simplify the code to better help the JVM optimize it + * @author JellySquid + */ + @Overwrite + public double max(Direction.Axis axis) { + switch (axis.ordinal()) { + case 0: //X + return this.maxX; + case 1: //Y + return this.maxY; + case 2: //Z + return this.maxZ; + } + + throw new IllegalArgumentException(); + + } +} \ No newline at end of file diff --git a/src/main/java/net/gensokyoreimagined/nitori/mixin/math/fast_util/DirectionMixin.java b/src/main/java/net/gensokyoreimagined/nitori/mixin/math/fast_util/DirectionMixin.java new file mode 100644 index 0000000..940dbe7 --- /dev/null +++ b/src/main/java/net/gensokyoreimagined/nitori/mixin/math/fast_util/DirectionMixin.java @@ -0,0 +1,38 @@ +//package net.gensokyoreimagined.nitori.mixin.math.fast_util; +// +//import net.minecraft.core.Direction; +//import net.minecraft.core.Direction.Axis; +//import net.minecraft.util.RandomSource; +//import org.spongepowered.asm.mixin.Final; +//import org.spongepowered.asm.mixin.Mixin; +//import org.spongepowered.asm.mixin.Overwrite; +//import org.spongepowered.asm.mixin.Shadow; +// +//@Mixin(Direction.class) +//public class DirectionMixin { +// @Shadow +// @Final +// private static Direction[] ALL; +// +// @Shadow +// @Final +// private int idOpposite; +// +// /** +// * @reason Avoid the modulo/abs operations +// * @author JellySquid +// */ +// @Overwrite +// public Direction getOpposite() { +// return ALL[this.idOpposite]; +// } +// +// /** +// * @reason Do not allocate an excessive number of Direction arrays +// * @author JellySquid +// */ +// @Overwrite +// public static Direction getRandom(RandomSource rand) { +// return Direction.ALL[rand.nextInt(ALL.length)]; +// } +//} \ No newline at end of file diff --git a/src/main/resources/mixins.core.json b/src/main/resources/mixins.core.json index e283bfa..ae34f87 100755 --- a/src/main/resources/mixins.core.json +++ b/src/main/resources/mixins.core.json @@ -37,6 +37,9 @@ "shapes.blockstate_cache.BlockMixin", "world.inline_height.WorldChunkMixin", "math.fast_blockops.DirectionMixin", - "math.fast_blockops.BlockPosMixin" + "math.fast_blockops.BlockPosMixin", + "math.fast_util.AxisCycleDirectionMixin.BackwardMixin", + "math.fast_util.AxisCycleDirectionMixin.ForwardMixin", + "math.fast_util.BoxMixin" ] }