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.network.MessageGridItemUpdate;
import com.raoulvdberge.refinedstorage.tile.grid.portable.IPortableGrid; import com.raoulvdberge.refinedstorage.tile.grid.portable.IPortableGrid;
import com.raoulvdberge.refinedstorage.util.StackUtils; import com.raoulvdberge.refinedstorage.util.StackUtils;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.entity.player.EntityPlayerMP;
import net.minecraft.item.ItemStack; import net.minecraft.item.ItemStack;
@@ -36,7 +37,7 @@ public class StorageCacheItemPortable implements IStorageCache<ItemStack> {
listeners.forEach(Runnable::run); listeners.forEach(Runnable::run);
portableGrid.getWatchers().forEach(w -> sendUpdateTo(w.getPlayer())); portableGrid.getWatchers().forEach(this::sendUpdateTo);
} }
@Override @Override
@@ -44,7 +45,7 @@ public class StorageCacheItemPortable implements IStorageCache<ItemStack> {
list.add(stack, size); list.add(stack, size);
if (!rebuilding) { 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); listeners.forEach(Runnable::run);
} }
@@ -53,7 +54,7 @@ public class StorageCacheItemPortable implements IStorageCache<ItemStack> {
@Override @Override
public void remove(@Nonnull ItemStack stack, int size, boolean batched) { public void remove(@Nonnull ItemStack stack, int size, boolean batched) {
if (list.remove(stack, size)) { 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); listeners.forEach(Runnable::run);
} }
@@ -84,13 +85,13 @@ public class StorageCacheItemPortable implements IStorageCache<ItemStack> {
return Collections.emptyList(); return Collections.emptyList();
} }
public void sendUpdateTo(EntityPlayerMP player) { public void sendUpdateTo(EntityPlayer player) {
RS.INSTANCE.network.sendTo(new MessageGridItemUpdate(buf -> { RS.INSTANCE.network.sendTo(new MessageGridItemUpdate(buf -> {
buf.writeInt(list.getStacks().size()); buf.writeInt(list.getStacks().size());
for (ItemStack stack : list.getStacks()) { for (ItemStack stack : list.getStacks()) {
StackUtils.writeItemStack(buf, stack, null, false); 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.RS;
import com.raoulvdberge.refinedstorage.network.MessageTileDataParameterUpdate; import com.raoulvdberge.refinedstorage.network.MessageTileDataParameterUpdate;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.tileentity.TileEntity; import net.minecraft.tileentity.TileEntity;
import java.util.ArrayList; import java.util.ArrayList;
@@ -20,6 +21,7 @@ public class TileDataManager {
private List<TileDataParameter> watchedParameters = new ArrayList<>(); private List<TileDataParameter> watchedParameters = new ArrayList<>();
private List<TileDataWatcher> watchers = new CopyOnWriteArrayList<>(); private List<TileDataWatcher> watchers = new CopyOnWriteArrayList<>();
private List<EntityPlayer> playersWatching = new CopyOnWriteArrayList<>();
public TileDataManager(TileEntity tile) { public TileDataManager(TileEntity tile) {
this.tile = tile; this.tile = tile;
@@ -47,16 +49,18 @@ public class TileDataManager {
return watchedParameters; return watchedParameters;
} }
public List<TileDataWatcher> getWatchers() { public List<EntityPlayer> getPlayersWatching() {
return watchers; return playersWatching;
} }
public void addWatcher(TileDataWatcher listener) { public void addWatcher(TileDataWatcher listener) {
watchers.add(listener); watchers.add(listener);
playersWatching.add(listener.getPlayer());
} }
public void removeWatcher(TileDataWatcher listener) { public void removeWatcher(TileDataWatcher listener) {
watchers.remove(listener); watchers.remove(listener);
playersWatching.remove(listener.getPlayer());
} }
public void sendParameterToWatchers(TileDataParameter parameter) { 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.IStorageCache;
import com.raoulvdberge.refinedstorage.api.storage.IStorageDisk; import com.raoulvdberge.refinedstorage.api.storage.IStorageDisk;
import com.raoulvdberge.refinedstorage.inventory.ItemHandlerBase; 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.minecraft.item.ItemStack;
import net.minecraftforge.items.IItemHandlerModifiable; import net.minecraftforge.items.IItemHandlerModifiable;
@@ -16,7 +16,7 @@ public interface IPortableGrid {
@Nullable @Nullable
IStorageDisk<ItemStack> getStorage(); IStorageDisk<ItemStack> getStorage();
List<TileDataWatcher> getWatchers(); List<EntityPlayer> getWatchers();
void drainEnergy(int energy); void drainEnergy(int energy);

View File

@@ -39,6 +39,7 @@ import net.minecraftforge.items.IItemHandlerModifiable;
import javax.annotation.Nonnull; import javax.annotation.Nonnull;
import javax.annotation.Nullable; import javax.annotation.Nullable;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collections;
import java.util.List; import java.util.List;
public class PortableGrid implements IGrid, IPortableGrid { public class PortableGrid implements IGrid, IPortableGrid {
@@ -166,8 +167,8 @@ public class PortableGrid implements IGrid, IPortableGrid {
} }
@Override @Override
public List<TileDataWatcher> getWatchers() { public List<EntityPlayer> getWatchers() {
return dummyWatchers; return Collections.singletonList(player);
} }
@Override @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.config.RedstoneMode;
import com.raoulvdberge.refinedstorage.tile.data.TileDataManager; import com.raoulvdberge.refinedstorage.tile.data.TileDataManager;
import com.raoulvdberge.refinedstorage.tile.data.TileDataParameter; 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.StackUtils;
import com.raoulvdberge.refinedstorage.util.WorldUtils; import com.raoulvdberge.refinedstorage.util.WorldUtils;
import net.minecraft.client.Minecraft; import net.minecraft.client.Minecraft;
@@ -461,8 +460,8 @@ public class TilePortableGrid extends TileBase implements IGrid, IPortableGrid,
} }
@Override @Override
public List<TileDataWatcher> getWatchers() { public List<EntityPlayer> getWatchers() {
return dataManager.getWatchers(); return dataManager.getPlayersWatching();
} }
@Override @Override