mirror of
https://github.com/Jozufozu/Flywheel.git
synced 2024-12-27 07:26:48 +01:00
Fix world leak
This commit is contained in:
parent
bf2525cb2e
commit
ba3ef05aa4
3 changed files with 34 additions and 1 deletions
|
@ -53,6 +53,7 @@ public class InstancedRenderDispatcher {
|
|||
}
|
||||
|
||||
public static void enqueueUpdate(TileEntity te) {
|
||||
if (te.hasLevel() && te.getLevel() instanceof ClientWorld)
|
||||
getTiles(te.getLevel()).queueUpdate(te);
|
||||
}
|
||||
|
||||
|
|
|
@ -4,6 +4,7 @@ import java.util.ArrayList;
|
|||
|
||||
import com.jozufozu.flywheel.backend.Backend;
|
||||
import com.jozufozu.flywheel.backend.instancing.InstancedRenderDispatcher;
|
||||
import com.jozufozu.flywheel.util.WorldAttached;
|
||||
|
||||
import net.minecraft.client.Minecraft;
|
||||
import net.minecraft.client.world.ClientWorld;
|
||||
|
@ -45,4 +46,13 @@ public class ForgeEvents {
|
|||
}
|
||||
}
|
||||
|
||||
@SubscribeEvent
|
||||
public static void onUnloadWorld(WorldEvent.Unload event) {
|
||||
IWorld world = event.getWorld();
|
||||
|
||||
if (Backend.isFlywheelWorld(world)) {
|
||||
WorldAttached.invalidateWorld(world);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -1,6 +1,10 @@
|
|||
package com.jozufozu.flywheel.util;
|
||||
|
||||
import java.lang.ref.WeakReference;
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.Iterator;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.function.BiConsumer;
|
||||
import java.util.function.Consumer;
|
||||
|
@ -12,12 +16,30 @@ import net.minecraft.world.IWorld;
|
|||
|
||||
public class WorldAttached<T> {
|
||||
|
||||
// weak references to prevent leaking hashmaps when a WorldAttached is GC'd during runtime
|
||||
static List<WeakReference<Map<IWorld, ?>>> allMaps = new ArrayList<>();
|
||||
private final Map<IWorld, T> attached;
|
||||
private final Function<IWorld, T> factory;
|
||||
|
||||
public WorldAttached(Function<IWorld, T> factory) {
|
||||
this.factory = factory;
|
||||
attached = new HashMap<>();
|
||||
allMaps.add(new WeakReference<>(attached));
|
||||
}
|
||||
|
||||
public static void invalidateWorld(IWorld world) {
|
||||
Iterator<WeakReference<Map<IWorld, ?>>> i = allMaps.iterator();
|
||||
while (i.hasNext()) {
|
||||
Map<IWorld, ?> map = i.next()
|
||||
.get();
|
||||
if (map == null) {
|
||||
// If the map has been GC'd, remove the weak reference
|
||||
i.remove();
|
||||
} else {
|
||||
// Prevent leaks
|
||||
map.remove(world);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Nonnull
|
||||
|
|
Loading…
Reference in a new issue