启动错误界面(Minecraft failed to start!)
基本信息
| 属性 | 值 |
|---|---|
| 类 | vfyjxf.bettercrashes.utils.GuiInitErrorScreen → GuiProblemScreen |
| 标题 | bettercrashes.gui.init_error.title = “Minecraft failed to start!” |
| 摘要 | “An error during startup prevented Minecraft from starting.” |
| 触发 | Minecraft.startGame() 抛任何 Throwable(MinecraftMixin.java:172-179) |
与崩溃界面的关键差别
这是唯一一个真的自带 GUI 主循环的界面。startGame() 失败时
entityRenderer / fontRenderer / mcResourceManager 往往还没建好,
所以 MinecraftMixin.betterCrashes$displayInitErrorScreen(:321-357)
会手工重建整套渲染管线:
- 新建
SimpleReloadableResourceManager+TextureManager - 新建
LanguageManager(用gameSettings.language) refreshResources()- 新建
FontRenderer(textures/font/ascii.png) - 新建
SoundHandler SplashProgress.finish()关掉 Forge 启动进度条betterCrashes$runGUILoop()跑一个独立于游戏主循环的 GUI 循环
自带的 GUI 主循环
MinecraftMixin.betterCrashes$runGUILoop(:363-418)手写了渲染流程:
glClear(16640) → 绑定 framebuffer → 建正交投影
(glOrtho(0, scaledW, scaledH, 0, 1000, 3000),z 平移 -2000)→
currentScreen.drawScreen(...) → 渲染 framebuffer →
func_147120_f() → Display.sync(60) → checkGLError("BetterCrashes GUI Loop")。
循环退出条件:running && currentScreen != null && !(currentScreen instanceof GuiMainMenu)
—— 所以这个界面没有退出按钮(见下),只能靠关闭游戏窗口
(Display.isCloseRequested() → System.exit(0))离开。
按钮
⚠️ 与崩溃界面不同:GuiInitErrorScreen.initGui 完全覆写了基类实现,
自己造了两个按钮,只有 2 个:
| id | 文本 | 尺寸 | 位置 |
|---|---|---|---|
| 1 | Open Crash Report | 150×20 | width/2 - 155 |
| 2 | Upload and copy link | 150×20 | width/2 - 155 + 160 |
⇒ 没有 “Return to main menu”(游戏也没起来),
也没有 “Open bug tracker”(issueTrackerURL 非空时基类会加,这里被覆写掉了)。
按钮宽度 150 而基类是 110,横向间距 160 而基类是 115。
源码核对(2026-10-01 审计)
- ⚠️ 源码缺陷(死代码):
GuiInitErrorScreen.actionPerformed(:46-49) 整个方法体只有super.actionPerformed(button);,是纯粹的空覆写,可删。 - ⚠️ 源码缺陷(重复实现):
initGui用硬编码的裸魔数 1 和 2 重建了基类的OPEN_CRASH_REPORT_BUTTON_ID/UPLOAD_REPORT_AND_COPY_LINK_BUTTON_ID两个私有常量,未复用基类逻辑 ⇒ 基类调整按钮文案或位置时此界面不会同步。 - ⚠️ 该界面不可关闭这一点与
README.md描述的 “makes Minecraft return you to the main menu when it crashes” 不完全一致: 主菜单返回只适用于运行期崩溃,不适用于启动期失败。 GuiInitErrorScreen的按钮仍会走基类actionPerformed的上传逻辑 (它先调super),所以启动失败也可以上传并复制报告链接。