From ee7fcdafc090b838ab215bd53a6b93d868157b79 Mon Sep 17 00:00:00 2001 From: IzzelAliz Date: Tue, 3 May 2022 10:53:23 +0800 Subject: [PATCH] Optimize entity tracker effective range compute Per TeaCon profiling results, getIndirectPassengers can take up to 50% tick time and most of it is stream. --- .../general/EntityMixin_Optimize.java | 46 +++++++++++++++++++ ...xins.arclight.impl.forge.optimization.json | 1 + 2 files changed, 47 insertions(+) create mode 100644 arclight-common/src/main/java/io/izzel/arclight/common/mixin/optimization/general/EntityMixin_Optimize.java diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/optimization/general/EntityMixin_Optimize.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/optimization/general/EntityMixin_Optimize.java new file mode 100644 index 00000000..285e45b0 --- /dev/null +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/optimization/general/EntityMixin_Optimize.java @@ -0,0 +1,46 @@ +package io.izzel.arclight.common.mixin.optimization.general; + +import com.google.common.collect.ImmutableList; +import net.minecraft.world.entity.Entity; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Overwrite; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.stream.Stream; + +@Mixin(Entity.class) +public abstract class EntityMixin_Optimize { + + @Shadow public ImmutableList passengers; + + @Inject(method = "getIndirectPassengersStream", cancellable = true, at = @At("HEAD")) + private void arclight$emptyPassenger(CallbackInfoReturnable> cir) { + if (this.passengers.isEmpty()) { + cir.setReturnValue(Stream.empty()); + } + } + + /** + * @author IzzelAliz + * @reason + */ + @Overwrite + public Iterable getIndirectPassengers() { + if (this.passengers.isEmpty()) { + return Collections.emptyList(); + } else { + var list = new ArrayList(); + for (var entity : this.passengers) { + list.add(entity); + list.addAll((Collection) entity.getIndirectPassengers()); + } + return list; + } + } +} diff --git a/arclight-common/src/main/resources/mixins.arclight.impl.forge.optimization.json b/arclight-common/src/main/resources/mixins.arclight.impl.forge.optimization.json index 36560763..db2b0c83 100644 --- a/arclight-common/src/main/resources/mixins.arclight.impl.forge.optimization.json +++ b/arclight-common/src/main/resources/mixins.arclight.impl.forge.optimization.json @@ -8,6 +8,7 @@ "ClassInheritanceMultiMapMixin", "ConnectionMixin_Optimize", "EntityDataManagerMixin_Optimize", + "EntityMixin_Optimize", "GoalMixin", "MobMixin_Optimization", "ResourceKeyMixin_Optimize",