字体批处理(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 相关) |
已知问题
FontEffectRegistry的主源码调用点未找到:register在主源码树内无调用,仅测试代码调用。注册流程可能经由 mixin 或反射,本仓库不可判定 —— 这是一个真实的覆盖盲点。- 保留码
'0'与'§'的定义位置未确认:只有测试断言,没有主源码常量。 BatchingFontRenderer单类 1574 行:占子系统 59%,是绝对的核心,也是维护负担与审阅难度的集中点。- 8/9 个类无实例化点(见上):除
BatchingFontRenderer外全部通过静态方法间接访问,可读性依赖 FontStrategist 的分发逻辑。 ATLAS_SIZE = 128/ATLAS_COUNT = 512无注释:图集排布参数(如何把 512 个 128px 格子映射到实际贴图)本轮未确认,FontProviderCustom.java:89的循环体未读。FontProviderUnicode同时是 SPI 与资源重载监听器(:139的双接口):职责混合,但FontProvider接口只有 25 行、不含重载契约,接口与方法集不匹配。
相关条目
- FontConfig - 字体配置分类
- AngelicaModulesConfig -
enableFontRenderer+ 6 个特效开关 - Angelica mixin 分组 -
fontrenderer/mixin 目录 - render/ 子系统 - 同在
client大包下的另一子组 - Proxy -
init()时序参照 - KeyBinding 注册总表 - 本子系统不注册按键