字体批处理(client/font/)

基本信息

属性 值
目录 com.gtnewhorizons.angelica.client.font
文件数 9
总行数 2651
主开关 AngelicaConfig.enableFontRenderer(默认 true,AngelicaConfig.java:122,@RequiresMcRestart)
入口 MixinFontRenderer.java:123(mixin 源集)
配置文件 FontConfig(见 FontConfig)
GUI client/gui/FontConfigScreen.java(不在本目录,见下)

它解决什么问题

原版 FontRenderer 每画一个字符就发一次 GL 绘制调用。GUI、物品名、告示牌文本大量重复字符,绘制调用数爆炸。Angelica 把字形先写进 Tessellator,再批量合并成极少的 draw call。

9 个文件全清单(集合运算)

# 文件 行数 种类 职责
1 BatchingFontRenderer.java 1574 public class 核心:包裹原版 FontRenderer,把字形绘制批量化
2 FontProviderCustom.java 314 public class implements FontProvider 自定义字体(TTF 等)→ 预生成图集
3 FontStrategist.java 205 public class 字体选择策略:在 MC / Unicode / 自定义字体间挑
4 ColorCodeUtils.java 177 public final class 颜色码 / & → § 转换工具
5 FontProviderUnicode.java 139 public class implements FontProvider, IResourceManagerReloadListener Unicode 补字字体
6 FontProviderMC.java 120 public class implements FontProvider 原版 ASCII 字形页
7 FontEffectRegistry.java 58 public final class 颜色码 → 字形特效注册表
8 CustomGlyphEffect.java 39 public interface 自定义字形特效契约
9 FontProvider.java 25 public interface 字体提供者 SPI

BatchingFontRenderer 占 2651 行中的 1574 行(59%) —— 本子系统高度集中在单一类。

唯一确认的入口点

src/mixin/java/com/gtnewhorizons/angelica/mixins/early/angelica/fontrenderer/MixinFontRenderer.java:123
  angelica$batcher = new BatchingFontRenderer(
      (FontRenderer)(Object) this, this.charWidth, this.colorCode, this.locationFontTexture);

new 搜索结果:只有 BatchingFontRenderer 有实例化点。 其余 8 个类在主源码树与 mixin 源集中均无 new 调用 —— 它们通过静态工厂或 FontStrategist 的选择逻辑被间接使用(见下)。

FontStrategist:字体选择策略

这是字体的分发中心。BatchingFontRenderer.java:123 调用 FontStrategist.isSplashFontRendererActive(underlying)。

被引用的静态方法(按引用点集合运算):

调用方 行 调用
BatchingFontRenderer :123 FontStrategist.isSplashFontRendererActive(underlying)
FontConfigScreen :26 FontStrategist.getAvailableFonts()(静态字段初始化)
FontConfigScreen :288 FontStrategist.reloadCustomFontProviders()
FontProviderUnicode :162、:170、:175 FontProviderUnicode.get()
FontProviderMC :158-159 FontProviderMC.get(true)(isSGA 时)

三个 FontProvider 实现

FontProviderCustom(314 行)—— 自定义字体

关键常量:

常量 值 行
FONT_DIR "fonts/custom/" :31
ATLAS_SIZE 128 :32
ATLAS_COUNT 512 :33
fontAtlases new FontAtlas[ATLAS_COUNT] :36、:98

即单个自定义字体的图集空间是 128 × 128 像素的格子,共 512 格(按 :89 循环推测为 16×32 或 32×16 排布,源码本轮未确认排布参数)。

InstLoader(:68-72)持有两个实例:

实例 用途 行
instance0 getPrimary() —— 主字体 :68、:71
instance1 getFallback() —— 回退字体 :69、:72

FontStrategist.java:81-83 遍历 ATLAS_COUNT 把两套图集打包成资源包条目。

FontProviderUnicode(139 行)

