离屏 Tessellator 捕获

基本信息

属性 值
对外接口 com.gtnewhorizon.gtnhlib.api.CapturingTesselator(单 l 拼写)
渲染实现类 com.gtnewhorizon.gtnhlib.client.renderer.CapturingTessellator(双 l 拼写)
调度器 com.gtnewhorizon.gtnhlib.client.renderer.TessellatorManager
作用面 客户端
相关 AT META-INF/gtnhlib_at.cfg 中 23 条 Tessellator 条目

功能

在渲染线程之外收集 1.7.10 Tessellator 的绘制调用,使下游 mod 可以做批量提交或异步渲染。README 的表述是(README.md Rendering 节):

CapturingTesselator captures render quads off the main thread for batched or async rendering.

工作方式分三层,注意两个类的拼写不同(Tesselator 单 l / Tessellator 双 l),不是同一个类:

层 类 角色
对外接口 api/CapturingTesselator.java:8 空接口,是捕获能力的类型化视图
渲染实现 client/renderer/CapturingTessellator.java:47 extends Tessellator implements ITessellatorInstance
调度器 client/renderer/TessellatorManager.java 线程分发与捕获态管理

client/renderer/CapturingTessellator 覆写了 pos/tex/color 等顶点写入方法(:172、:182、:190),并把最终绘制转交给 TessellatorManager.processDrawForCapturingTessellator(this)(:114)。

由于要读取 1.7.10 Tessellator 的私有字段,GTNHLib 通过 access transformer 放开它们。META-INF/gtnhlib_at.cfg 共 31 行,其中 23 行针对 net.minecraft.client.renderer.Tessellator:21 条 field_…、1 条 func_78379_d()V、1 条 rawBufferSize。例如 field_78405_h # rawBuffer、field_78406_i # vertexCount、field_78388_E # rawBufferSize。

剩余 8 行 AT 针对其他类(CommandHandler.field_71562_a、RegistrySimple.field_82596_a、NBTTagCompound.field_74784_a、RenderingRegistry.blockRenderers 等),与本条无关。

数值

数值名 值
对外接口方法数 0(api.CapturingTesselator 为空接口)
gtnhlib_at.cfg 中 Tessellator 条目 23(21 字段 + 1 func_78379_d() + 1 rawBufferSize)
gtnhlib_at.cfg 总条目 31
IFMLLoadingPlugin.TransformerExclusions 条目 5(见下)

GTNHLibCore(core/GTNHLibCore.java:29-31)把以下包排除在转换之外,避免自举死循环:

@IFMLLoadingPlugin.TransformerExclusions({ "it.unimi.dsi.fastutil", "com.gtnewhorizon.gtnhlib.asm",
        "com.gtnewhorizon.gtnhlib.core", "com.gtnewhorizon.gtnhlib.client.renderer.TessellatorManager",
        "com.gtnewhorizon.gtnhlib.client.renderer.CapturingTessellator" })

交互

TessellatorManager 的异常处理采用"恢复后重抛"而非吞掉(client/renderer/TessellatorManager.java:344-347):

} catch (Throwable t) {
    stopCapturingDirect();
    throw t;
}

即捕获失败时会先停止捕获状态再原样抛出,不会留下半开启的捕获态。

FalseTweaks.doTessSafetyChecks()(compat/FalseTweaks.java)在 FalseTweaks 接管线程化区块更新时关闭 GTNHLib 自己的 Tessellator 安全检查:

public static boolean doTessSafetyChecks() {
    return !ThreadedChunkUpdates.isEnabled();
}

相关条目