ProgressDisplayer 实现

基本信息

属性 值
接口 alexiil.mods.load.ProgressDisplayer.IDisplayer
方法 open(Configuration)、displayProgress(text, percent, subText, subPercent)、close()
入口 ProgressDisplayer.start(File coremodLocation)
状态字段 currentText / currentPercent / currentSubText / currentSubPercent

接口契约

public interface IDisplayer {
    void open(Configuration cfg);
    void displayProgress(String text, float percent, String subText, float subPercent);
    void close();
}

ProgressDisplayer 通过 displayer = … 静态字段持有当前实现,displayProgress / close 都会转发到它。

三种实现

MinecraftDisplayerWrapper

  • 核心差异:客户端默认实现。MinecraftDisplayerWrapper 懒加载 MinecraftDisplayer(首次 displayProgress 时 new MinecraftDisplayer() + open(cfg))。
  • 多线程:默认 threadedRendering=true,渲染在独立 splash 渲染线程运行(共享 OpenGL 上下文)。关闭时启动一个 2 秒 Thread.sleep 守护线程,调用 MinecraftDisplayer.playFinishedSound 播放提示音。
  • 特殊处理:为避免 open() 内 mc.refreshResources() 重入 displayProgress,用 opening 布尔位重入守卫。
  • 使用场景:所有带 OpenGL 的客户端环境(默认)。

FrameDisplayer

  • 核心差异:纯 AWT/Swing 窗口。LoadingFrame.openWindow() 创建一个 JFrame,包含主进度条 + 副进度条两个 JProgressBar + 对应 JLabel。
  • 何时启用:仅当 useMinecraft=false 且 !GraphicsEnvironment.isHeadless() 时选用。
  • 限制:注释明确写到"设为 false 后界面变黑",所以这是最后回退方案。
  • 使用场景:无头渲染测试、OpenGL 不兼容的客户端。

LoggingDisplayer

  • 核心差异:把进度格式化为 "text (xx%) | subText (yy%)" 字符串,通过 BetterLoadingScreen.log.info 输出。
  • 何时启用:GraphicsEnvironment.isHeadless() 时(无 GUI 环境,例如 CI/服务端)。
  • 使用场景:自动化测试、专用服务器启动早期。

数值

数值 默认值 说明
提示音播放延迟 2000 ms close() 内守护 Thread.sleep(2000) 后播放

相关条目