Fixed high CPU load when Refined Storage GUIs are open, fixes #1295

This commit is contained in:
raoulvdberge
2017-10-03 22:39:38 +02:00
parent b29374882d
commit 99e4ea6d0a
5 changed files with 19 additions and 14 deletions

View File

@@ -9,6 +9,7 @@ import com.raoulvdberge.refinedstorage.network.MessageGridItemDelta;
import com.raoulvdberge.refinedstorage.network.MessageGridItemUpdate;
import com.raoulvdberge.refinedstorage.tile.grid.portable.IPortableGrid;
import com.raoulvdberge.refinedstorage.util.StackUtils;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.entity.player.EntityPlayerMP;
import net.minecraft.item.ItemStack;
@@ -36,7 +37,7 @@ public class StorageCacheItemPortable implements IStorageCache<ItemStack> {
listeners.forEach(Runnable::run);
portableGrid.getWatchers().forEach(w -> sendUpdateTo(w.getPlayer()));
portableGrid.getWatchers().forEach(this::sendUpdateTo);
}
@Override
@@ -44,7 +45,7 @@ public class StorageCacheItemPortable implements IStorageCache<ItemStack> {
list.add(stack, size);
if (!rebuilding) {
portableGrid.getWatchers().forEach(w -> RS.INSTANCE.network.sendTo(new MessageGridItemDelta(null, stack, size), w.getPlayer()));
portableGrid.getWatchers().forEach(w -> RS.INSTANCE.network.sendTo(new MessageGridItemDelta(null, stack, size), (EntityPlayerMP) w));
listeners.forEach(Runnable::run);
}
@@ -53,7 +54,7 @@ public class StorageCacheItemPortable implements IStorageCache<ItemStack> {
@Override
public void remove(@Nonnull ItemStack stack, int size, boolean batched) {
if (list.remove(stack, size)) {
portableGrid.getWatchers().forEach(w -> RS.INSTANCE.network.sendTo(new MessageGridItemDelta(null, stack, -size), w.getPlayer()));
portableGrid.getWatchers().forEach(w -> RS.INSTANCE.network.sendTo(new MessageGridItemDelta(null, stack, -size), (EntityPlayerMP) w));
listeners.forEach(Runnable::run);
}
@@ -84,13 +85,13 @@ public class StorageCacheItemPortable implements IStorageCache<ItemStack> {
return Collections.emptyList();
}
public void sendUpdateTo(EntityPlayerMP player) {
public void sendUpdateTo(EntityPlayer player) {
RS.INSTANCE.network.sendTo(new MessageGridItemUpdate(buf -> {
buf.writeInt(list.getStacks().size());
for (ItemStack stack : list.getStacks()) {
StackUtils.writeItemStack(buf, stack, null, false);
}
}, false), player);
}, false), (EntityPlayerMP) player);
}
}

View File

@@ -2,6 +2,7 @@ package com.raoulvdberge.refinedstorage.tile.data;
import com.raoulvdberge.refinedstorage.RS;
import com.raoulvdberge.refinedstorage.network.MessageTileDataParameterUpdate;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.tileentity.TileEntity;
import java.util.ArrayList;
@@ -20,6 +21,7 @@ public class TileDataManager {
private List<TileDataParameter> watchedParameters = new ArrayList<>();
private List<TileDataWatcher> watchers = new CopyOnWriteArrayList<>();
private List<EntityPlayer> playersWatching = new CopyOnWriteArrayList<>();
public TileDataManager(TileEntity tile) {
this.tile = tile;
@@ -47,16 +49,18 @@ public class TileDataManager {
return watchedParameters;
}
public List<TileDataWatcher> getWatchers() {
return watchers;
public List<EntityPlayer> getPlayersWatching() {
return playersWatching;
}
public void addWatcher(TileDataWatcher listener) {
watchers.add(listener);
playersWatching.add(listener.getPlayer());
}
public void removeWatcher(TileDataWatcher listener) {
watchers.remove(listener);
playersWatching.remove(listener.getPlayer());
}
public void sendParameterToWatchers(TileDataParameter parameter) {

View File

@@ -3,7 +3,7 @@ package com.raoulvdberge.refinedstorage.tile.grid.portable;
import com.raoulvdberge.refinedstorage.api.storage.IStorageCache;
import com.raoulvdberge.refinedstorage.api.storage.IStorageDisk;
import com.raoulvdberge.refinedstorage.inventory.ItemHandlerBase;
import com.raoulvdberge.refinedstorage.tile.data.TileDataWatcher;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.ItemStack;
import net.minecraftforge.items.IItemHandlerModifiable;
@@ -16,7 +16,7 @@ public interface IPortableGrid {
@Nullable
IStorageDisk<ItemStack> getStorage();
List<TileDataWatcher> getWatchers();
List<EntityPlayer> getWatchers();
void drainEnergy(int energy);

View File

@@ -39,6 +39,7 @@ import net.minecraftforge.items.IItemHandlerModifiable;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class PortableGrid implements IGrid, IPortableGrid {
@@ -166,8 +167,8 @@ public class PortableGrid implements IGrid, IPortableGrid {
}
@Override
public List<TileDataWatcher> getWatchers() {
return dummyWatchers;
public List<EntityPlayer> getWatchers() {
return Collections.singletonList(player);
}
@Override

View File

@@ -31,7 +31,6 @@ import com.raoulvdberge.refinedstorage.tile.config.IRedstoneConfigurable;
import com.raoulvdberge.refinedstorage.tile.config.RedstoneMode;
import com.raoulvdberge.refinedstorage.tile.data.TileDataManager;
import com.raoulvdberge.refinedstorage.tile.data.TileDataParameter;
import com.raoulvdberge.refinedstorage.tile.data.TileDataWatcher;
import com.raoulvdberge.refinedstorage.util.StackUtils;
import com.raoulvdberge.refinedstorage.util.WorldUtils;
import net.minecraft.client.Minecraft;
@@ -461,8 +460,8 @@ public class TilePortableGrid extends TileBase implements IGrid, IPortableGrid,
}
@Override
public List<TileDataWatcher> getWatchers() {
return dataManager.getWatchers();
public List<EntityPlayer> getWatchers() {
return dataManager.getPlayersWatching();
}
@Override