同时实现 FontProvider 与 IResourceManagerReloadListener —— 补字字体需要随资源重载刷新。get() 是单例式静态访问(FontStrategist 三处调用)。

FontProviderMC(120 行)

原版 ASCII 字形页。get(boolean) 带参(FontStrategist.java:158-159 传 true),isSGA 条件下优先使用。

FontEffectRegistry 与 CustomGlyphEffect

类 行数 关系
CustomGlyphEffect 39 public interface —— 特效契约
FontEffectRegistry 58 public final class,register(code, effect)

已知问题:FontEffectRegistry 的唯一可见调用点在测试源 src/test/java/.../FontEffectRegistryTest.java:21、:23、:24。测试断言:

断言 行 含义
assertFalse(FontEffectRegistry.register(code, NO_OP), "reserved code accepted: " + code) :21 保留码不可注册
assertFalse(FontEffectRegistry.register('0', NO_OP)) :23 '0' 是保留码
assertFalse(FontEffectRegistry.register('§', NO_OP)) :24 '§' 是保留码

即保留码至少包含 '0' 与 '§'。这 2 个常量在主源码里的定义位置本轮未确认。

ColorCodeUtils(177 行)

& → § 转换。门控 AngelicaConfig.enableAmpersandConversion(默认 true,AngelicaConfig.java:205-207)。测试 ColorCodeUtilsTest.java:21、:27、:32 显示它有 setConversionSuppressor(...) 钩子与 convertAmpersandToSectionX(String) 方法("&#ff0000Hello" → "§x§f§f§0§0§0§0Hello")。

颜色码特效配置

AngelicaConfig 中与字体特效相关的 6 个开关(全部 boolean):

字段 行
enableRGBColors :176
enableGradients :180
enableRainbow :184
enableWaveText :188
enableDinnerboneText :192
enableDropShadow :196

配套 waveAmplitude(float,@RangeFloat(min=1.0f, max=8.0f),AngelicaConfig.java:~124)—— 波浪文字振幅。

目录边界:GUI 不在本目录

字体配置的 GUI 屏幕 FontConfigScreen.java 位于 client/gui/,与 ScrollableGuiScreen、SliderClone、TracyOptionPages 等同属 GUI 子系统,不在 client/font/ 内。client/ 目录共 23 个文件,分 3 组:font/ 9 + gui/ 7 + rendering/ 7。

本条目只覆盖 client/font/ 9 个文件;client/gui/ 与 client/rendering/ 未成文(见交付 §⑦)。

耦合点

方向 目标 位置
入 MixinFontRenderer(early/angelica/fontrenderer/) :123
出 FontConfigScreen(client/gui/) :26、:288
出 TextureStitchEvent(EmissiveTextureAutoloader 同属 render/ 子系统) —
出 GLSM / Tessellator 批处理底层
出 API 层 无直接依赖(api/ 不含 font 相关)

已知问题

  1. FontEffectRegistry 的主源码调用点未找到:register 在主源码树内无调用,仅测试代码调用。注册流程可能经由 mixin 或反射,本仓库不可判定 —— 这是一个真实的覆盖盲点。
  2. 保留码 '0' 与 '§' 的定义位置未确认:只有测试断言,没有主源码常量。
  3. BatchingFontRenderer 单类 1574 行:占子系统 59%,是绝对的核心,也是维护负担与审阅难度的集中点。
  4. 8/9 个类无实例化点(见上):除 BatchingFontRenderer 外全部通过静态方法间接访问,可读性依赖 FontStrategist 的分发逻辑。
  5. ATLAS_SIZE = 128 / ATLAS_COUNT = 512 无注释:图集排布参数(如何把 512 个 128px 格子映射到实际贴图)本轮未确认,FontProviderCustom.java:89 的循环体未读。
  6. FontProviderUnicode 同时是 SPI 与资源重载监听器(:139 的双接口):职责混合,但 FontProvider 接口只有 25 行、不含重载契约,接口与方法集不匹配。

相关条目