调试分析器

调试分析器

Minecraft 提供调试分析器(Debug Profiler),它提供系统数据、当前游戏设置、JVM 数据、世界数据和各端的刻信息,以找出耗时的代码。对于希望定位卡顿来源的模组开发者和服务器管理员,这在分析 TickEvent 和需要逐刻更新的 BlockEntity 等内容时非常有用。

调试分析流程:F3+L 启动,默认 10 秒后停止并输出 debug/profiling ZIP;client 和 server 中的 profiling.txt 给出区段深度、名称、相对父区段和整个 tick 的耗时百分比;push/pop 标记自定义区段。

原创说明图,依据 Forge 1.21.x 官方文档 绘制。

使用调试分析器

按下调试快捷键 F3 + L 启动分析器。10 秒后它会自动停止;也可以再次按下快捷键提前停止。

注意:只能分析实际执行到的代码路径。要分析的 Entity 和 BlockEntity 必须存在于世界中,才会出现在结果里。

停止分析后,程序会在运行目录的 debug/profiling 子目录中创建一个 ZIP 文件。文件名按日期和时间格式化为 yyyy-mm-dd_hh_mi_ss-WorldName-VersionNumber.zip。

阅读分析结果

在每个端的文件夹(client 和 server)中,都有一个包含结果数据的 profiling.txt。文件顶部先给出运行时长(毫秒)以及这段时间内运行的刻数。下面是类似结果的片段:

[00] levels - 96.70%/96.70%
[01] |   Level Name - 99.76%/96.47%
[02] |   |   tick - 99.31%/95.81%
[03] |   |   |   entities - 47.72%/45.72%
[04] |   |   |   |   regular - 98.32%/44.95%
[04] |   |   |   |   blockEntities - 0.90%/0.41%
[05] |   |   |   |   |   unspecified - 64.26%/0.26%
[05] |   |   |   |   |   minecraft:furnace - 33.35%/0.14%
[05] |   |   |   |   |   minecraft:chest - 2.39%/0.01%

以上述 [02] tick - 99.31%/95.81% 为例:

部分 含义
[02] 区段的深度。
tick 区段名称。
99.31% 相对于父区段的耗时百分比。第 0 层是占一个刻的时间百分比;第 1 层是占其父区段的时间百分比。
95.81% 占整个刻的时间百分比。

分析自己的代码

调试分析器对 Entity 和 BlockEntity 提供基础支持。如果要分析其他内容,可能需要手动创建区段:

ProfilerFiller#push(yourSectionName : String);
// 要分析的代码
ProfilerFiller#pop();

可以从 Level、MinecraftServer 或 Minecraft 实例获取 ProfilerFiller 实例。然后在结果文件中搜索区段名称即可。

原文:Debug Profiler。

译注:上面的 ProfilerFiller#push / #pop 写法是原文的示意写法,并非可直接编译的 Java 代码。