diff --git a/CHANGELOG.md b/CHANGELOG.md index 9859ea765..263c3d5bb 100755 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -13,6 +13,7 @@ - You can now use up and down arrows to scroll through Grid search history (raoulvdberge) - Fixed Grid crash (raoulvdberge) - Fixed Fluid Grid not formatting large quantities correctly (raoulvdberge) +- Small performance improvement: only sort the storages when needed (raoulvdberge) ### 1.4.2 - Updated Forge to 2261 (raoulvdberge) diff --git a/src/main/java/com/raoulvdberge/refinedstorage/RSUtils.java b/src/main/java/com/raoulvdberge/refinedstorage/RSUtils.java index f0833c45f..aceba2a51 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/RSUtils.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/RSUtils.java @@ -2,6 +2,7 @@ package com.raoulvdberge.refinedstorage; import com.raoulvdberge.refinedstorage.api.network.INetworkMaster; import com.raoulvdberge.refinedstorage.api.storage.AccessType; +import com.raoulvdberge.refinedstorage.api.storage.IStorage; import com.raoulvdberge.refinedstorage.api.storage.IStorageDisk; import com.raoulvdberge.refinedstorage.api.storage.IStorageDiskProvider; import com.raoulvdberge.refinedstorage.api.util.IStackList; @@ -63,6 +64,12 @@ import java.util.function.Function; public final class RSUtils { public static final ItemStack EMPTY_BUCKET = new ItemStack(Items.BUCKET); + public static final Comparator STORAGE_COMPARATOR = (left, right) -> { + int compare = Integer.compare(right.getPriority(), left.getPriority()); + + return compare != 0 ? compare : Integer.compare(right.getStored(), left.getStored()); + }; + public static final DecimalFormat QUANTITY_FORMATTER = new DecimalFormat("####0.#", DecimalFormatSymbols.getInstance(Locale.US)); private static final String NBT_INVENTORY = "Inventory_%d"; diff --git a/src/main/java/com/raoulvdberge/refinedstorage/api/storage/IStorageCache.java b/src/main/java/com/raoulvdberge/refinedstorage/api/storage/IStorageCache.java index ee987966f..6968ffa02 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/api/storage/IStorageCache.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/api/storage/IStorageCache.java @@ -16,6 +16,7 @@ import java.util.List; public interface IStorageCache { /** * Invalidates the cache. + * Should also call {@link IStorageCache#sort()} to sort the storages correctly. * Typically called when a {@link IStorageProvider} is added or removed from the network. */ void invalidate(); @@ -45,6 +46,12 @@ public interface IStorageCache { */ void remove(@Nonnull T stack, int size); + /** + * Resorts the storages in this cache according to their priority. This needs to be called when the priority + * of a storage changes. + */ + void sort(); + /** * @return the list behind this cache */ diff --git a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/NetworkNodeFluidStorage.java b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/NetworkNodeFluidStorage.java index e48da5b6e..96bd51886 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/NetworkNodeFluidStorage.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/NetworkNodeFluidStorage.java @@ -316,6 +316,10 @@ public class NetworkNodeFluidStorage extends NetworkNode implements IGuiStorage, this.priority = priority; markDirty(); + + if (network != null) { + network.getFluidStorageCache().sort(); + } } @Override diff --git a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/NetworkNodeStorage.java b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/NetworkNodeStorage.java index 50184442a..905b67ad0 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/NetworkNodeStorage.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/NetworkNodeStorage.java @@ -323,5 +323,9 @@ public class NetworkNodeStorage extends NetworkNode implements IGuiStorage, ISto this.priority = priority; markDirty(); + + if (network != null) { + network.getItemStorageCache().sort(); + } } } diff --git a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/diskdrive/NetworkNodeDiskDrive.java b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/diskdrive/NetworkNodeDiskDrive.java index 16c785b79..4619088db 100644 --- a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/diskdrive/NetworkNodeDiskDrive.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/diskdrive/NetworkNodeDiskDrive.java @@ -338,6 +338,11 @@ public class NetworkNodeDiskDrive extends NetworkNode implements IGuiStorage, IS this.priority = priority; markDirty(); + + if (network != null) { + network.getItemStorageCache().sort(); + network.getFluidStorageCache().sort(); + } } public IItemHandler getDisks() { diff --git a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/externalstorage/NetworkNodeExternalStorage.java b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/externalstorage/NetworkNodeExternalStorage.java index 0b889b540..7cb78ded6 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/externalstorage/NetworkNodeExternalStorage.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/externalstorage/NetworkNodeExternalStorage.java @@ -181,6 +181,11 @@ public class NetworkNodeExternalStorage extends NetworkNode implements IStorageP this.priority = priority; markDirty(); + + if (network != null) { + network.getItemStorageCache().sort(); + network.getFluidStorageCache().sort(); + } } public void updateStorage(INetworkMaster network) { diff --git a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/storage/StorageCacheFluid.java b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/storage/StorageCacheFluid.java index 6136e90c5..eab20e081 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/storage/StorageCacheFluid.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/storage/StorageCacheFluid.java @@ -1,5 +1,6 @@ package com.raoulvdberge.refinedstorage.apiimpl.storage; +import com.raoulvdberge.refinedstorage.RSUtils; import com.raoulvdberge.refinedstorage.api.network.INetworkMaster; import com.raoulvdberge.refinedstorage.api.storage.AccessType; import com.raoulvdberge.refinedstorage.api.storage.IStorage; @@ -33,6 +34,8 @@ public class StorageCacheFluid implements IStorageCache { list.clear(); + sort(); + for (IStorage storage : storages) { if (storage.getAccessType() == AccessType.INSERT) { continue; @@ -62,6 +65,11 @@ public class StorageCacheFluid implements IStorageCache { } } + @Override + public void sort() { + storages.sort(RSUtils.STORAGE_COMPARATOR); + } + @Override public IStackList getList() { return list; diff --git a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/storage/StorageCacheItem.java b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/storage/StorageCacheItem.java index 6f182f755..9021c3b71 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/storage/StorageCacheItem.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/storage/StorageCacheItem.java @@ -1,5 +1,6 @@ package com.raoulvdberge.refinedstorage.apiimpl.storage; +import com.raoulvdberge.refinedstorage.RSUtils; import com.raoulvdberge.refinedstorage.api.network.INetworkMaster; import com.raoulvdberge.refinedstorage.api.storage.AccessType; import com.raoulvdberge.refinedstorage.api.storage.IStorage; @@ -33,6 +34,8 @@ public class StorageCacheItem implements IStorageCache { list.clear(); + sort(); + for (IStorage storage : storages) { if (storage.getAccessType() == AccessType.INSERT) { continue; @@ -64,6 +67,11 @@ public class StorageCacheItem implements IStorageCache { } } + @Override + public void sort() { + storages.sort(RSUtils.STORAGE_COMPARATOR); + } + @Override public IStackList getList() { return list; diff --git a/src/main/java/com/raoulvdberge/refinedstorage/tile/TileController.java b/src/main/java/com/raoulvdberge/refinedstorage/tile/TileController.java index 254d841c1..415b3712a 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/tile/TileController.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/tile/TileController.java @@ -142,12 +142,6 @@ public class TileController extends TileBase implements INetworkMaster, IRedston return (left.getEnergyUsage() > right.getEnergyUsage()) ? -1 : 1; }; - private static final Comparator STORAGE_COMPARATOR = (left, right) -> { - int compare = Integer.compare(right.getPriority(), left.getPriority()); - - return compare != 0 ? compare : Integer.compare(right.getStored(), left.getStored()); - }; - private IItemGridHandler itemGridHandler = new ItemGridHandler(this); private IFluidGridHandler fluidGridHandler = new FluidGridHandler(this); @@ -222,9 +216,6 @@ public class TileController extends TileBase implements INetworkMaster, IRedston public void update() { if (!getWorld().isRemote) { if (canRun()) { - itemStorage.getStorages().sort(STORAGE_COMPARATOR); - fluidStorage.getStorages().sort(STORAGE_COMPARATOR); - craftingManager.update(); for (IReaderWriterChannel channel : readerWriterChannels.values()) {