Skip reloading server resources if switching worlds and the datapack

order didn't change
This commit is contained in:
embeddedt 2023-02-27 12:17:54 -05:00
parent c27f189154
commit fca7c9f7ef
5 changed files with 105 additions and 0 deletions

View File

@ -26,6 +26,7 @@ public class ModernFixEarlyConfig {
this.addMixinRule("perf.reduce_blockstate_cache_rebuilds", true);
this.addMixinRule("perf.boost_worker_count", true);
this.addMixinRule("perf.skip_first_datapack_reload", true);
this.addMixinRule("perf.reuse_datapacks", true);
this.addMixinRule("perf.parallelize_model_loading", true);
this.addMixinRule("perf.parallelize_model_loading.multipart", false);
this.addMixinRule("perf.cache_strongholds", true);

View File

@ -0,0 +1,10 @@
package org.embeddedt.modernfix.duck.reuse_datapacks;
import net.minecraft.server.ServerResources;
import java.util.Collection;
public interface ICachingResourceClient {
void setCachedResources(ServerResources r);
void setCachedDataPackConfig(Collection<String> c);
}

View File

@ -0,0 +1,65 @@
package org.embeddedt.modernfix.mixin.perf.reuse_datapacks;
import com.google.common.collect.ImmutableList;
import net.minecraft.client.Minecraft;
import net.minecraft.commands.Commands;
import net.minecraft.server.MinecraftServer;
import net.minecraft.server.ServerResources;
import net.minecraft.server.packs.PackResources;
import net.minecraft.server.packs.repository.Pack;
import net.minecraft.server.packs.repository.PackRepository;
import net.minecraft.world.level.DataPackConfig;
import org.embeddedt.modernfix.ModernFix;
import org.embeddedt.modernfix.duck.reuse_datapacks.ICachingResourceClient;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Redirect;
import java.util.Collection;
import java.util.List;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.Executor;
@Mixin(Minecraft.class)
public class MinecraftMixin implements ICachingResourceClient {
private ServerResources cachedResources;
private List<String> cachedDataPackConfig;
private List<String> loadingDataPackConfig;
@Redirect(method = "makeServerStem", at = @At(value = "INVOKE", target = "Lnet/minecraft/server/MinecraftServer;configurePackRepository(Lnet/minecraft/server/packs/repository/PackRepository;Lnet/minecraft/world/level/DataPackConfig;Z)Lnet/minecraft/world/level/DataPackConfig;"))
private DataPackConfig saveLoadingConfig(PackRepository repo, DataPackConfig inCodec, boolean vanillaOnly) {
DataPackConfig config = MinecraftServer.configurePackRepository(repo, inCodec, vanillaOnly);
loadingDataPackConfig = repo.getSelectedPacks().stream().map(Pack::getId).collect(ImmutableList.toImmutableList());
return config;
}
@Redirect(method = "makeServerStem", at = @At(value = "INVOKE", target = "Lnet/minecraft/server/ServerResources;loadResources(Ljava/util/List;Lnet/minecraft/commands/Commands$CommandSelection;ILjava/util/concurrent/Executor;Ljava/util/concurrent/Executor;)Ljava/util/concurrent/CompletableFuture;"))
private CompletableFuture<ServerResources> useCachedResources(List<PackResources> list, Commands.CommandSelection arg, int i, Executor executor, Executor executor2) {
if(cachedResources != null) {
if(cachedDataPackConfig.equals(loadingDataPackConfig)) {
ModernFix.LOGGER.warn("Reusing loaded server resources from previous world");
return CompletableFuture.completedFuture(cachedResources);
} else {
ModernFix.LOGGER.warn("Discarding cached server resources, datapack configs have changed");
ModernFix.LOGGER.warn("Old: {}", "[" + String.join(", ", cachedDataPackConfig) + "]");
ModernFix.LOGGER.warn("New: {}", "[" + String.join(", ", loadingDataPackConfig) + "]");
cachedResources.close();
cachedResources = null;
cachedDataPackConfig = null;
}
}
return ServerResources.loadResources(list, arg, i, executor, executor2);
}
@Override
public void setCachedResources(ServerResources r) {
cachedResources = r;
}
@Override
public void setCachedDataPackConfig(Collection<String> c) {
cachedDataPackConfig = ImmutableList.copyOf(c);
}
}

View File

@ -0,0 +1,27 @@
package org.embeddedt.modernfix.mixin.perf.reuse_datapacks;
import com.google.common.collect.ImmutableList;
import net.minecraft.client.Minecraft;
import net.minecraft.server.MinecraftServer;
import net.minecraft.server.ServerResources;
import net.minecraft.server.packs.repository.Pack;
import net.minecraft.server.packs.repository.PackRepository;
import org.embeddedt.modernfix.duck.reuse_datapacks.ICachingResourceClient;
import org.spongepowered.asm.mixin.Final;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Shadow;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Redirect;
@Mixin(MinecraftServer.class)
public class MinecraftServerMixin {
@Shadow @Final private PackRepository packRepository;
@Redirect(method = "stopServer", at = @At(value = "INVOKE", target = "Lnet/minecraft/server/ServerResources;close()V"))
private void saveResources(ServerResources resources) {
ICachingResourceClient client = ((ICachingResourceClient) Minecraft.getInstance());
client.setCachedDataPackConfig(this.packRepository.getSelectedPacks().stream().map(Pack::getId).collect(ImmutableList.toImmutableList()));
client.setCachedResources(resources);
}
}

View File

@ -90,6 +90,8 @@
"perf.faster_texture_stitching.StitcherMixin",
"bugfix.packet_leak.ClientPlayNetHandlerMixin",
"bugfix.packet_leak.SCustomPayloadPlayPacketMixin",
"perf.reuse_datapacks.MinecraftMixin",
"perf.reuse_datapacks.MinecraftServerMixin",
"perf.faster_singleplayer_load.MinecraftServerMixin"
],
"injectors": {