Optimization Mixin

[!INFO] 注册真源:MixinConfigPlugin.getMixins() 源码目录:src/main/java/makamys/coretweaks/mixin/optimization/

13 个 Optimization Mixin

# Mixin 门控配置 需客户端 备注
1 fmlmessagestrip.MixinFMLClientHandler forgeFastStepMessageStrip 是 唯一在 PREINIT 阶段
2 jardiscoverercache.MixinJarDiscoverer jarDiscovererCache 否 需先成功禁用 FoamFix
3 defaultresourcepack.MixinDefaultResourcePack fastDefaultResourcePack 是
4 folderresourcepack.MixinFolderResourcePack fastFolderResourcePack 是
5 tcpnodelay.MixinChannelInitializers tcpNoDelay 否 服务端也生效
6 ofupdaterendererreflect.MixinWorldRenderer ofOptimizeWorldRenderer 是 需 OptiFine
7 fastcrafttextureload.MixinFastcraft1_23TextureUtil fcOptimizeTextureUpload 否 fcVersion == "1.23"
8 fastcrafttextureload.MixinFastcraft1_25TextureUtil 同上 否 fcVersion == "1.25"
9 fastcrafttextureload.MixinTextureUtil 同上 否 FastCraft 匹配成功才注入
10 fastcrafttextureload.MixinTextureMap 同上 否 同上
11 clientchunkmap.MixinChunkProviderClient clientChunkMap 是 ⚠️ 永不可达
12 threadedtextureloader.ITextureMap threadedTextureLoader 是 ⚠️ 永不可达
13 threadedtextureloader.MixinTextureMap 同上 是 ⚠️ 永不可达

⚠️ 3 个永不可达(硬编码 FALSE)

#11~#13 的门控字段在 Config 中被硬编码且注解被注释:

public static FeatureSetting clientChunkMap = FeatureSetting.FALSE;
public static FeatureSetting threadedTextureLoader = FeatureSetting.FALSE;

FeatureSetting.isActive() 对 Setting.FALSE 恒返回 false, 因此这 3 个类虽然出现在 getMixins() 的源码里,实际永不注入。 详见 动态 Mixin 注册。

副作用:CoreTweaks.init() 中的 if (Config.threadedTextureLoader.isActive()) { textureLoader = ... } 与 CoreTweaksMod.init() 中的 if (CoreTweaks.textureLoader != null) 两段代码均不可达 —— ThreadedTextureLoader、TextureLoaderThread 整条优化路径在当前版本是死代码。

唯一在 PREINIT 阶段的一个

fmlmessagestrip.MixinFMLClientHandler 是三重条件中最苛刻的:

if (phase == Phase.PREINIT) {
    if (!isForgeSplashEnabled()) {
        if (Config.forgeFastStepMessageStrip.isActive())
            mixins.add("optimization.fmlmessagestrip.MixinFMLClientHandler");
    }
}

isForgeSplashEnabled() 读 config/splash.properties 的 enabled 键 (缺省 true),用 Properties 手工解析:

File configFile = new File(Launch.minecraftHome, "config/splash.properties");
if (configFile.exists()) {
    Properties props = new Properties();
    props.load(new FileReader(configFile));
    enabled = Boolean.parseBoolean((String) props.getOrDefault("enabled", "true"));
}

即必须先手动关闭 Forge 启动画面,该优化才生效。 同源的 forgeFastProgressBar 走 ASM 路径而非 Mixin (见 Coremod 与 ASM 变换器)。

FastCraft 版本二选一

fcOptimizeTextureUpload 启用时读 Launch.blackboard.get("fcVersion"):

switch (fcVersion) {
    case "1.23": mixins.add("...MixinFastcraft1_23TextureUtil"); break;
    case "1.25": mixins.add("...MixinFastcraft1_25TextureUtil"); break;
    default:
        LOGGER.warn("Unsupported FastCraft version: " + fcVersion + "...");
        ok = false; break;
}
if (ok) {
    // 反射移除 transformerExceptions 里的 "fastcraft"
    mixins.add("...MixinTextureUtil");
    mixins.add("...MixinTextureMap");
}

MixinFastcraft1_23 与 MixinFastcraft1_25 互斥; fcVersion 为 null(FastCraft 缺席)时静默跳过整个分支,连 WARN 都不打; 只有 fcVersion 存在但不匹配时才打 WARN。

jardiscoverercache 的前置反射 hack

该 Mixin 的注入被 disableFoamFixJarDiscovererTransformer() 门控, 该方法反射操作 FoamFix 的 BugfixModClassTransformer:

  1. Class.forName("pl.asie.foamfix.bugfixmod.coremod.BugfixModClassTransformer")
  2. 取静态字段 instance 与私有字段 patchers(Map<String, ArrayList>)
  3. 遍历移除名为 JarDiscovererMemoryLeakFixPatcher 的 patcher, 清空的列表一并移除
  4. ClassNotFoundException → TRACE 日志,视为「FoamFix 不存在」正常返回 true

⚠️ 任何其它异常 → ERROR 日志 + 打印堆栈 + 返回 false, 此时 MixinJarDiscoverer 不会注入,jarDiscovererCache 静默失效。 日志中会明确提示用户手动关闭 FoamFix 的 jarDiscovererMemoryLeakFix。

非 Mixin 的优化实现

以下优化不靠 Mixin,而是在 CoreTweaks.init() 中直接构造对象:

优化 实现类 门控
库排除 LibraryTransformationExcluder excludeLibraryTransformation
反混淆加速 FastDeobfuscationRemapper 自身 isActive()(读黑板)
通配符变换器 ForgeFastWildcardTransformers forgeFastWildcardTransformers
完整变换器缓存 CachingTransformer transformerCache + 模式 FULL
轻量变换器缓存 TransformerCache transformerCache + 模式 LITE
jar 发现器缓存 JarDiscovererCache jarDiscovererCache

CoreTweaks.init() 还会无条件执行 excludeRepackagedLibraries(), 把 "com.esotericsoftware.kryo.kryo5." 加入 Launch.classLoader.addTransformerExclusion(无配置开关)。

相关条目