Apply remove stream optimizations.

This commit is contained in:
IzzelAliz 2020-07-06 20:15:28 +08:00
parent 8b4a000bb9
commit 1f73ca02e9
5 changed files with 298 additions and 8 deletions

View File

@ -119,7 +119,7 @@ remapSpigotJar {
}
mixin {
// add sourceSets.main, 'mixins.arclight.impl.refmap.1_14.json'
add sourceSets.main, 'mixins.arclight.impl.refmap.1_15.json'
}
compileJava {

View File

@ -1,6 +1,8 @@
package io.izzel.arclight.impl;
import io.izzel.arclight.common.mod.ArclightConnector;
import io.izzel.arclight.i18n.ArclightConfig;
import org.spongepowered.asm.mixin.Mixins;
@SuppressWarnings("unused")
public class ArclightConnector_1_15 extends ArclightConnector {
@ -8,12 +10,9 @@ public class ArclightConnector_1_15 extends ArclightConnector {
@Override
public void connect() {
super.connect();
/*
Mixins.addConfiguration("mixins.arclight.impl.core.1_14.json");
Mixins.addConfiguration("mixins.arclight.optimization.1_14.json");
if (ArclightConfig.INSTANCE.optimizations.removeStreams) {
Mixins.addConfiguration("mixins.arclight.optimization.stream.1_14.json");
}*/
// LOGGER.info("Arclight optimization mixin added.");
if (ArclightConfig.spec().getOptimization().isRemoveStream()) {
Mixins.addConfiguration("mixins.arclight.impl.optimization.stream.1_15.json");
}
LOGGER.info("mixin-load.optimization");
}
}

View File

@ -0,0 +1,119 @@
package io.izzel.arclight.impl.mixin.v1_15.optimization.stream;
import net.minecraft.entity.ai.goal.Goal;
import net.minecraft.entity.ai.goal.GoalSelector;
import net.minecraft.entity.ai.goal.PrioritizedGoal;
import net.minecraft.profiler.IProfiler;
import org.spongepowered.asm.mixin.Final;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Overwrite;
import org.spongepowered.asm.mixin.Shadow;
import java.util.EnumSet;
import java.util.Map;
import java.util.Set;
@Mixin(GoalSelector.class)
public abstract class GoalSelectorMixin {
// @formatter:off
@Shadow @Final private Set<PrioritizedGoal> goals;
@Shadow @Final private IProfiler profiler;
@Shadow @Final private EnumSet<Goal.Flag> disabledFlags;
@Shadow @Final private Map<Goal.Flag, PrioritizedGoal> flagGoals;
@Shadow @Final private static PrioritizedGoal DUMMY;
// @formatter:on
/**
* @author IzzelAliz
* @reason
*/
@Overwrite
public void removeGoal(Goal task) {
for (PrioritizedGoal p_220882_1_ : this.goals) {
if (p_220882_1_.getGoal() == task) {
if (p_220882_1_.isRunning()) {
p_220882_1_.resetTask();
}
}
}
this.goals.removeIf((p_220884_1_) -> {
return p_220884_1_.getGoal() == task;
});
}
/**
* @author IzzelAliz
* @reason
*/
@Overwrite
public void tick() {
this.profiler.startSection("goalCleanup");
for (PrioritizedGoal p_220881_1_ : this.goals) {
if (p_220881_1_.isRunning()) {
EnumSet<Goal.Flag> flags = this.disabledFlags;
boolean b = false;
for (Goal.Flag flag : p_220881_1_.getMutexFlags()) {
if (flags.contains(flag)) {
b = true;
break;
}
}
if (b) {
p_220881_1_.resetTask();
} else if (!p_220881_1_.isRunning() || !p_220881_1_.shouldContinueExecuting()) {
p_220881_1_.resetTask();
}
}
}
for (Map.Entry<Goal.Flag, PrioritizedGoal> entry : this.flagGoals.entrySet()) {
Goal.Flag p_220885_1_ = entry.getKey();
PrioritizedGoal p_220885_2_ = entry.getValue();
if (!p_220885_2_.isRunning()) {
this.flagGoals.remove(p_220885_1_);
}
}
this.profiler.endSection();
this.profiler.startSection("goalUpdate");
for (PrioritizedGoal p_220883_0_ : this.goals) {
if (!p_220883_0_.isRunning()) {
EnumSet<Goal.Flag> flags = this.disabledFlags;
boolean b = true;
for (Goal.Flag flag : p_220883_0_.getMutexFlags()) {
if (flags.contains(flag)) {
b = false;
break;
}
}
if (b) {
boolean result = true;
for (Goal.Flag p_220887_2_ : p_220883_0_.getMutexFlags()) {
if (!this.flagGoals.getOrDefault(p_220887_2_, DUMMY).isPreemptedBy(p_220883_0_)) {
result = false;
break;
}
}
if (result) {
if (p_220883_0_.shouldExecute()) {
for (Goal.Flag p_220876_2_ : p_220883_0_.getMutexFlags()) {
PrioritizedGoal prioritizedgoal = this.flagGoals.getOrDefault(p_220876_2_, DUMMY);
prioritizedgoal.resetTask();
this.flagGoals.put(p_220876_2_, p_220883_0_);
}
p_220883_0_.startExecuting();
}
}
}
}
}
this.profiler.endSection();
this.profiler.startSection("goalTick");
for (PrioritizedGoal goal : this.goals) {
if (goal.isRunning()) {
goal.tick();
}
}
this.profiler.endSection();
}
}

View File

@ -0,0 +1,162 @@
package io.izzel.arclight.impl.mixin.v1_15.optimization.stream;
import net.minecraft.entity.MobEntity;
import net.minecraft.pathfinding.FlaggedPathPoint;
import net.minecraft.pathfinding.NodeProcessor;
import net.minecraft.pathfinding.Path;
import net.minecraft.pathfinding.PathFinder;
import net.minecraft.pathfinding.PathHeap;
import net.minecraft.pathfinding.PathPoint;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.Region;
import org.spongepowered.asm.mixin.Final;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Overwrite;
import org.spongepowered.asm.mixin.Shadow;
import javax.annotation.Nullable;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.Set;
@Mixin(PathFinder.class)
public abstract class PathFinderMixin {
// @formatter:off
@Shadow protected abstract float func_224776_a(PathPoint p_224776_1_, Set<FlaggedPathPoint> p_224776_2_);
@Shadow @Final private PathHeap path;
@Shadow @Final private Set<PathPoint> closedSet;
@Shadow @Final private int field_215751_d;
@Shadow @Final private NodeProcessor nodeProcessor;
@Shadow @Final private PathPoint[] pathOptions;
@Shadow protected abstract Path func_224780_a(PathPoint p_224780_1_, BlockPos p_224780_2_, boolean p_224780_3_);
// @formatter:on
/**
* @author IzzelAliz
* @reason
*/
@Overwrite
@Nullable
public Path func_227478_a_(Region p_227478_1_, MobEntity p_227478_2_, Set<BlockPos> p_227478_3_, float p_227478_4_, int p_227478_5_, float p_227478_6_) {
this.path.clearPath();
this.nodeProcessor.func_225578_a_(p_227478_1_, p_227478_2_);
PathPoint pathpoint = this.nodeProcessor.getStart();
Map<FlaggedPathPoint, BlockPos> map = new HashMap<>();
for (BlockPos p_224782_1_ : p_227478_3_) {
if (map.put(this.nodeProcessor.func_224768_a(p_224782_1_.getX(), p_224782_1_.getY(), p_224782_1_.getZ()), p_224782_1_) != null) {
throw new IllegalStateException("Duplicate key");
}
}
Path path = this.func_227479_a_(pathpoint, map, p_227478_4_, p_227478_5_, p_227478_6_);
this.nodeProcessor.postProcess();
return path;
}
/**
* @author IzzelAliz
* @reason
*/
@Overwrite
@Nullable
private Path func_227479_a_(PathPoint p_227479_1_, Map<FlaggedPathPoint, BlockPos> p_227479_2_, float p_227479_3_, int p_227479_4_, float p_227479_5_) {
Set<FlaggedPathPoint> set = p_227479_2_.keySet();
p_227479_1_.totalPathDistance = 0.0F;
p_227479_1_.distanceToNext = this.func_224776_a(p_227479_1_, set);
p_227479_1_.distanceToTarget = p_227479_1_.distanceToNext;
this.path.clearPath();
this.closedSet.clear();
this.path.addPoint(p_227479_1_);
int i = 0;
int j = (int) ((float) this.field_215751_d * p_227479_5_);
while (!this.path.isPathEmpty()) {
++i;
if (i >= j) {
break;
}
PathPoint pathpoint = this.path.dequeue();
pathpoint.visited = true;
for (FlaggedPathPoint p_224781_2_ : set) {
if (pathpoint.func_224757_c(p_224781_2_) <= (float) p_227479_4_) {
p_224781_2_.func_224764_e();
}
}
boolean b = false;
for (FlaggedPathPoint flaggedPathPoint : set) {
if (flaggedPathPoint.func_224762_f()) {
b = true;
break;
}
}
if (b) {
break;
}
if (!(pathpoint.distanceTo(p_227479_1_) >= p_227479_3_)) {
int k = this.nodeProcessor.func_222859_a(this.pathOptions, pathpoint);
for (int l = 0; l < k; ++l) {
PathPoint pathpoint1 = this.pathOptions[l];
float f = pathpoint.distanceTo(pathpoint1);
pathpoint1.field_222861_j = pathpoint.field_222861_j + f;
float f1 = pathpoint.totalPathDistance + f + pathpoint1.costMalus;
if (pathpoint1.field_222861_j < p_227479_3_ && (!pathpoint1.isAssigned() || f1 < pathpoint1.totalPathDistance)) {
pathpoint1.previous = pathpoint;
pathpoint1.totalPathDistance = f1;
pathpoint1.distanceToNext = this.func_224776_a(pathpoint1, set) * 1.5F;
if (pathpoint1.isAssigned()) {
this.path.changeDistance(pathpoint1, pathpoint1.totalPathDistance + pathpoint1.distanceToNext);
} else {
pathpoint1.distanceToTarget = pathpoint1.totalPathDistance + pathpoint1.distanceToNext;
this.path.addPoint(pathpoint1);
}
}
}
}
}
Optional<Path> optional;
if (set.stream().anyMatch(FlaggedPathPoint::func_224762_f)) {
List<Path> toSort = new ArrayList<>();
for (FlaggedPathPoint p_224778_2_ : set) {
if (p_224778_2_.func_224762_f()) {
Path func_224780_a = this.func_224780_a(p_224778_2_.func_224763_d(), p_227479_2_.get(p_224778_2_), true);
toSort.add(func_224780_a);
}
}
toSort.sort(Comparator.comparingInt(Path::getCurrentPathLength));
Optional<Path> found = Optional.empty();
for (Path func_224780_a : toSort) {
found = Optional.of(func_224780_a);
break;
}
optional = found;
} else {
List<Path> toSort = new ArrayList<>();
for (FlaggedPathPoint p_224777_2_ : set) {
Path func_224780_a = this.func_224780_a(p_224777_2_.func_224763_d(), p_227479_2_.get(p_224777_2_), false);
toSort.add(func_224780_a);
}
toSort.sort(Comparator.comparingDouble(Path::func_224769_l).thenComparingInt(Path::getCurrentPathLength));
Optional<Path> found = Optional.empty();
for (Path func_224780_a : toSort) {
found = Optional.of(func_224780_a);
break;
}
optional = found;
}
if (!optional.isPresent()) {
return null;
} else {
Path path = optional.get();
return path;
}
}
}

View File

@ -0,0 +1,10 @@
{
"minVersion": "0.8",
"package": "io.izzel.arclight.impl.mixin.v1_15.optimization.stream",
"target": "@env(DEFAULT)",
"refmap": "mixins.arclight.impl.refmap.1_15.json",
"mixins": [
"GoalSelectorMixin",
"PathFinderMixin"
]
}