From 8c1e2600d21d9176640a3d6ee7f62c13e23a0902 Mon Sep 17 00:00:00 2001 From: Esmorall Date: Mon, 16 Dec 2019 21:47:56 -0300 Subject: [PATCH] Improve performance of entity tick manager --- .../entitytrackerfixer/v1_14_R1/NMSHandler.java | 4 +++- .../v1_14_R1/entityTick/EntityTickManager.java | 16 +++++++--------- .../entityTick/EntityTickWorldCache.java | 11 +++++++++-- .../entitytrackerfixer/v1_15_R1/NMSHandler.java | 4 +++- .../v1_15_R1/entityTick/EntityTickManager.java | 16 +++++++--------- .../entityTick/EntityTickWorldCache.java | 11 +++++++++-- 6 files changed, 38 insertions(+), 24 deletions(-) diff --git a/EntityTrackerFixer/src/net/minemora/entitytrackerfixer/v1_14_R1/NMSHandler.java b/EntityTrackerFixer/src/net/minemora/entitytrackerfixer/v1_14_R1/NMSHandler.java index b078683..31d45a7 100644 --- a/EntityTrackerFixer/src/net/minemora/entitytrackerfixer/v1_14_R1/NMSHandler.java +++ b/EntityTrackerFixer/src/net/minemora/entitytrackerfixer/v1_14_R1/NMSHandler.java @@ -1,6 +1,7 @@ package net.minemora.entitytrackerfixer.v1_14_R1; import org.bukkit.Bukkit; +import org.bukkit.craftbukkit.v1_14_R1.CraftWorld; import org.bukkit.plugin.Plugin; import net.minemora.entitytrackerfixer.config.ConfigMain; @@ -24,7 +25,8 @@ public class NMSHandler implements NMS { if(Bukkit.getWorld(worldName) == null) { continue; } - EntityTickManager.getInstance().getCache().put(worldName, new EntityTickWorldCache(worldName)); + EntityTickManager.getInstance().getCache().put(worldName, + new EntityTickWorldCache(((CraftWorld)Bukkit.getWorld(worldName)).getHandle())); } } diff --git a/EntityTrackerFixer/src/net/minemora/entitytrackerfixer/v1_14_R1/entityTick/EntityTickManager.java b/EntityTrackerFixer/src/net/minemora/entitytrackerfixer/v1_14_R1/entityTick/EntityTickManager.java index d641612..04874c4 100644 --- a/EntityTrackerFixer/src/net/minemora/entitytrackerfixer/v1_14_R1/entityTick/EntityTickManager.java +++ b/EntityTrackerFixer/src/net/minemora/entitytrackerfixer/v1_14_R1/entityTick/EntityTickManager.java @@ -5,8 +5,6 @@ import java.util.HashMap; import java.util.Map; import java.util.concurrent.atomic.AtomicInteger; -import org.bukkit.Bukkit; -import org.bukkit.craftbukkit.v1_14_R1.CraftWorld; import org.bukkit.plugin.Plugin; import org.bukkit.scheduler.BukkitRunnable; @@ -17,14 +15,12 @@ import net.minemora.entitytrackerfixer.v1_14_R1.tasks.UntrackerTask; public class EntityTickManager extends BukkitRunnable { - private static Field tickingField; private static Field tickingEntitiesField; private static Field entityCount; static { try { tickingEntitiesField = ReflectionUtils.getClassPrivateField(WorldServer.class, "tickingEntities"); - tickingField = ReflectionUtils.getClassPrivateField(WorldServer.class, "ticking"); entityCount = ReflectionUtils.getClassPrivateField(net.minecraft.server.v1_14_R1.Entity.class, "entityCount"); } catch (NoSuchFieldException | SecurityException | IllegalArgumentException | IllegalAccessException e) { e.printStackTrace(); @@ -36,7 +32,7 @@ public class EntityTickManager extends BukkitRunnable { private Map cache = new HashMap<>(); private EntityTickManager(Plugin plugin) { - this.runTaskTimer(plugin, 41, 41); + this.runTaskTimer(plugin, 61, 61); } public void disableTicking(int id, String worldName) { @@ -55,13 +51,15 @@ public class EntityTickManager extends BukkitRunnable { return; } for(String worldName : cache.keySet()) { - WorldServer ws = ((CraftWorld)Bukkit.getWorld(worldName)).getHandle(); + EntityTickWorldCache ewc = cache.get(worldName); + WorldServer ws = ewc.getWorldServer(); + if(ws.b()) { + continue; + } try { - if(tickingEntitiesField.getBoolean(ws) || tickingField.getBoolean(ws)) { - //System.out.println("ticking"); + if(tickingEntitiesField.getBoolean(ws)) { continue; } - EntityTickWorldCache ewc = cache.get(worldName); //System.out.println("unticking: " + ewc.getToUntick().size() + " entities, ticking again: " + ewc.getToTick().size() + " entities"); for(int i : ewc.getToUntick()) { ws.entitiesById.remove(i); diff --git a/EntityTrackerFixer/src/net/minemora/entitytrackerfixer/v1_14_R1/entityTick/EntityTickWorldCache.java b/EntityTrackerFixer/src/net/minemora/entitytrackerfixer/v1_14_R1/entityTick/EntityTickWorldCache.java index b14c224..c097cf5 100644 --- a/EntityTrackerFixer/src/net/minemora/entitytrackerfixer/v1_14_R1/entityTick/EntityTickWorldCache.java +++ b/EntityTrackerFixer/src/net/minemora/entitytrackerfixer/v1_14_R1/entityTick/EntityTickWorldCache.java @@ -5,15 +5,19 @@ import java.util.HashSet; import java.util.Map; import java.util.Set; +import net.minecraft.server.v1_14_R1.WorldServer; + public class EntityTickWorldCache { private String worldName; + private WorldServer worldServer; private Set toUntick = new HashSet<>(); private Map toTick = new HashMap<>(); - public EntityTickWorldCache(String worldName) { - this.worldName = worldName; + public EntityTickWorldCache(WorldServer worldServer) { + this.worldName = worldServer.getWorld().getName(); + this.worldServer = worldServer; } public Set getToUntick() { @@ -28,4 +32,7 @@ public class EntityTickWorldCache { return worldName; } + public WorldServer getWorldServer() { + return worldServer; + } } diff --git a/EntityTrackerFixer/src/net/minemora/entitytrackerfixer/v1_15_R1/NMSHandler.java b/EntityTrackerFixer/src/net/minemora/entitytrackerfixer/v1_15_R1/NMSHandler.java index ea83998..f6332ef 100644 --- a/EntityTrackerFixer/src/net/minemora/entitytrackerfixer/v1_15_R1/NMSHandler.java +++ b/EntityTrackerFixer/src/net/minemora/entitytrackerfixer/v1_15_R1/NMSHandler.java @@ -1,6 +1,7 @@ package net.minemora.entitytrackerfixer.v1_15_R1; import org.bukkit.Bukkit; +import org.bukkit.craftbukkit.v1_15_R1.CraftWorld; import org.bukkit.plugin.Plugin; import net.minemora.entitytrackerfixer.config.ConfigMain; @@ -24,7 +25,8 @@ public class NMSHandler implements NMS { if(Bukkit.getWorld(worldName) == null) { continue; } - EntityTickManager.getInstance().getCache().put(worldName, new EntityTickWorldCache(worldName)); + EntityTickManager.getInstance().getCache().put(worldName, + new EntityTickWorldCache(((CraftWorld)Bukkit.getWorld(worldName)).getHandle())); } } diff --git a/EntityTrackerFixer/src/net/minemora/entitytrackerfixer/v1_15_R1/entityTick/EntityTickManager.java b/EntityTrackerFixer/src/net/minemora/entitytrackerfixer/v1_15_R1/entityTick/EntityTickManager.java index bb49b8d..c4d4b5f 100644 --- a/EntityTrackerFixer/src/net/minemora/entitytrackerfixer/v1_15_R1/entityTick/EntityTickManager.java +++ b/EntityTrackerFixer/src/net/minemora/entitytrackerfixer/v1_15_R1/entityTick/EntityTickManager.java @@ -5,8 +5,6 @@ import java.util.HashMap; import java.util.Map; import java.util.concurrent.atomic.AtomicInteger; -import org.bukkit.Bukkit; -import org.bukkit.craftbukkit.v1_15_R1.CraftWorld; import org.bukkit.plugin.Plugin; import org.bukkit.scheduler.BukkitRunnable; @@ -17,14 +15,12 @@ import net.minemora.entitytrackerfixer.v1_15_R1.tasks.UntrackerTask; public class EntityTickManager extends BukkitRunnable { - private static Field tickingField; private static Field tickingEntitiesField; private static Field entityCount; static { try { tickingEntitiesField = ReflectionUtils.getClassPrivateField(WorldServer.class, "tickingEntities"); - tickingField = ReflectionUtils.getClassPrivateField(WorldServer.class, "ticking"); entityCount = ReflectionUtils.getClassPrivateField(net.minecraft.server.v1_15_R1.Entity.class, "entityCount"); } catch (NoSuchFieldException | SecurityException | IllegalArgumentException | IllegalAccessException e) { e.printStackTrace(); @@ -36,7 +32,7 @@ public class EntityTickManager extends BukkitRunnable { private Map cache = new HashMap<>(); private EntityTickManager(Plugin plugin) { - this.runTaskTimer(plugin, 41, 41); + this.runTaskTimer(plugin, 61, 61); } public void disableTicking(int id, String worldName) { @@ -55,13 +51,15 @@ public class EntityTickManager extends BukkitRunnable { return; } for(String worldName : cache.keySet()) { - WorldServer ws = ((CraftWorld)Bukkit.getWorld(worldName)).getHandle(); + EntityTickWorldCache ewc = cache.get(worldName); + WorldServer ws = ewc.getWorldServer(); + if(ws.b()) { + continue; + } try { - if(tickingEntitiesField.getBoolean(ws) || tickingField.getBoolean(ws)) { - //System.out.println("ticking"); + if(tickingEntitiesField.getBoolean(ws)) { continue; } - EntityTickWorldCache ewc = cache.get(worldName); //System.out.println("unticking: " + ewc.getToUntick().size() + " entities, ticking again: " + ewc.getToTick().size() + " entities"); for(int i : ewc.getToUntick()) { ws.entitiesById.remove(i); diff --git a/EntityTrackerFixer/src/net/minemora/entitytrackerfixer/v1_15_R1/entityTick/EntityTickWorldCache.java b/EntityTrackerFixer/src/net/minemora/entitytrackerfixer/v1_15_R1/entityTick/EntityTickWorldCache.java index 8d98639..7fd4880 100644 --- a/EntityTrackerFixer/src/net/minemora/entitytrackerfixer/v1_15_R1/entityTick/EntityTickWorldCache.java +++ b/EntityTrackerFixer/src/net/minemora/entitytrackerfixer/v1_15_R1/entityTick/EntityTickWorldCache.java @@ -5,15 +5,19 @@ import java.util.HashSet; import java.util.Map; import java.util.Set; +import net.minecraft.server.v1_15_R1.WorldServer; + public class EntityTickWorldCache { private String worldName; + private WorldServer worldServer; private Set toUntick = new HashSet<>(); private Map toTick = new HashMap<>(); - public EntityTickWorldCache(String worldName) { - this.worldName = worldName; + public EntityTickWorldCache(WorldServer worldServer) { + this.worldName = worldServer.getWorld().getName(); + this.worldServer = worldServer; } public Set getToUntick() { @@ -28,4 +32,7 @@ public class EntityTickWorldCache { return worldName; } + public WorldServer getWorldServer() { + return worldServer; + } }