From f079823bfee2192c721f33c2be9c5fbd326a2280 Mon Sep 17 00:00:00 2001 From: TheBrokenRail Date: Mon, 27 Jul 2020 14:06:46 -0400 Subject: [PATCH] Optimize --- .../block/entity/BlockBreakerBlockEntity.java | 2 +- .../entity/DefensiveLaserBlockEntity.java | 2 +- .../block/entity/EnergonLightBlockEntity.java | 2 +- .../entity/HolographicSkyBlockEntity.java | 2 +- .../block/entity/SolarPanelBlockEntity.java | 1 - .../block/entity/SwitchBlockEntity.java | 2 +- .../PassiveBatteryControllerBlockEntity.java | 27 ++------ .../ForcefieldProjectorBlockEntity.java | 2 +- .../component/NetworkComponent.java | 68 +++++++++++++++++-- .../core/EnergyProviderBlockEntity.java | 9 ++- .../core/EnergyReceiverBlockEntity.java | 11 +-- .../energy/core/util/Action.java | 10 ++- .../energy/core/util/EnergyTickable.java | 1 + .../energy/core/util/EnergyTicker.java | 28 ++++++-- 14 files changed, 118 insertions(+), 49 deletions(-) diff --git a/src/main/java/com/thebrokenrail/energonrelics/block/entity/BlockBreakerBlockEntity.java b/src/main/java/com/thebrokenrail/energonrelics/block/entity/BlockBreakerBlockEntity.java index c25ea99..3afadda 100644 --- a/src/main/java/com/thebrokenrail/energonrelics/block/entity/BlockBreakerBlockEntity.java +++ b/src/main/java/com/thebrokenrail/energonrelics/block/entity/BlockBreakerBlockEntity.java @@ -39,7 +39,7 @@ public class BlockBreakerBlockEntity extends EnergyReceiverBlockEntity { } @Override - protected void tickEnergy() { + protected void energyTick() { addAction(Action.createBlockStatePropertyAction(HardcodedConfig.BLOCK_BREAKER_ENERGY_REQUIRED_IDLE, BlockBreakerBlock.POWERED, true, false)); if (getCachedState().get(BlockBreakerBlock.POWERED)) { diff --git a/src/main/java/com/thebrokenrail/energonrelics/block/entity/DefensiveLaserBlockEntity.java b/src/main/java/com/thebrokenrail/energonrelics/block/entity/DefensiveLaserBlockEntity.java index eab8792..f477195 100644 --- a/src/main/java/com/thebrokenrail/energonrelics/block/entity/DefensiveLaserBlockEntity.java +++ b/src/main/java/com/thebrokenrail/energonrelics/block/entity/DefensiveLaserBlockEntity.java @@ -220,7 +220,7 @@ public class DefensiveLaserBlockEntity extends EnergyReceiverBlockEntity { } @Override - protected void tickEnergy() { + protected void energyTick() { assert getWorld() != null; addAction(Action.createBlockStatePropertyAction(HardcodedConfig.DEFENSIVE_LASER_IDLE_ENERGY_REQUIRED, DefensiveLaserBlock.POWERED, true, false)); if (getCachedState().get(DefensiveLaserBlock.POWERED)) { diff --git a/src/main/java/com/thebrokenrail/energonrelics/block/entity/EnergonLightBlockEntity.java b/src/main/java/com/thebrokenrail/energonrelics/block/entity/EnergonLightBlockEntity.java index 0ee5ebe..04a7642 100644 --- a/src/main/java/com/thebrokenrail/energonrelics/block/entity/EnergonLightBlockEntity.java +++ b/src/main/java/com/thebrokenrail/energonrelics/block/entity/EnergonLightBlockEntity.java @@ -12,7 +12,7 @@ public class EnergonLightBlockEntity extends EnergyReceiverBlockEntity { } @Override - protected void tickEnergy() { + protected void energyTick() { addAction(Action.createBlockStatePropertyAction(HardcodedConfig.ENERGON_LIGHT_ENERGY_REQUIRED, EnergonLightBlock.POWERED, true, false)); } } diff --git a/src/main/java/com/thebrokenrail/energonrelics/block/entity/HolographicSkyBlockEntity.java b/src/main/java/com/thebrokenrail/energonrelics/block/entity/HolographicSkyBlockEntity.java index 27b3c4a..d623f19 100644 --- a/src/main/java/com/thebrokenrail/energonrelics/block/entity/HolographicSkyBlockEntity.java +++ b/src/main/java/com/thebrokenrail/energonrelics/block/entity/HolographicSkyBlockEntity.java @@ -18,7 +18,7 @@ public class HolographicSkyBlockEntity extends EnergyReceiverBlockEntity { } @Override - protected void tickEnergy() { + protected void energyTick() { addAction(Action.createBlockStatePropertyAction(HardcodedConfig.HOLOGRAPHIC_SKY_ENERGY_REQUIRED, HolographicSkyBlock.POWERED, true, false)); assert getWorld() != null; diff --git a/src/main/java/com/thebrokenrail/energonrelics/block/entity/SolarPanelBlockEntity.java b/src/main/java/com/thebrokenrail/energonrelics/block/entity/SolarPanelBlockEntity.java index 83adfc0..f83f96c 100644 --- a/src/main/java/com/thebrokenrail/energonrelics/block/entity/SolarPanelBlockEntity.java +++ b/src/main/java/com/thebrokenrail/energonrelics/block/entity/SolarPanelBlockEntity.java @@ -1,7 +1,6 @@ package com.thebrokenrail.energonrelics.block.entity; import com.thebrokenrail.energonrelics.config.HardcodedConfig; -import com.thebrokenrail.energonrelics.energy.core.EnergyProviderBlockEntity; import com.thebrokenrail.energonrelics.energy.core.util.EnergyTickable; import com.thebrokenrail.energonrelics.energy.helper.EnergyGeneratorBlockEntity; import net.minecraft.block.entity.BlockEntityType; diff --git a/src/main/java/com/thebrokenrail/energonrelics/block/entity/SwitchBlockEntity.java b/src/main/java/com/thebrokenrail/energonrelics/block/entity/SwitchBlockEntity.java index ce7f193..1304c9c 100644 --- a/src/main/java/com/thebrokenrail/energonrelics/block/entity/SwitchBlockEntity.java +++ b/src/main/java/com/thebrokenrail/energonrelics/block/entity/SwitchBlockEntity.java @@ -10,7 +10,7 @@ public class SwitchBlockEntity extends EnergyReceiverBlockEntity { } @Override - protected void tickEnergy() { + protected void energyTick() { } @Override diff --git a/src/main/java/com/thebrokenrail/energonrelics/block/entity/battery/PassiveBatteryControllerBlockEntity.java b/src/main/java/com/thebrokenrail/energonrelics/block/entity/battery/PassiveBatteryControllerBlockEntity.java index 1fe83c7..c02a289 100644 --- a/src/main/java/com/thebrokenrail/energonrelics/block/entity/battery/PassiveBatteryControllerBlockEntity.java +++ b/src/main/java/com/thebrokenrail/energonrelics/block/entity/battery/PassiveBatteryControllerBlockEntity.java @@ -11,7 +11,6 @@ import net.minecraft.block.entity.BlockEntity; import net.minecraft.block.entity.BlockEntityType; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.Direction; -import net.minecraft.world.World; public class PassiveBatteryControllerBlockEntity extends EnergyReceiverBlockEntity implements EnergyGenerator { public PassiveBatteryControllerBlockEntity(BlockEntityType type) { @@ -19,12 +18,10 @@ public class PassiveBatteryControllerBlockEntity extends EnergyReceiverBlockEnti } private static class UnlimitedAction implements Action.PropagatedAction { - private final World world; - private final BlockPos pos; + private final PassiveBatteryControllerBlockEntity battery; - private UnlimitedAction(World world, BlockPos pos) { - this.world = world; - this.pos = pos; + private UnlimitedAction(PassiveBatteryControllerBlockEntity battery) { + this.battery = battery; } @Override @@ -38,11 +35,7 @@ public class PassiveBatteryControllerBlockEntity extends EnergyReceiverBlockEnti @Override public void pay(long amount) { - BlockEntity entity = world.getBlockEntity(pos); - if (entity instanceof PassiveBatteryControllerBlockEntity) { - PassiveBatteryControllerBlockEntity battery = (PassiveBatteryControllerBlockEntity) entity; - battery.setEnergy(battery.getEnergy() + amount); - } + battery.setEnergy(battery.getEnergy() + amount); } @Override @@ -51,18 +44,12 @@ public class PassiveBatteryControllerBlockEntity extends EnergyReceiverBlockEnti } @Override - protected void tickEnergy() { + protected void energyTick() { long charge = HardcodedConfig.BATTERY_CHARGE_RATE; if (!isActiveController()) { - addAction(new Action(charge, (world, pos, state) -> { - BlockEntity entity = world.getBlockEntity(pos); - if (entity instanceof PassiveBatteryControllerBlockEntity) { - PassiveBatteryControllerBlockEntity battery = (PassiveBatteryControllerBlockEntity) entity; - battery.setEnergy(battery.getEnergy() + charge); - } - }, (world, pos, state) -> {})); + addAction(new Action(charge, (world, pos, state) -> PassiveBatteryControllerBlockEntity.this.setEnergy(PassiveBatteryControllerBlockEntity.this.getEnergy() + charge), (world, pos, state) -> {})); } else { - propagateAction(new UnlimitedAction(getWorld(), getPos())); + propagateAction(new UnlimitedAction(this)); } } diff --git a/src/main/java/com/thebrokenrail/energonrelics/block/entity/forcefield/ForcefieldProjectorBlockEntity.java b/src/main/java/com/thebrokenrail/energonrelics/block/entity/forcefield/ForcefieldProjectorBlockEntity.java index 4959c11..109f89d 100644 --- a/src/main/java/com/thebrokenrail/energonrelics/block/entity/forcefield/ForcefieldProjectorBlockEntity.java +++ b/src/main/java/com/thebrokenrail/energonrelics/block/entity/forcefield/ForcefieldProjectorBlockEntity.java @@ -17,7 +17,7 @@ public class ForcefieldProjectorBlockEntity extends EnergyReceiverBlockEntity { } @Override - protected void tickEnergy() { + protected void energyTick() { assert getWorld() != null; addAction(Action.createBlockStatePropertyAction(HardcodedConfig.FORCEFIELD_PROJECTOR_ENERGY_REQUIRED, ForcefieldProjectorBlock.POWERED, true, false)); diff --git a/src/main/java/com/thebrokenrail/energonrelics/component/NetworkComponent.java b/src/main/java/com/thebrokenrail/energonrelics/component/NetworkComponent.java index dfda189..1a88b62 100644 --- a/src/main/java/com/thebrokenrail/energonrelics/component/NetworkComponent.java +++ b/src/main/java/com/thebrokenrail/energonrelics/component/NetworkComponent.java @@ -17,8 +17,10 @@ import net.minecraft.world.World; import java.util.ArrayList; import java.util.Collections; +import java.util.HashMap; import java.util.Iterator; import java.util.List; +import java.util.Map; import java.util.Objects; public class NetworkComponent extends PersistentState { @@ -90,12 +92,12 @@ public class NetworkComponent extends PersistentState { } private Entry getOrCreate(int id) { - markDirty(); for (Entry entry : networks) { if (entry.id == id) { return entry; } } + markDirty(); Entry entry = new Entry(); entry.id = id; entry.sources.clear(); @@ -107,13 +109,47 @@ public class NetworkComponent extends PersistentState { return Objects.requireNonNull(world.getServer().getWorld(World.OVERWORLD)).getPersistentStateManager().getOrCreate(NetworkComponent::new, EnergonRelics.NAMESPACE); } - public List getSourcePos(int id) { + public List getSourcesPos(int id) { Entry entry = getOrCreate(id); return entry.sources; } - public List getSource(World world, int id) { - List sources = getSourcePos(id); + private final Map> cache = new HashMap<>(); + + private List getSourcesFromCache(World world, int id) { + if (cache.containsKey(id)) { + world.getProfiler().push("getSourcesFromCache"); + + List list = cache.get(id); + + boolean valid = true; + for (EnergyProviderBlockEntity entity : list) { + if (!entity.isNetwork(id) || entity.isRemoved()) { + valid = false; + break; + } + } + + world.getProfiler().pop(); + + if (valid) { + Collections.shuffle(list); + + return list; + } else { + cache.remove(id); + + return null; + } + } else { + return null; + } + } + + private List getSourcesFromCacheMiss(World world, int id) { + world.getProfiler().push("getSourcesFromCacheMiss"); + + List sources = getSourcesPos(id); List valid = new ArrayList<>(); Iterator iterator = sources.iterator(); List providers = new ArrayList<>(); @@ -138,9 +174,33 @@ public class NetworkComponent extends PersistentState { markDirty(); } Collections.shuffle(providers); + + cache.put(id, providers); + + world.getProfiler().pop(); return providers; } + public List getSources(World world, int id) { + world.getProfiler().push("getSources"); + + List result; + + List cacheResult = getSourcesFromCache(world, id); + if (cacheResult != null) { + result = cacheResult; + } else { + result = getSourcesFromCacheMiss(world, id); + } + + world.getProfiler().pop(); + return result; + } + + public void clearCache() { + cache.clear(); + } + public void addSource(int id, BlockPosWithDimension pos) { Entry entry = getOrCreate(id); if (!entry.sources.contains(pos)) { diff --git a/src/main/java/com/thebrokenrail/energonrelics/energy/core/EnergyProviderBlockEntity.java b/src/main/java/com/thebrokenrail/energonrelics/energy/core/EnergyProviderBlockEntity.java index c94b6f9..faaa695 100644 --- a/src/main/java/com/thebrokenrail/energonrelics/energy/core/EnergyProviderBlockEntity.java +++ b/src/main/java/com/thebrokenrail/energonrelics/energy/core/EnergyProviderBlockEntity.java @@ -87,9 +87,9 @@ public class EnergyProviderBlockEntity extends BlockEntity implements BlockEntit @Override public List startTick() { - if (isEnergyProvider()) { + if (isEnergyProvider() && stack.getItem() == EnergonRelics.NETWORK_CHIP_ITEM) { NetworkComponent component = NetworkComponent.getInstance((ServerWorld) Objects.requireNonNull(getWorld())); - List sources = component.getSourcePos(EnergonRelics.NETWORK_CHIP_ITEM.getID(stack)); + List sources = component.getSourcesPos(EnergonRelics.NETWORK_CHIP_ITEM.getID(stack)); if (!sources.contains(new BlockPosWithDimension(getPos(), getWorld().getRegistryKey()))) { takeStack(getWorld()); } @@ -150,4 +150,9 @@ public class EnergyProviderBlockEntity extends BlockEntity implements BlockEntit sync(); } } + + @Override + public String getID() { + return String.valueOf(BlockEntityType.getId(getType())); + } } diff --git a/src/main/java/com/thebrokenrail/energonrelics/energy/core/EnergyReceiverBlockEntity.java b/src/main/java/com/thebrokenrail/energonrelics/energy/core/EnergyReceiverBlockEntity.java index 480199c..6d09573 100644 --- a/src/main/java/com/thebrokenrail/energonrelics/energy/core/EnergyReceiverBlockEntity.java +++ b/src/main/java/com/thebrokenrail/energonrelics/energy/core/EnergyReceiverBlockEntity.java @@ -45,7 +45,7 @@ public abstract class EnergyReceiverBlockEntity extends EnergyProviderBlockEntit } protected void addAction(Action action) { - propagateAction(new Action.PropagatedActionImpl(action, getWorld(), getPos(), getCachedState().getBlock())); + propagateAction(new Action.PropagatedActionImpl(action, getWorld(), getPos(), getCachedState())); } @Override @@ -60,7 +60,7 @@ public abstract class EnergyReceiverBlockEntity extends EnergyProviderBlockEntit providers.clear(); for (int network : networks) { - List potentialProviders = component.getSource(world, network); + List potentialProviders = component.getSources(world, network); for (EnergyProviderBlockEntity provider : potentialProviders) { if (provider.getRegistryKey().equals(getWorld().getRegistryKey())) { Vec3d pos = new Vec3d(getPos().getX() + 0.5d, getPos().getY() + 0.5d, getPos().getZ() + 0.5d); @@ -82,7 +82,10 @@ public abstract class EnergyReceiverBlockEntity extends EnergyProviderBlockEntit @Override public void logicTick() { super.logicTick(); - tickEnergy(); + assert getWorld() != null; + getWorld().getProfiler().push("energyTick"); + energyTick(); + getWorld().getProfiler().pop(); } public long getTotalCost() { @@ -121,7 +124,7 @@ public abstract class EnergyReceiverBlockEntity extends EnergyProviderBlockEntit throw new UnsupportedOperationException(); } - protected abstract void tickEnergy(); + protected abstract void energyTick(); public void toggle(int network) { if (contains(network)) { diff --git a/src/main/java/com/thebrokenrail/energonrelics/energy/core/util/Action.java b/src/main/java/com/thebrokenrail/energonrelics/energy/core/util/Action.java index 9f0dc0c..764b183 100644 --- a/src/main/java/com/thebrokenrail/energonrelics/energy/core/util/Action.java +++ b/src/main/java/com/thebrokenrail/energonrelics/energy/core/util/Action.java @@ -1,6 +1,5 @@ package com.thebrokenrail.energonrelics.energy.core.util; -import net.minecraft.block.Block; import net.minecraft.block.BlockState; import net.minecraft.state.property.Property; import net.minecraft.util.math.BlockPos; @@ -44,16 +43,16 @@ public class Action { private final Action action; private final World world; private final BlockPos pos; - private final Block block; + private final BlockState state; private int expectedPayments = 1; private int payments = 0; private long amountPaid = 0; - public PropagatedActionImpl(Action action, World world, BlockPos pos, Block block) { + public PropagatedActionImpl(Action action, World world, BlockPos pos, BlockState state) { this.action = action; this.world = world; this.pos = pos; - this.block = block; + this.state = state; } @Override @@ -73,8 +72,7 @@ public class Action { public void pay(long amount) { amountPaid = amountPaid + amount; payments++; - BlockState state = world.getBlockState(pos); - if (state != null && state.getBlock() == block) { + if (state != null) { if (amountOwed() <= 0) { action.success.run(world, pos, state); } else if (payments >= expectedPayments) { diff --git a/src/main/java/com/thebrokenrail/energonrelics/energy/core/util/EnergyTickable.java b/src/main/java/com/thebrokenrail/energonrelics/energy/core/util/EnergyTickable.java index 8b006ac..10ddee3 100644 --- a/src/main/java/com/thebrokenrail/energonrelics/energy/core/util/EnergyTickable.java +++ b/src/main/java/com/thebrokenrail/energonrelics/energy/core/util/EnergyTickable.java @@ -5,4 +5,5 @@ import java.util.List; public interface EnergyTickable { List startTick(); void logicTick(); + String getID(); } diff --git a/src/main/java/com/thebrokenrail/energonrelics/energy/core/util/EnergyTicker.java b/src/main/java/com/thebrokenrail/energonrelics/energy/core/util/EnergyTicker.java index 2e2be63..70790e0 100644 --- a/src/main/java/com/thebrokenrail/energonrelics/energy/core/util/EnergyTicker.java +++ b/src/main/java/com/thebrokenrail/energonrelics/energy/core/util/EnergyTicker.java @@ -1,5 +1,7 @@ package com.thebrokenrail.energonrelics.energy.core.util; +import com.thebrokenrail.energonrelics.component.NetworkComponent; +import net.minecraft.server.world.ServerWorld; import net.minecraft.world.World; import java.util.ArrayList; @@ -16,15 +18,23 @@ public class EnergyTicker { public static void tick(World world) { if (Objects.requireNonNull(world.getServer()).getThread() == Thread.currentThread()) { + world.getProfiler().push("energyTicker"); + + NetworkComponent.getInstance((ServerWorld) world).clearCache(); + List started = new ArrayList<>(); List temp = new ArrayList<>(scheduled); List temp2 = new ArrayList<>(); while (!temp.isEmpty()) { - for (EnergyTickable provider : temp) { - if (!started.contains(provider)) { - temp2.addAll(provider.startTick()); - started.add(provider); + for (EnergyTickable tickable : temp) { + if (!started.contains(tickable)) { + world.getProfiler().push(() -> tickable.getID() + " startTick"); + + temp2.addAll(tickable.startTick()); + started.add(tickable); + + world.getProfiler().pop(); } } temp.clear(); @@ -33,9 +43,15 @@ public class EnergyTicker { } Collections.shuffle(started); - for (EnergyTickable provider : started) { - provider.logicTick(); + for (EnergyTickable tickable : started) { + world.getProfiler().push(() -> tickable.getID() + " logicTick"); + + tickable.logicTick(); + + world.getProfiler().pop(); } + + world.getProfiler().pop(); } scheduled.clear(); }