diff --git a/src/main/java/com/comandante/creeper/entity/EntityManager.java b/src/main/java/com/comandante/creeper/entity/EntityManager.java index db15d6b060f9b976dcb8d297b4830e62437c532f..e52f372d5fe8d1f718c468e10e38c69b3ef3ece9 100644 --- a/src/main/java/com/comandante/creeper/entity/EntityManager.java +++ b/src/main/java/com/comandante/creeper/entity/EntityManager.java @@ -8,12 +8,9 @@ import com.comandante.creeper.managers.SentryManager; import com.comandante.creeper.npc.Npc; import com.comandante.creeper.player.Player; import com.comandante.creeper.player.PlayerManager; -import com.comandante.creeper.server.ChannelUtils; import com.comandante.creeper.spells.Effect; import com.comandante.creeper.world.Room; import com.comandante.creeper.world.RoomManager; -import com.google.common.collect.Interner; -import com.google.common.collect.Interners; import org.apache.log4j.Logger; import org.mapdb.DB; import org.mapdb.HTreeMap; @@ -32,7 +29,7 @@ public class EntityManager { private final HTreeMap<String, Item> items; private final HTreeMap<String, Effect> effects; private final ConcurrentHashMap<String, CreeperEntity> entities = new ConcurrentHashMap<>(); - private final ExecutorService ticketRunnerService = Executors.newFixedThreadPool(20); + private final ExecutorService mainTickExecutorService = Executors.newFixedThreadPool(50); private final RoomManager roomManager; private final PlayerManager playerManager; private static final Logger log = Logger.getLogger(EntityManager.class); @@ -50,8 +47,12 @@ public class EntityManager { this.effects = db.createHashMap("effectsMap").valueSerializer(new EffectSerializer()).make(); } this.playerManager = playerManager; - ExecutorService tickService = Executors.newFixedThreadPool(1); - tickService.submit(new Ticker()); + ExecutorService tickOrchestratorService = Executors.newFixedThreadPool(5); + tickOrchestratorService.submit(new PlayerTicker()); + tickOrchestratorService.submit(new RoomTicker()); + tickOrchestratorService.submit(new NpcTicker()); + tickOrchestratorService.submit(new EntityTicker()); + tickOrchestratorService.submit(new EffectTicker()); } public ConcurrentHashMap<String, Npc> getNpcs() { @@ -105,7 +106,7 @@ public class EntityManager { public Item getItemEntity(String itemId) { Item item = items.get(itemId); if (item == null) { - return item; + return null; } return new Item(item); } @@ -113,16 +114,36 @@ public class EntityManager { public Effect getEffectEntity(String effectId) { Effect effect = effects.get(effectId); if (effect == null) { - return effect; + return null; } return new Effect(effect); } - class Ticker implements Runnable { - - private final com.codahale.metrics.Timer ticktime = Main.metrics.timer(name(EntityManager.class, "tick_time")); + class PlayerTicker implements Runnable { + private final com.codahale.metrics.Timer ticktime = Main.metrics.timer(name(EntityManager.class, "player_tick_time")); + @Override + public void run() { + while (true) { + try { + final com.codahale.metrics.Timer.Context context = ticktime.time(); + Iterator<Map.Entry<String, Player>> players = playerManager.getPlayers(); + while (players.hasNext()) { + Map.Entry<String, Player> next = players.next(); + mainTickExecutorService.submit(next.getValue()); + } + context.stop(); + Thread.sleep(500); + } catch (Exception e) { + log.error("Problem with player ticker!", e); + SentryManager.logSentry(this.getClass(), e, "Problem with player ticker!"); + } + } + } + } + class RoomTicker implements Runnable { + private final com.codahale.metrics.Timer ticktime = Main.metrics.timer(name(EntityManager.class, "room_tick_time")); @Override public void run() { while (true) { @@ -131,27 +152,73 @@ public class EntityManager { Iterator<Map.Entry<Integer, Room>> rooms = roomManager.getRooms(); while (rooms.hasNext()) { Map.Entry<Integer, Room> next = rooms.next(); - ticketRunnerService.submit(next.getValue()); - } - Iterator<Map.Entry<String, Player>> players = playerManager.getPlayers(); - while (players.hasNext()) { - Map.Entry<String, Player> next = players.next(); - ticketRunnerService.submit(next.getValue()); + mainTickExecutorService.submit(next.getValue()); } + context.stop(); + Thread.sleep(500); + } catch (Exception e) { + log.error("Problem with room ticker!", e); + SentryManager.logSentry(this.getClass(), e, "Problem with room ticker!"); + } + } + } + } + + class NpcTicker implements Runnable { + private final com.codahale.metrics.Timer ticktime = Main.metrics.timer(name(EntityManager.class, "npc_tick_time")); + @Override + public void run() { + while (true) { + try { + final com.codahale.metrics.Timer.Context context = ticktime.time(); for (Map.Entry<String, Npc> next : npcs.entrySet()) { - ticketRunnerService.submit(next.getValue()); + mainTickExecutorService.submit(next.getValue()); } + context.stop(); + Thread.sleep(500); + } catch (Exception e) { + log.error("Problem with npc ticker!", e); + SentryManager.logSentry(this.getClass(), e, "Problem with npc ticker!"); + } + } + } + } + + class EntityTicker implements Runnable { + private final com.codahale.metrics.Timer ticktime = Main.metrics.timer(name(EntityManager.class, "entity_tick_time")); + @Override + public void run() { + while (true) { + try { + final com.codahale.metrics.Timer.Context context = ticktime.time(); for (Map.Entry<String, CreeperEntity> next : entities.entrySet()) { - ticketRunnerService.submit(next.getValue()); + mainTickExecutorService.submit(next.getValue()); } + context.stop(); + Thread.sleep(500); + } catch (Exception e) { + log.error("Problem with entity ticker!", e); + SentryManager.logSentry(this.getClass(), e, "Problem with entity ticker!"); + } + } + } + } + + class EffectTicker implements Runnable { + private final com.codahale.metrics.Timer ticktime = Main.metrics.timer(name(EntityManager.class, "effect_tick_time")); + @Override + public void run() { + while (true) { + try { + final com.codahale.metrics.Timer.Context context = ticktime.time(); for (Map.Entry<String, Effect> next : effects.entrySet()) { - ticketRunnerService.submit(next.getValue()); + mainTickExecutorService.submit(next.getValue()); } context.stop(); Thread.sleep(500); } catch (Exception e) { - log.error("Problem with ticker!", e); - SentryManager.logSentry(this.getClass(), e, "Problem with ticker!"); + log.error("Problem with effect ticker!", e); + SentryManager.logSentry(this.getClass(), e, "Problem with effect ticker!"); } } }