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) 后播放 |
相关条目