离屏 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 节):
CapturingTesselatorcaptures 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();
}
相关条目
- 方块模型 API - 自定义
BakedModel的方块侧接口 - FalseTweaks 兼容 - 上面的
doTessSafetyChecks开关所在页