ThreadSafeISBRHAnnotationTransformer

基本信息

属性 值
类名 com.gtnewhorizons.angelicacompat.asm.transformers.generic.ThreadSafeISBRHAnnotationTransformer
实现接口 net.minecraft.launchwrapper.IClassTransformer
数据源 CompatRegistry.INSTANCE.getThreadSafeISBRHAnnotations()
触发条件 AngelicaConfig.enableSodium == true 且 Side.CLIENT
注册枚举 AsmTransformers.THREAD_SAFE_ISBRH_ANNOTATION
启用版本 Minecraft 1.7.10(仅客户端)

功能

Angelica 在 Sodium 路径下提供 com.gtnewhorizons.angelica.api.ThreadSafeISBRH 类级注解(带 boolean perThread 元素),让 RenderBlocks 子类声明自己:

  • perThread = true:renderWorldBlock 可在每线程独立 RenderBlocks 实例下被并发调用,Angelica 会分配线程本地副本;
  • perThread = false:仍要求同步(通常是依赖静态缓存字段不能并发)。

ThreadSafeISBRHAnnotationTransformer 接收一份 (className → boolean) 的映射表,向指定类强制覆盖添加 @ThreadSafeISBRH(perThread=<value>) 类级可见注解:

  • 已存在时新增一个 AnnotationNode(不替换,便于多个 transformer 协同生效);
  • 不存在时新建 cn.visibleAnnotations = new ArrayList<>() 后再 add。

注入算法

  1. 若 patchClasses.containsKey(transformedName) == false → 直接 return basicClass(不动)。
  2. 根据 patchClasses.getOrDefault(transformedName, true) 选择 perThreadTrue 或 perThreadFalse 注解节点(预初始化单例避免每类 new)。
  3. 追加到 cn.visibleAnnotations。
  4. ClassWriter.COMPUTE_MAXS | COMPUTE_FRAMES 重写。

补丁覆盖(默认)

由 ExtraUtilsCompatHandler 注册 5 个目标:

类 perThread
com.rwtema.extrautils.block.render.RenderBlockColor false
com.rwtema.extrautils.block.render.RenderBlockConnectedTextures true
com.rwtema.extrautils.block.render.RenderBlockConnectedTexturesEthereal true
com.rwtema.extrautils.block.render.RenderBlockFullBright false
com.rwtema.extrautils.block.render.RenderBlockSpike false

以及由 StacksOnStacksCompatHandler 注册:

类 perThread
com.tierzero.stacksonstacks.client.render.RenderTilePile true

ClassWriter 标志

COMPUTE_MAXS | COMPUTE_FRAMES。

输出与调试

详见 AngelicaCompatCore — 当 AngelicaCompatCore.DUMP_CLASSES() 为 true 时写出改写前后字节码。

数值

数值 默认 含义
数据来源 CompatRegistry.getThreadSafeISBRHAnnotations() 运行时由 CompatHandler 注册
默认目标类数 6(5 EU + 1 StacksOnStacks) 全部 RenderBlocks 子类
触发开关 AngelicaConfig.enableSodium 仅 Sodium 启用时装载

限制

  • 强制覆盖语义:调用方需要预先知道每个目标是否线程安全;不能自动检测。
  • 添加的是 visibleAnnotations(RuntimeVisibleAnnotations),下游必须通过反射 API 读取才能生效。
  • perThread = false 只能"声明同步需求",不能强加同步——调用方仍可能并发触发,性能问题由 mod 作者自行处理。

第三方 mod 集成

通用 transformer,依赖 CompatRegistry 运行时填充。当前内置 ExtraUtilities + Stacks on Stacks 两个兼容目标。

相关条目