From 64dc704e7afd692a79a25915fc530f204372c330 Mon Sep 17 00:00:00 2001 From: FalsePattern Date: Fri, 15 Nov 2024 01:24:46 +0100 Subject: [PATCH] make dynamic lights thread safe --- .../modules/dynlights/base/DynamicLights.java | 25 ++++---- .../dynlights/base/DynamicLightsMap.java | 57 ------------------- 2 files changed, 10 insertions(+), 72 deletions(-) delete mode 100644 src/main/java/com/falsepattern/falsetweaks/modules/dynlights/base/DynamicLightsMap.java diff --git a/src/main/java/com/falsepattern/falsetweaks/modules/dynlights/base/DynamicLights.java b/src/main/java/com/falsepattern/falsetweaks/modules/dynlights/base/DynamicLights.java index c7b5460..7b23eaa 100644 --- a/src/main/java/com/falsepattern/falsetweaks/modules/dynlights/base/DynamicLights.java +++ b/src/main/java/com/falsepattern/falsetweaks/modules/dynlights/base/DynamicLights.java @@ -12,6 +12,9 @@ import java.util.concurrent.locks.ReentrantReadWriteLock; import cpw.mods.fml.common.eventhandler.SubscribeEvent; + +import it.unimi.dsi.fastutil.ints.Int2ObjectArrayMap; +import it.unimi.dsi.fastutil.ints.Int2ObjectMap; import lombok.val; import net.minecraft.block.Block; import net.minecraft.client.Minecraft; @@ -36,7 +39,8 @@ public class DynamicLights implements DynamicLightsDriver { public static final DynamicLights INSTANCE = new DynamicLights(false); private static final DynamicLights FOR_WORLD = new DynamicLights(true); - private static final DynamicLightsMap mapDynamicLights = new DynamicLightsMap(); + + private static final Int2ObjectMap mapDynamicLights = new Int2ObjectArrayMap<>(1024); private static final ReentrantReadWriteLock rwLock = new ReentrantReadWriteLock(); private static long timeUpdateMs = 0L; @@ -115,11 +119,8 @@ public void update(RenderGlobal renderGlobal) { val lock = busyWaitWriteLock(); try { updateMapDynamicLights(renderGlobal); - if (mapDynamicLights.size() > 0) { - List dynamicLights = mapDynamicLights.valueList(); - - for(int i = 0; i < dynamicLights.size(); ++i) { - DynamicLight dynamicLight = (DynamicLight)dynamicLights.get(i); + if (!mapDynamicLights.isEmpty()) { + for (val dynamicLight : mapDynamicLights.values()) { dynamicLight.update(renderGlobal); } } @@ -183,10 +184,7 @@ private double getLightLevel(int x, int y, int z) { double lightLevelMax = 0.0; val lock = busyWaitReadLock(); try { - List dynamicLights = mapDynamicLights.valueList(); - - for(int i = 0; i < dynamicLights.size(); ++i) { - DynamicLight dynamicLight = dynamicLights.get(i); + for (val dynamicLight: mapDynamicLights.values()) { if (!DynamicLightsDrivers.isDynamicHandLight(forWorld) && dynamicLight.getEntity() == rve) { continue; } @@ -304,14 +302,11 @@ public int getLightLevel(Entity entity) { public void removeLights(RenderGlobal renderGlobal) { val lock = busyWaitWriteLock(); try { - List dynamicLights = mapDynamicLights.valueList(); - - for(int i = 0; i < dynamicLights.size(); ++i) { - DynamicLight dynamicLight = (DynamicLight)dynamicLights.get(i); + for (val dynamicLight: mapDynamicLights.values()) { dynamicLight.updateLitChunks(renderGlobal); } - dynamicLights.clear(); + mapDynamicLights.clear(); } finally { lock.unlock(); } diff --git a/src/main/java/com/falsepattern/falsetweaks/modules/dynlights/base/DynamicLightsMap.java b/src/main/java/com/falsepattern/falsetweaks/modules/dynlights/base/DynamicLightsMap.java deleted file mode 100644 index adbec18..0000000 --- a/src/main/java/com/falsepattern/falsetweaks/modules/dynlights/base/DynamicLightsMap.java +++ /dev/null @@ -1,57 +0,0 @@ -package com.falsepattern.falsetweaks.modules.dynlights.base; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -public class DynamicLightsMap { - private Map map = new HashMap(); - private List list = new ArrayList(); - private boolean dirty = false; - - public DynamicLightsMap() { - } - - public DynamicLight put(int id, DynamicLight dynamicLight) { - DynamicLight old = (DynamicLight)this.map.put(id, dynamicLight); - this.setDirty(); - return old; - } - - public DynamicLight get(int id) { - return (DynamicLight)this.map.get(id); - } - - public int size() { - return this.map.size(); - } - - public DynamicLight remove(int id) { - DynamicLight old = (DynamicLight)this.map.remove(id); - if (old != null) { - this.setDirty(); - } - - return old; - } - - public void clear() { - this.map.clear(); - this.setDirty(); - } - - private void setDirty() { - this.dirty = true; - } - - public List valueList() { - if (this.dirty) { - this.list.clear(); - this.list.addAll(this.map.values()); - this.dirty = false; - } - - return this.list; - } -}