密度函数 GPU 调试窗口
基本信息
| 属性 | 值 |
|---|---|
| 打开方式 | 指令 /datapack gpu-debug(DatapackCommand.java:80-84) |
| 实现类 | databack.common.worldgen.debug.DFDebugWindow(513 行,extends javax.swing.JFrame) |
| UI 框架 | Java Swing(AWT),非 Minecraft GUI |
| 单例 | 静态 instance,open() 中若为 null 或 !isDisplayable() 则新建(DFDebugWindow.java:46-56) |
| 线程要求 | 任意线程可调用,内部走 SwingUtilities.invokeLater |
| 伴随包 | ChunkDebugCapture、DebugCaptureStore、KernelRecord(同目录) |
| 依赖库 | mcgpu.core.hwaccel.buffer.BufferDataType(MCGPU) |
功能
对走 MCGPU 加速的密度函数求值过程做离屏抓取与回放。它面向模组开发者而非普通玩家:普通游玩中不会自动弹出,只有显式执行 /datapack gpu-debug 才会打开。
打开流程
DatapackCommand.processCommand 在参数栈顶部为 gpu-debug 时提前返回,位置在世界查找之前(DatapackCommand.java:79-84):
// gpu-debug does not need world/pack state — handle before the world lookup.
if ("gpu-debug".equals(argStack.peek(0))) {
DFDebugWindow.open();
sender.addChatMessage(new ChatComponentText("Opening GPU debug window."));
return;
}
因此该子命令不需要世界已加载,在指令层面不依赖数据包状态。DFDebugWindow.open() 为 public static synchronized,内部 SwingUtilities.invokeLater(() -> { instance.setVisible(true); instance.toFront(); })(DFDebugWindow.java:46-56)。
界面布局
类头部 javadoc 给出的 ASCII 布局图(DFDebugWindow.java:19-43)与源码一致:
| 区域 | 控件 | 源码 |
|---|---|---|
| 外层 | JSplitPane.HORIZONTAL_SPLIT,setDividerLocation(280) |
DFDebugWindow.java:91-92 |
| 左栏 | 4 个按钮 + 区块列表 | DFDebugWindow.java:107-110 |
| 右栏 | JTabbedPane,5 个标签页 |
DFDebugWindow.java:148-183 |
左栏按钮
| 按钮文本 | 源码行 |
|---|---|
Enable Capture |
DFDebugWindow.java:107 |
Disable Capture |
DFDebugWindow.java:108 |
Replay Chunk |
DFDebugWindow.java:109 |
Clear All |
DFDebugWindow.java:110 |
左栏下方是区块列表,模型为 DefaultListModel<ChunkDebugCapture> chunkListModel(DFDebugWindow.java:58)。
右栏标签页
| 标签页 | 内容 | 源码行 |
|---|---|---|
Kernels |
内核表格(KernelTableModel 包在 JScrollPane 中) |
DFDebugWindow.java:162 |
GLSL |
GLSL 源码区 | DFDebugWindow.java:169 |
Values |
数值表格 | DFDebugWindow.java:174 |
Heatmap |
热力图面板 | DFDebugWindow.java:178 |
DF Map |
密度函数映射表格 | DFDebugWindow.java:183 |
注:javadoc 的 ASCII 图(DFDebugWindow.java:31)只画了 4 个标签页 Kernels | GLSL | Values | Heatmap,而源码中实际 addTab 调用有 5 个(多出 DF Map,DFDebugWindow.java:183)。此处以源码为准。
交互
| 触发 | 行为 |
|---|---|
/datapack gpu-debug |
打开或前置已存在的窗口,聊天框回显 Opening GPU debug window. |
| 未选择区块即回放 | 弹出 JOptionPane.showMessageDialog(this, "Select a chunk first.", "Replay", ...)(DFDebugWindow.java:209) |
| 关闭窗口 | instance.isDisplayable() 变 false,下次 open() 重新构造新实例(DFDebugWindow.java:47) |
相关类
| 类 | 作用 |
|---|---|
DebugCaptureStore |
抓取数据仓库;注释写明由 ModernWorldGenerator 在构造 GpuChunkCache 之后注册与回调(DebugCaptureStore.java:39、62) |
ChunkDebugCapture |
单个区块的抓取记录,同时被 MCGPU 侧引用(mcgpu 命中) |
KernelRecord |
单个已编译内核的记录 |
KernelTableModel |
DFDebugWindow 内部类,驱动 Kernels 标签页表格(DFDebugWindow.java:59) |
MCGPU 相关代码分布在密度函数 DAG 与代码生成包中:DFDagBuilder2、DensityFunctionExecutor、KernelDispatchListener、BarrierBuffer、codegen(SplineEmitter、ExprEmitter、KernelBodyEmitter、CodeGenContext、GeneratedKernel、VulkanCodeGen)、DFPlanBuilder、BarrierDFCodeGenerator,以及世界生成侧的 ModernWorldGenerator、GpuChunkCache。
相关条目
- /datapack 指令 - 5 个子命令的完整表
- 依赖与集成 - MCGPU 是硬依赖,GTNHLib 提供事件总线