From 9a4952aa429e13a1065d681b61101bd8e7dcc374 Mon Sep 17 00:00:00 2001 From: embeddedt <42941056+embeddedt@users.noreply.github.com> Date: Sun, 1 Jan 2023 19:34:15 -0500 Subject: [PATCH] Optimize VanillaPack.resourceExists further --- .../modernfix/mixin/VanillaPackMixin.java | 29 ++++++------------- 1 file changed, 9 insertions(+), 20 deletions(-) diff --git a/src/main/java/org/embeddedt/modernfix/mixin/VanillaPackMixin.java b/src/main/java/org/embeddedt/modernfix/mixin/VanillaPackMixin.java index 387c7229..d0bcc22b 100644 --- a/src/main/java/org/embeddedt/modernfix/mixin/VanillaPackMixin.java +++ b/src/main/java/org/embeddedt/modernfix/mixin/VanillaPackMixin.java @@ -8,7 +8,9 @@ import net.minecraft.resources.VanillaPack; import net.minecraft.util.ResourceLocation; import org.apache.commons.lang3.tuple.Pair; import org.embeddedt.modernfix.FileWalker; +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.Inject; import org.spongepowered.asm.mixin.injection.Redirect; @@ -17,27 +19,20 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; import org.spongepowered.asm.mixin.injection.callback.LocalCapture; import java.io.IOException; -import java.nio.file.FileVisitOption; -import java.nio.file.Files; -import java.nio.file.Path; +import java.nio.file.*; import java.util.EnumMap; import java.util.HashMap; import java.util.List; +import java.util.Map; import java.util.concurrent.ExecutionException; import java.util.stream.Stream; @Mixin(VanillaPack.class) public class VanillaPackMixin { + @Shadow @Final private static Map FILE_SYSTEMS_BY_PACK_TYPE; private static LoadingCache, List> pathStreamLoadingCache = CacheBuilder.newBuilder() .build(FileWalker.INSTANCE); - private static EnumMap> resourceContainmentCache = new EnumMap<>(ResourcePackType.class); - static { - for(ResourcePackType type : ResourcePackType.values()) { - resourceContainmentCache.put(type, new HashMap<>()); - } - } - @Redirect(method = "collectResources", at = @At(value = "INVOKE", target = "Ljava/nio/file/Files;walk(Ljava/nio/file/Path;I[Ljava/nio/file/FileVisitOption;)Ljava/util/stream/Stream;")) private static Stream useCacheForLoading(Path path, int maxDepth, FileVisitOption[] fileVisitOptions) throws IOException { try { @@ -50,15 +45,9 @@ public class VanillaPackMixin { } } - @Inject(method = "resourceExists", at = @At(value = "RETURN", ordinal = 1), locals = LocalCapture.CAPTURE_FAILHARD) - private void storeExistenceToCache(ResourcePackType type, ResourceLocation location, CallbackInfoReturnable cir, String s) { - resourceContainmentCache.get(type).put(new ResourceLocation(location.getNamespace().intern(), location.getPath()), cir.getReturnValue()); - } - - @Inject(method = "resourceExists", at = @At(value = "INVOKE", target = "Ljava/lang/Class;getResource(Ljava/lang/String;)Ljava/net/URL;"), cancellable = true) - private void useCacheForExistence(ResourcePackType type, ResourceLocation location, CallbackInfoReturnable cir) { - Boolean b = resourceContainmentCache.get(type).getOrDefault(location, null); - if(b != null) - cir.setReturnValue(b); + @Inject(method = "resourceExists", at = @At(value = "INVOKE", target = "Ljava/lang/Class;getResource(Ljava/lang/String;)Ljava/net/URL;"), cancellable = true, locals = LocalCapture.CAPTURE_FAILHARD) + private void useCacheForExistence(ResourcePackType type, ResourceLocation location, CallbackInfoReturnable cir, String path) { + FileSystem fs = FILE_SYSTEMS_BY_PACK_TYPE.get(type); + cir.setReturnValue(Files.exists(fs.getPath(path))); } }