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。
注入算法
- 若
patchClasses.containsKey(transformedName) == false→ 直接return basicClass(不动)。 - 根据
patchClasses.getOrDefault(transformedName, true)选择perThreadTrue或perThreadFalse注解节点(预初始化单例避免每类 new)。 - 追加到
cn.visibleAnnotations。 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 两个兼容目标。
相关条目
- CompatRegistry - 中央注册表
- ExtraUtilsCompatHandler - Extra Utilities 目标注册方
- StacksOnStacksCompatHandler - Stacks on Stacks 目标注册方
- AsmTransformers - 装载控制
- AngelicaCompatCore - 类转储基础设施