From f504424fd2cd4f48bd78afd12186251a5ac7f4e5 Mon Sep 17 00:00:00 2001 From: "Luis C.M" <42545778+c0508383@users.noreply.github.com> Date: Wed, 18 Jan 2023 21:28:16 -0600 Subject: [PATCH] Added a declared field reflection cache, improving render times for NPC models that have many fields. --- .../npcs/client/ClientEventHandler.java | 5 ++- .../noppes/npcs/mixin/MixinModelRenderer.java | 37 ++++++++++++++----- 2 files changed, 31 insertions(+), 11 deletions(-) diff --git a/src/main/java/noppes/npcs/client/ClientEventHandler.java b/src/main/java/noppes/npcs/client/ClientEventHandler.java index 3a6db2a91..97f5c31e8 100644 --- a/src/main/java/noppes/npcs/client/ClientEventHandler.java +++ b/src/main/java/noppes/npcs/client/ClientEventHandler.java @@ -14,6 +14,7 @@ import noppes.npcs.constants.EnumAnimationPart; import noppes.npcs.controllers.data.Animation; import noppes.npcs.entity.EntityNPCInterface; +import java.lang.reflect.Field; import java.util.ArrayList; import java.util.HashMap; import java.util.Map; @@ -24,10 +25,12 @@ public class ClientEventHandler { public static float partialHandTicks; public static float partialRenderTick; + public static RendererLivingEntity renderer; + public static EntityNPCInterface renderingNpc; public static EntityPlayer renderingPlayer; public static HashMap partNames = new HashMap<>(); - public static RendererLivingEntity renderer; + public static HashMap,Field[]> declaredFieldCache = new HashMap<>(); @SubscribeEvent public void onMouse(MouseEvent event) { diff --git a/src/main/java/noppes/npcs/mixin/MixinModelRenderer.java b/src/main/java/noppes/npcs/mixin/MixinModelRenderer.java index f8e3afd2d..bf05740ca 100644 --- a/src/main/java/noppes/npcs/mixin/MixinModelRenderer.java +++ b/src/main/java/noppes/npcs/mixin/MixinModelRenderer.java @@ -258,15 +258,26 @@ public abstract class MixinModelRenderer { try { Class ModelBipedBody = Class.forName("JinRyuu.JRMCore.entity.ModelBipedBody"); - Object m = renderer.baseModel; - Set> entrySet = ClientEventHandler.partNames.entrySet(); - for (Map.Entry entry : entrySet) { - for (String s : entry.getValue()) { - try { - if (renderer == ModelBipedBody.getField(s).get(m)) { - return entry.getKey(); - } - } catch (NoSuchFieldException | SecurityException | IllegalAccessException ignored) {} + Object model = renderer.baseModel; + Field[] declared; + if (ClientEventHandler.declaredFieldCache.containsKey(ModelBipedBody)) { + declared = ClientEventHandler.declaredFieldCache.get(ModelBipedBody); + } else { + declared = ModelBipedBody.getDeclaredFields(); + ClientEventHandler.declaredFieldCache.put(ModelBipedBody,declared); + } + Set> entrySet = ClientEventHandler.partNames.entrySet(); + for (Field f : declared) { + f.setAccessible(true); + for (Map.Entry entry : entrySet) { + String[] names = entry.getValue(); + for (String partName : names) { + try { + if (partName.equals(f.getName()) && renderer == f.get(model)) { + return entry.getKey(); + } + } catch (IllegalAccessException ignored) {} + } } } } catch (ClassNotFoundException ignored) {} @@ -314,7 +325,13 @@ public abstract class MixinModelRenderer { Set> entrySet = ClientEventHandler.partNames.entrySet(); while (RenderClass != Object.class) { - Field[] declared = RenderClass.getDeclaredFields(); + Field[] declared; + if (ClientEventHandler.declaredFieldCache.containsKey(RenderClass)) { + declared = ClientEventHandler.declaredFieldCache.get(RenderClass); + } else { + declared = RenderClass.getDeclaredFields(); + ClientEventHandler.declaredFieldCache.put(RenderClass,declared); + } for (Field f : declared) { f.setAccessible(true); for (Map.Entry entry : entrySet) {