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:
Mike Caron
2018-09-08 14:01:16 -04:00
committed by Raoul
parent 94c93d1e11
commit affa8de14d
6 changed files with 43 additions and 1 deletions

View File

@@ -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);
}

View File

@@ -81,7 +81,11 @@ public class StorageCacheItem implements IStorageCache<ItemStack> {
@Override
public synchronized void flush() {
if (!batchedChanges.isEmpty()) {
batchedChanges.forEach(c -> listeners.forEach(l -> l.onChanged(c.getKey(), c.getValue())));
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();
}
}

View File

@@ -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());
}
}
}

View File

@@ -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);
}
}

View File

@@ -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);
}
}

View File

@@ -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());
}
}
}