Skip to content

Commit

Permalink
- 替换了一些 Map 为 JCTools 的实现。
Browse files Browse the repository at this point in the history
- 新增 EnderUtilities 的一些物品复制修复。
- 改进了 LibNine 的模型加载性能。
- 改进了 ResourceLocationCanonicalize 的性能(但加载期间使用更多内存)。
- 改进了 NBTTagCompound 的匹配性能。
- 新增注册表修改器(实验性)。
  • Loading branch information
KasumiNova committed Oct 7, 2024
1 parent d0088e0 commit b79d131
Show file tree
Hide file tree
Showing 55 changed files with 904 additions and 126 deletions.
6 changes: 3 additions & 3 deletions build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ plugins {

// Project properties
group = "github.kasuminova.stellarcore"
version = "1.5.0"
version = "1.5.3"

// Set the toolchain version to decouple the Java we run Gradle with from the Java used to compile and run the mod
java {
Expand Down Expand Up @@ -278,7 +278,7 @@ dependencies {
compileOnly(rfg.deobf("curse.maven:libnine-322344:3509087"))
compileOnly(rfg.deobf("curse.maven:lazy-ae2-322347:3254160"))
compileOnly(rfg.deobf("curse.maven:electroblobs-wizardry-265642:5354477"))
compileOnly(rfg.deobf("curse.maven:ender-utilities-224320:2977010"))
implementation(rfg.deobf("curse.maven:ender-utilities-224320:2977010"))
compileOnly(rfg.deobf("curse.maven:ancient-spellcraft-358124:5413256"))
compileOnly(rfg.deobf("curse.maven:random-psideas-302313:3215550"))
compileOnly(rfg.deobf("curse.maven:journeymap-32274:5172461"))
Expand All @@ -289,7 +289,7 @@ dependencies {
compileOnly(rfg.deobf("curse.maven:blahajasm-1081696:5623595")) // or ASM Compat?
runtimeOnly(rfg.deobf("curse.maven:spark-361579:3245793"))
compileOnly(rfg.deobf("curse.maven:dme-737252:5043404"))
implementation(rfg.deobf("curse.maven:bountifulbaubles-313536:3568240"))
compileOnly(rfg.deobf("curse.maven:bountifulbaubles-313536:3568240"))
}

// IDE Settings
Expand Down
Original file line number Diff line number Diff line change
@@ -1,15 +1,14 @@
package github.kasuminova.stellarcore.client;

import github.kasuminova.stellarcore.client.handler.ClientEventHandler;
import github.kasuminova.stellarcore.client.integration.libnine.L9ModScanner;
import github.kasuminova.stellarcore.client.pool.BakedQuadPool;
import github.kasuminova.stellarcore.client.pool.BlockFaceUVsPool;
import github.kasuminova.stellarcore.client.pool.StellarUnpackedDataPool;
import github.kasuminova.stellarcore.client.util.TitleUtils;
import github.kasuminova.stellarcore.common.CommonProxy;
import github.kasuminova.stellarcore.common.command.CommandStellarCoreClient;
import github.kasuminova.stellarcore.common.config.StellarCoreConfig;
import github.kasuminova.stellarcore.common.mod.Mods;
import github.kasuminova.stellarcore.common.util.StellarLog;
import net.minecraftforge.client.ClientCommandHandler;
import net.minecraftforge.common.MinecraftForge;

Expand All @@ -27,6 +26,10 @@ public void preInit() {
super.preInit();
MinecraftForge.EVENT_BUS.register(ClientEventHandler.INSTANCE);

if (Mods.LIB_NINE.loaded()) {
L9ModScanner.scan();
}

// if (Mods.REPLAY.loaded() && StellarCoreConfig.PERFORMANCE.vanilla.hudCaching) {
// StellarCoreConfig.PERFORMANCE.vanilla.hudCaching = false;
// StellarLog.LOG.warn("Replay Mod is not compatible with Performance/HUDCaching feature, auto disabled!");
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,11 +7,11 @@
import com.llamalad7.betterchat.gui.GuiBetterChat;
import com.windanesz.ancientspellcraft.client.entity.ASFakePlayer;
import github.kasuminova.stellarcore.client.hudcaching.HUDCaching;
import github.kasuminova.stellarcore.common.pool.ResourceLocationPool;
import github.kasuminova.stellarcore.client.pool.StellarUnpackedDataPool;
import github.kasuminova.stellarcore.client.util.TitleUtils;
import github.kasuminova.stellarcore.common.config.StellarCoreConfig;
import github.kasuminova.stellarcore.common.mod.Mods;
import github.kasuminova.stellarcore.common.pool.ResourceLocationPool;
import github.kasuminova.stellarcore.common.util.StellarLog;
import journeymap.common.feature.PlayerRadarManager;
import mekanism.client.ClientTickHandler;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
package github.kasuminova.stellarcore.client.integration.libnine;

import github.kasuminova.stellarcore.common.config.StellarCoreConfig;
import github.kasuminova.stellarcore.common.mod.Mods;
import github.kasuminova.stellarcore.common.util.StellarLog;
import it.unimi.dsi.fastutil.objects.ObjectOpenHashSet;
import net.minecraftforge.fml.common.Loader;
import net.minecraftforge.fml.common.versioning.ArtifactVersion;

import java.util.Set;

public class L9ModScanner {

private static final Set<String> VALID_MODS = new ObjectOpenHashSet<>();

public static boolean isValidMod(final String modId) {
return VALID_MODS.contains(modId);
}

public static void scan() {
if (!Mods.LIB_NINE.loaded()) {
return;
}
if (!StellarCoreConfig.PERFORMANCE.vanilla.resourceExistStateCache) {
return;
}
if (!StellarCoreConfig.PERFORMANCE.libNine.l9ModelsIsOfTypeCache) {
return;
}
StellarLog.LOG.info("[StellarCore-L9ModScanner] L9Model filter is enabled.");

VALID_MODS.clear();
VALID_MODS.add("libnine");
Loader.instance().getActiveModList().forEach(mod -> {
if (mod.getRequirements().stream().map(ArtifactVersion::getLabel).anyMatch("libnine"::equalsIgnoreCase)) {
VALID_MODS.add(mod.getModId());
}
});

StellarLog.LOG.info("[StellarCore-L9ModScanner] Valid mods for LibNine mods: {}", VALID_MODS);
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
import github.kasuminova.stellarcore.common.config.StellarCoreConfig;
import github.kasuminova.stellarcore.common.pool.AsyncCanonicalizePool;
import github.kasuminova.stellarcore.common.pool.CanonicalizeWorker;
import github.kasuminova.stellarcore.common.pool.DeferredCanonicalizable;
import github.kasuminova.stellarcore.common.util.StellarLog;
import it.unimi.dsi.fastutil.Hash;
import it.unimi.dsi.fastutil.floats.FloatArrays;
Expand Down Expand Up @@ -53,6 +54,10 @@ public static void canonicalizeAsync(final float[][][] unpackedData, final Consu
});
}

public static void canonicalizeDeferred(final DeferredCanonicalizable<float[][][]> canonicalizable) {
POOL_LEVEL1.canonicalizeDeferred(canonicalizable);
}

public static float[][][] canonicalize(float[][][] data) {
final int level = getLevel();

Expand Down
Original file line number Diff line number Diff line change
@@ -1,20 +1,20 @@
package github.kasuminova.stellarcore.client.texture;

import github.kasuminova.stellarcore.shaded.org.jctools.maps.NonBlockingIdentityHashMap;
import net.minecraft.client.renderer.texture.TextureAtlasSprite;
import net.minecraft.client.resources.IResource;
import org.apache.commons.io.IOUtils;

import java.awt.image.BufferedImage;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

public class SpriteBufferedImageCache {

public static final SpriteBufferedImageCache INSTANCE = new SpriteBufferedImageCache();

private final Map<TextureAtlasSprite, BufferedImage> cache = new ConcurrentHashMap<>();
private final Map<TextureAtlasSprite, int[]> rgbCache = new ConcurrentHashMap<>();
private final Map<TextureAtlasSprite, IResource> resourceCache = new ConcurrentHashMap<>();
private final Map<TextureAtlasSprite, BufferedImage> cache = new NonBlockingIdentityHashMap<>();
private final Map<TextureAtlasSprite, int[]> rgbCache = new NonBlockingIdentityHashMap<>();
private final Map<TextureAtlasSprite, IResource> resourceCache = new NonBlockingIdentityHashMap<>();

public BufferedImage getImage(TextureAtlasSprite sprite) {
return cache.get(sprite);
Expand Down
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
package github.kasuminova.stellarcore.common;

import github.kasuminova.stellarcore.common.bugfix.TileEntityContainerFixes;
import github.kasuminova.stellarcore.common.config.StellarCoreConfig;
import github.kasuminova.stellarcore.common.entity.EntityForceUpdateManager;
import github.kasuminova.stellarcore.common.itemstack.ItemStackCapInitializer;
import github.kasuminova.stellarcore.common.pool.ResourceLocationPool;
import github.kasuminova.stellarcore.common.bugfix.TileEntityContainerFixes;
import github.kasuminova.stellarcore.common.handler.StellarCoreTickHandler;
import github.kasuminova.stellarcore.common.integration.fluxnetworks.IntegrationsFluxNetworks;
import github.kasuminova.stellarcore.common.itemstack.ItemStackCapInitializer;
import github.kasuminova.stellarcore.common.pool.ResourceLocationPool;
import net.minecraftforge.common.MinecraftForge;
import net.minecraftforge.fml.common.Loader;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -76,6 +76,9 @@ public static class BugFixes {
@Config.Name("EnderIOConduits")
public final EnderIOConduits enderIOConduits = new EnderIOConduits();

@Config.Name("EnderUtilities")
public final EnderUtilities enderUtilities = new EnderUtilities();

@Config.Name("ExtraBotany")
public final ExtraBotany extraBotany = new ExtraBotany();

Expand Down Expand Up @@ -295,6 +298,24 @@ public static class EnderIOConduits {
public boolean cachedItemConduit = false;

}

public static class EnderUtilities {

@Config.Comment({
"Fix an issue where HandyBag sometimes picking up items would cause them to be duplicated,",
"with the side effect that the player's item bar would no longer be populated when picking up matching items."
})
@Config.Name("ItemHandyBagDupeFixes")
public boolean itemHandyBag = true;

@Config.Comment({
"Fix an issue where Nullifier sometimes picking up items would cause them to be duplicated,",
"with the side effect that the player's item bar would no longer be populated when picking up matching items."
})
@Config.Name("ItemNullifierDupeFixes")
public boolean itemNullifier = true;

}

public static class ExtraBotany {

Expand Down Expand Up @@ -1322,6 +1343,14 @@ public static class Vanilla {
"xyz.phanta.tconevo.entity.EntityMagicMissile",
};

@Config.Comment({
"Completely remove something from the Forge registry, use at your own risk.",
"Usage: `minecraft:dirt`, `modid:something`"
})
@Config.RequiresMcRestart
@Config.Name("ForgeRegistryRemoveList")
public String[] forgeRegistryRemoveList = {};

}

public static class FontScale {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

import github.kasuminova.stellarcore.common.util.StellarEnvironment;
import github.kasuminova.stellarcore.common.util.StellarLog;
import github.kasuminova.stellarcore.shaded.org.jctools.queues.atomic.MpmcAtomicArrayQueue;
import github.kasuminova.stellarcore.shaded.org.jctools.queues.unpadded.MpmcUnpaddedArrayQueue;

import java.util.List;
import java.util.Queue;
Expand Down Expand Up @@ -143,7 +143,7 @@ private static void park() {
}

private static <E> Queue<E> createConcurrentQueue() {
return new MpmcAtomicArrayQueue<>(QUEUE_BOUND_SIZE * (MAX_WORKERS + 1));
return new MpmcUnpaddedArrayQueue<>(QUEUE_BOUND_SIZE * (MAX_WORKERS + 1));
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -99,6 +99,7 @@ public boolean loaded() {
}
}
},
LIB_NINE("libnine"),
;

protected final String modID;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,10 @@ public void canonicalizeAsync(final T target, final Consumer<T> callback) {
worker.offer(new CanonicalizeTask<>(() -> canonicalize(target), callback));
}

public void canonicalizeDeferred(final DeferredCanonicalizable<T> target) {
worker.defer(target);
}

public abstract T canonicalize(@Nullable final T target);

public CanonicalizeWorker<T> getWorker() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
import java.util.function.Supplier;

public class CanonicalizeTask<T> {

private final Supplier<T> task;
private final Consumer<T> callback;

Expand Down
Original file line number Diff line number Diff line change
@@ -1,13 +1,15 @@
package github.kasuminova.stellarcore.common.pool;

import github.kasuminova.stellarcore.common.util.StellarLog;
import github.kasuminova.stellarcore.shaded.org.jctools.queues.MpscLinkedQueue;
import github.kasuminova.stellarcore.shaded.org.jctools.queues.MpscUnboundedArrayQueue;

import java.lang.ref.WeakReference;
import java.util.Queue;
import java.util.concurrent.locks.LockSupport;

public class CanonicalizeWorker<T> implements Runnable {

private final Queue<WeakReference<DeferredCanonicalizable<T>>> deferedQueue = createConcurrentQueue();
private final Queue<CanonicalizeTask<T>> queue = createConcurrentQueue();
private final String name;

Expand Down Expand Up @@ -38,14 +40,30 @@ public boolean isRunning() {
return worker != null && worker.isAlive();
}

public Thread getThread() {
return worker;
}

public void offer(final CanonicalizeTask<T> task) {
queue.offer(task);
}

public void defer(final DeferredCanonicalizable<T> canonicalizable) {
deferedQueue.offer(new WeakReference<>(canonicalizable));
}

@Override
public void run() {
StellarLog.LOG.info("[StellarCore-{}] CanonicalizeWorker started.", name);
while (!Thread.currentThread().isInterrupted()) {
WeakReference<DeferredCanonicalizable<T>> ref;
while ((ref = deferedQueue.poll()) != null) {
DeferredCanonicalizable<T> canonicalizable = ref.get();
if (canonicalizable != null) {
canonicalizable.canonicalizeAsync();
}
}

CanonicalizeTask<T> task;
boolean executed = false;
while ((task = queue.poll()) != null) {
Expand Down Expand Up @@ -76,7 +94,7 @@ private void park() {
}

private static <E> Queue<E> createConcurrentQueue() {
return new MpscLinkedQueue<>();
return new MpscUnboundedArrayQueue<>(10_000);
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package github.kasuminova.stellarcore.common.pool;

public interface DeferredCanonicalizable<T> {

void canonicalizeAsync();

}
Original file line number Diff line number Diff line change
@@ -1,14 +1,14 @@
package github.kasuminova.stellarcore.common.pool;

import github.kasuminova.stellarcore.common.mod.Mods;
import github.kasuminova.stellarcore.common.util.StellarLog;
import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap;
import mirror.normalasm.api.NormalStringPool;
import net.minecraftforge.fml.common.Optional;
import zone.rong.loliasm.api.LoliStringPool;

import javax.annotation.Nullable;
import java.util.Locale;
import java.util.function.Consumer;

public class ResourceLocationPool extends AsyncCanonicalizePoolBase<String> {

Expand All @@ -18,6 +18,8 @@ public class ResourceLocationPool extends AsyncCanonicalizePoolBase<String> {
private volatile long processedCount = 0;

private ResourceLocationPool() {
Thread thread = getWorker().getThread();
thread.setPriority(Thread.MAX_PRIORITY);
}

@Override
Expand All @@ -39,11 +41,6 @@ public String canonicalize(@Nullable final String target) {
}
}

@Override
public void canonicalizeAsync(final String target, final Consumer<String> callback) {
throw new UnsupportedOperationException("ResourceLocationPool does not supported yet.");
}

@Override
public long getProcessedCount() {
return processedCount;
Expand All @@ -65,6 +62,8 @@ public void clear() {
processedCount = 0;
lowerCasePool.clear();
}
Thread thread = getWorker().getThread();
thread.setPriority(Thread.NORM_PRIORITY);
}

@Optional.Method(modid = "loliasm")
Expand Down
Loading

0 comments on commit b79d131

Please sign in to comment.