LWJGL2→LWJGL3 兼容层
基本信息
| 属性 | 值 |
|---|---|
| 主兼容包 | org.lwjglx |
| 手写 shim 文件数 | 138 |
| 自动生成 shim 文件数 | 258 |
生成的哑类文件数(org/lwjgl) |
182 |
| 定制重定向类数 | 6(me.eigenraven.lwjgl3ify.redirects) |
| 生成器源码 | src/util/java/me/eigenraven/lwjgl3ify/(4 个类) |
LWJGL3ify 的体量主要在这里:不是游戏内容,而是一整套把 LWJGL2 API 调用翻译到 LWJGL3 的代码。
功能
两类 org/lwjglx 兼容代码
| 来源 | 目录 | 文件数 | 内容 |
|---|---|---|---|
| 手写 | src/main/java/org/lwjglx/ |
138 | 人工维护的兼容实现 |
| 自动生成 | src/generated/java/org/lwjglx/ |
258 | 由 src/util/java 下的生成器产出 |
共 396 个文件。README 的描述是"A partially auto-generated compatibility shim redirecting lwjgl2 api calls into the matching lwjgl3 calls",并指出生成器在 src/util/java。
生成器 4 个类:
| 类 | 职责 |
|---|---|
JarApiSet |
描述 LWJGL2 / LWJGL3 两套 jar 的 API 集合 |
MethodMatcher |
方法签名匹配 |
MethodRedirector |
生成重定向方法体 |
ComparisonTool |
比对生成结果,入口 main(build.gradle.kts:347) |
build.gradle.kts:369-372 显示比对任务把 LWJGL2 与 LWJGL3 的 classpath 分别喂给 ComparisonTool,逐项传入 --2: / --3: / --M: 参数。
182 个 org/lwjgl 哑类
src/generated/java/org/lwjgl/ 下 182 个文件是占位桩,不是 LWJGL2 的完整实现。README 说明:“Dummy org/lwjgl/* classes matching the classes removed from lwjgl3 (e.g. Display) for mods that rely on finding them under that location in the classpath - e.g. for mixin metadata”。
典型例子:org/lwjgl/opengl/Display.java——LWJGL3 移除了 Display 窗口类,但很多 mod 的 mixin 目标元数据里写着 org.lwjgl.opengl.Display,找不到类就无法解析 mixin 目标,故保留同名空壳。
同目录下还有 LWJGLException、LWJGLUtil 及其内部类 LWJGLUtil$TokenFilter、BufferChecks、MemoryUtil、PointerWrapper / PointerWrapperAbstract、Sys,以及 input/(Controller、Controllers、Cursor、Keyboard、Mouse)与 openal/(ALCcontext、ALCdevice、EFX10、EFXUtil、OpenALException、Util)两个子包。
6 个定制重定向类
src/main/java/me/eigenraven/lwjgl3ify/redirects/ 共 6 个类,每个都有已核实的消费方:
| 类 | 消费方 | 说明 |
|---|---|---|
Pack200 |
LwjglRedirectTransformer 前缀表 |
Java 8 java.util.jar.Pack200 的重定向目标(LwjglRedirectTransformer.java:38)。类注释:“Redirection class for Java 8’s java.util.jar.Pack200 classes” |
LiteLoaderClassPathUtilities |
同上前缀表 | LiteLoader ClassPathUtilities 的重定向(:39) |
InvalidActivityException |
同上前缀表 | javax.activity.InvalidActivityException 的重定向(:40),类签名 extends java.rmi.RemoteException |
JarInputStream |
ForgePatchTransformer |
被 tfClassPatchManager 注入为新 owner(ForgePatchTransformer.java:106),绕开新 JDK 对 jar: 协议 URL 的限制 |
ProgressBar |
ForgePatchTransformer |
被 tfProgressBar 注入(ForgePatchTransformer.java:280) |
Desktop |
4 个 openurl mixin | 4 个 MixinGuiXxx 用 @ModifyConstant 把 java.awt.Desktop 换成它(各文件第 17-18 行) |
ProgressBar 内还有一个 public static final class ClientAccess(ProgressBar.java:15)。
OpenAL 兼容性修补
CommonProxy.runCompatHooks() 反射读取 COFHAccessTransformer 的 superClasses 映射,把 org/lwjgl/openal/OpenALException 与 org/lwjglx/openal/OpenALException 的父类强制改为 java/lang/RuntimeException(CommonProxy.java:14-19)。注释说明动机是"Fix crash with OpenComputers/COFHCore due to a class extending OpenALException"。
注意它同时处理 org/lwjgl/ 与 org/lwjglx/ 两个包名——前者是 LWJGL2 原始路径,后者是 LWJGL3ify 自己的 shim 包。
数值
| 数值 | 值 | 来源 |
|---|---|---|
org/lwjglx 手写文件 |
138 | git ls-files 'src/main/java/org/lwjglx/*' |
org/lwjglx 生成文件 |
258 | git ls-files 'src/generated/java/org/lwjglx/*' |
org/lwjglx 合计 |
396 | 上两行相加 |
org/lwjgl 哑类 |
182 | git ls-files 'src/generated/java/org/lwjgl/*' |
redirects 类 |
6 | git ls-files 'src/main/java/.../redirects/*' |
| 生成器类 | 4 | git ls-files 'src/util/*' |
非 lwjglx/lwjgl 的主源码文件 |
79 | git ls-files 'src/main/java/**' 中 org/lwjglx 之外的计数 |
| 仓库跟踪文件总数 | 717 | git ls-files | wc -l |
已知静默失败点
redirects 与 LwjglRedirectTransformer 的失败策略见 RFB 字节码转换器 的"交互"一节:转换失败只打 WARN,该类以未转换状态继续加载。
交互
| 触发 | 行为 |
|---|---|
| mod 调用 LWJGL2 API | 字节码中的 org/lwjgl/ 前缀被重定向到 org/lwjglx/ |
mod 的 mixin 目标写 org.lwjgl.opengl.Display |
由哑类占位,保证 mixin 元数据可解析 |
mod 访问已从 JRE 移除的 javax.xml.bind |
重定向到 jakarta.xml.bind(该包在 jar 中 shade 并被类加载器排除) |
| mod 使用 LiteLoader | ClassPathUtilities 重定向到本仓库实现(README 声明需 Midnight145 的 LiteloaderLoader) |
| 同时装了 OpenComputers 与 COFHCore | 修补 OpenALException 继承关系避免崩溃 |
相关条目
- RFB 字节码转换器 - 执行上述重定向的 4 个转换器
- SDL 输入与窗口 Mixin -
redirects.Desktop的 4 个使用方 - 第三方兼容钩子 - CoFH AT 修补的完整说明