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