Skip to content

Commit 20470ea

Browse files
committed
Cache density results per block pos and bounding box combination to reduce explosion lags
1 parent 04c602c commit 20470ea

3 files changed

Lines changed: 71 additions & 0 deletions

File tree

src/main/java/fr/iamacat/optimizationsandtweaks/asm/Mixin.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ public enum Mixin implements IMixin {
1515

1616
common_core_MixinWorld(Side.COMMON, m -> OptimizationsandTweaksConfig.enableMixinWorld, "core.MixinWorld"),
1717
common_core_MixinEventBus(Side.COMMON, m -> OptimizationsandTweaksConfig.enableMixinEventBus, "core.MixinEventBus"),
18+
common_core_MixinExplosion(Side.COMMON, m -> OptimizationsandTweaksConfig.enableMixinExplosion, "core.MixinExplosion"),
1819
common_core_MixinEnchantmentHelper(Side.COMMON, m -> OptimizationsandTweaksConfig.enableMixinEnchantmentHelper,
1920
"core.MixinEnchantmentHelper"),
2021
common_packagedauto_MixinNeiHandlerPackagedAuto(Side.COMMON,

src/main/java/fr/iamacat/optimizationsandtweaks/config/OptimizationsandTweaksConfig.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,11 @@ public class OptimizationsandTweaksConfig {
112112
@Config.RequiresWorldRestart
113113
public static boolean enableMixinEventBus;
114114

115+
@Config.Comment("Optimize Explosion Class")
116+
@Config.DefaultBoolean(true)
117+
@Config.RequiresWorldRestart
118+
public static boolean enableMixinExplosion;
119+
115120
@Config.Comment("Optimize EnchantmentHelper Class")
116121
@Config.DefaultBoolean(true)
117122
@Config.RequiresWorldRestart
Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
package fr.iamacat.optimizationsandtweaks.mixins.common.core;
2+
3+
import net.minecraft.world.Explosion;
4+
import net.minecraft.world.World;
5+
import net.minecraft.entity.Entity;
6+
import net.minecraft.util.AxisAlignedBB;
7+
import net.minecraft.util.Vec3;
8+
import org.spongepowered.asm.mixin.Mixin;
9+
import org.spongepowered.asm.mixin.Shadow;
10+
import org.spongepowered.asm.mixin.injection.At;
11+
import org.spongepowered.asm.mixin.injection.Redirect;
12+
import org.spongepowered.asm.mixin.Unique;
13+
14+
import java.util.HashMap;
15+
import java.util.List;
16+
import java.util.Map;
17+
18+
@Mixin(Explosion.class)
19+
public abstract class MixinExplosion {
20+
21+
@Shadow public double explosionX;
22+
@Shadow public double explosionY;
23+
@Shadow public double explosionZ;
24+
@Shadow public float explosionSize;
25+
26+
@Unique private final Map<Integer, Float> blockDensityCache = new HashMap<>();
27+
28+
@Unique private int densityCallCount = 0;
29+
30+
@Redirect(
31+
method = "doExplosionA",
32+
at = @At(
33+
value = "INVOKE",
34+
target = "Lnet/minecraft/world/World;getBlockDensity(Lnet/minecraft/util/Vec3;Lnet/minecraft/util/AxisAlignedBB;)F"
35+
)
36+
)
37+
private float optimizeBlockDensity(World world, Vec3 vec3, AxisAlignedBB aabb) {
38+
densityCallCount++;
39+
40+
int hash = (int)(aabb.minX * 73856093) ^ (int)(aabb.minY * 19349663) ^ (int)(aabb.minZ * 83492791);
41+
42+
Float cached = blockDensityCache.get(hash);
43+
if (cached != null) {
44+
return cached;
45+
}
46+
47+
float density = world.getBlockDensity(vec3, aabb);
48+
blockDensityCache.put(hash, density);
49+
return density;
50+
}
51+
52+
@Redirect(
53+
method = "doExplosionA",
54+
at = @At(
55+
value = "INVOKE",
56+
target = "Lnet/minecraft/world/World;getEntitiesWithinAABBExcludingEntity(Lnet/minecraft/entity/Entity;Lnet/minecraft/util/AxisAlignedBB;)Ljava/util/List;",
57+
ordinal = 0
58+
)
59+
)
60+
private List resetDensityCache(World world, Entity entity, AxisAlignedBB aabb) {
61+
blockDensityCache.clear();
62+
densityCallCount = 0;
63+
return world.getEntitiesWithinAABBExcludingEntity(entity, aabb);
64+
}
65+
}

0 commit comments

Comments
 (0)