启动错误界面(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) 会手工重建整套渲染管线:

  1. 新建 SimpleReloadableResourceManager + TextureManager
  2. 新建 LanguageManager(用 gameSettings.language)
  3. refreshResources()
  4. 新建 FontRenderer(textures/font/ascii.png)
  5. 新建 SoundHandler
  6. SplashProgress.finish() 关掉 Forge 启动进度条
  7. 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),所以启动失败也可以上传并复制报告链接。