From e859ce8eb6b7b05c79179becf67df32e3efc4ad5 Mon Sep 17 00:00:00 2001 From: embeddedt <42941056+embeddedt@users.noreply.github.com> Date: Sun, 5 Nov 2023 21:22:17 -0500 Subject: [PATCH] Avoid slow getHash call when retrieving skins Co-authored-by: Fury_Phoenix <64714532+Phoenix-Starlight@users.noreply.github.com> --- .../SkinManagerMixin.java | 37 +++++++++++++++++++ 1 file changed, 37 insertions(+) create mode 100644 common/src/main/java/org/embeddedt/modernfix/common/mixin/perf/cache_profile_texture_url/SkinManagerMixin.java diff --git a/common/src/main/java/org/embeddedt/modernfix/common/mixin/perf/cache_profile_texture_url/SkinManagerMixin.java b/common/src/main/java/org/embeddedt/modernfix/common/mixin/perf/cache_profile_texture_url/SkinManagerMixin.java new file mode 100644 index 00000000..2b4047d6 --- /dev/null +++ b/common/src/main/java/org/embeddedt/modernfix/common/mixin/perf/cache_profile_texture_url/SkinManagerMixin.java @@ -0,0 +1,37 @@ +package org.embeddedt.modernfix.common.mixin.perf.cache_profile_texture_url; + +import com.google.common.cache.Cache; +import com.google.common.cache.CacheBuilder; +import com.mojang.authlib.minecraft.MinecraftProfileTexture; +import net.minecraft.client.resources.SkinManager; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Unique; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Redirect; + +import java.util.concurrent.ExecutionException; +import java.util.concurrent.TimeUnit; + +@Mixin(SkinManager.class) +public class SkinManagerMixin { + @Unique + private final Cache mfix$hashCache = CacheBuilder.newBuilder() + .expireAfterAccess(60, TimeUnit.SECONDS) + .concurrencyLevel(1) + .build(); + + @Redirect(method = "registerTexture(Lcom/mojang/authlib/minecraft/MinecraftProfileTexture;Lcom/mojang/authlib/minecraft/MinecraftProfileTexture$Type;Lnet/minecraft/client/resources/SkinManager$SkinTextureCallback;)Lnet/minecraft/resources/ResourceLocation;", + at = @At(value = "INVOKE", target = "Lcom/mojang/authlib/minecraft/MinecraftProfileTexture;getHash()Ljava/lang/String;", remap = false)) + private String useCachedHash(MinecraftProfileTexture texture) { + // avoid lambda allocation for common case + String hash = mfix$hashCache.getIfPresent(texture); + if(hash != null) + return hash; + + try { + return mfix$hashCache.get(texture, texture::getHash); + } catch (ExecutionException e) { + throw new RuntimeException(e); + } + } +}