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) 后播放 |
相关条目
- Coremod 安装 - 决定选择哪个实现
- Minecraft 渲染线程 - threadedRendering 选项
- 完成提示音 - playSound / sound 配置