Fix lag when many items update at once via External Storage (#1981)
* Add a new method to IStorageCacheListener for bulk operations * invoke the bulk listener method if there are multiple changes * implement the bulk method in the Grid and PortableGrid listeners. This fixes #1980 * Remove the default implementation of onChangedBulk, implemented it in the Fluid listeners, and fix a few brace-placement issues
This commit is contained in:
@@ -1,6 +1,10 @@
|
||||
package com.raoulvdberge.refinedstorage.api.storage;
|
||||
|
||||
import net.minecraft.item.ItemStack;
|
||||
import org.apache.commons.lang3.tuple.Pair;
|
||||
|
||||
import javax.annotation.Nonnull;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* Listens for storage cache changes.
|
||||
@@ -25,4 +29,6 @@ public interface IStorageCacheListener<T> {
|
||||
* @param size the size, negative if the amount decreases
|
||||
*/
|
||||
void onChanged(@Nonnull T stack, int size);
|
||||
|
||||
void onChangedBulk(@Nonnull List<Pair<T, Integer>> stacks);
|
||||
}
|
||||
|
@@ -81,7 +81,11 @@ public class StorageCacheItem implements IStorageCache<ItemStack> {
|
||||
@Override
|
||||
public synchronized void flush() {
|
||||
if (!batchedChanges.isEmpty()) {
|
||||
if(batchedChanges.size() > 1) {
|
||||
listeners.forEach(l -> l.onChangedBulk(batchedChanges));
|
||||
} else {
|
||||
batchedChanges.forEach(c -> listeners.forEach(l -> l.onChanged(c.getKey(), c.getValue())));
|
||||
}
|
||||
batchedChanges.clear();
|
||||
}
|
||||
}
|
||||
|
@@ -8,8 +8,10 @@ import com.raoulvdberge.refinedstorage.network.MessageGridFluidDelta;
|
||||
import com.raoulvdberge.refinedstorage.network.MessageGridFluidUpdate;
|
||||
import net.minecraft.entity.player.EntityPlayerMP;
|
||||
import net.minecraftforge.fluids.FluidStack;
|
||||
import org.apache.commons.lang3.tuple.Pair;
|
||||
|
||||
import javax.annotation.Nonnull;
|
||||
import java.util.List;
|
||||
|
||||
public class StorageCacheListenerGridFluid implements IStorageCacheListener<FluidStack> {
|
||||
private EntityPlayerMP player;
|
||||
@@ -34,4 +36,11 @@ public class StorageCacheListenerGridFluid implements IStorageCacheListener<Flui
|
||||
public void onChanged(@Nonnull FluidStack stack, int size) {
|
||||
RS.INSTANCE.network.sendTo(new MessageGridFluidDelta(network, network.getFluidStorageTracker(), stack, size), player);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onChangedBulk(@Nonnull List<Pair<FluidStack, Integer>> stacks) {
|
||||
for(Pair<FluidStack, Integer> stack : stacks) {
|
||||
onChanged(stack.getLeft(), stack.getRight());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@@ -8,8 +8,10 @@ import com.raoulvdberge.refinedstorage.network.MessageGridItemDelta;
|
||||
import com.raoulvdberge.refinedstorage.network.MessageGridItemUpdate;
|
||||
import net.minecraft.entity.player.EntityPlayerMP;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import org.apache.commons.lang3.tuple.Pair;
|
||||
|
||||
import javax.annotation.Nonnull;
|
||||
import java.util.List;
|
||||
|
||||
public class StorageCacheListenerGridItem implements IStorageCacheListener<ItemStack> {
|
||||
private EntityPlayerMP player;
|
||||
@@ -34,4 +36,9 @@ public class StorageCacheListenerGridItem implements IStorageCacheListener<ItemS
|
||||
public void onChanged(@Nonnull ItemStack stack, int size) {
|
||||
RS.INSTANCE.network.sendTo(new MessageGridItemDelta(network, network.getItemStorageTracker(), stack, size), player);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onChangedBulk(@Nonnull List<Pair<ItemStack, Integer>> stacks) {
|
||||
RS.INSTANCE.network.sendTo(new MessageGridItemDelta(network, network.getItemStorageTracker(), stacks), player);
|
||||
}
|
||||
}
|
||||
|
@@ -10,8 +10,10 @@ import com.raoulvdberge.refinedstorage.util.StackUtils;
|
||||
import net.minecraft.entity.player.EntityPlayerMP;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraftforge.fml.common.network.ByteBufUtils;
|
||||
import org.apache.commons.lang3.tuple.Pair;
|
||||
|
||||
import javax.annotation.Nonnull;
|
||||
import java.util.List;
|
||||
|
||||
public class StorageCacheListenerGridPortable implements IStorageCacheListener<ItemStack> {
|
||||
private IPortableGrid portableGrid;
|
||||
@@ -49,4 +51,9 @@ public class StorageCacheListenerGridPortable implements IStorageCacheListener<I
|
||||
public void onChanged(@Nonnull ItemStack stack, int size) {
|
||||
RS.INSTANCE.network.sendTo(new MessageGridItemDelta(null, portableGrid.getItemStorageTracker(), stack, size), player);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onChangedBulk(@Nonnull List<Pair<ItemStack, Integer>> stacks) {
|
||||
RS.INSTANCE.network.sendTo(new MessageGridItemDelta(null, portableGrid.getItemStorageTracker(), stacks), player);
|
||||
}
|
||||
}
|
||||
|
@@ -10,8 +10,10 @@ import com.raoulvdberge.refinedstorage.util.StackUtils;
|
||||
import net.minecraft.entity.player.EntityPlayerMP;
|
||||
import net.minecraftforge.fluids.FluidStack;
|
||||
import net.minecraftforge.fml.common.network.ByteBufUtils;
|
||||
import org.apache.commons.lang3.tuple.Pair;
|
||||
|
||||
import javax.annotation.Nonnull;
|
||||
import java.util.List;
|
||||
|
||||
public class StorageCacheListenerGridPortableFluid implements IStorageCacheListener<FluidStack> {
|
||||
private IPortableGrid portableGrid;
|
||||
@@ -54,4 +56,11 @@ public class StorageCacheListenerGridPortableFluid implements IStorageCacheListe
|
||||
public void onChanged(@Nonnull FluidStack stack, int size) {
|
||||
RS.INSTANCE.network.sendTo(new MessageGridFluidDelta(null, portableGrid.getFluidStorageTracker(), stack, size), player);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onChangedBulk(@Nonnull List<Pair<FluidStack, Integer>> stacks) {
|
||||
for(Pair<FluidStack, Integer> stack : stacks) {
|
||||
onChanged(stack.getLeft(), stack.getRight());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user