调试分析器
Minecraft 提供调试分析器,可显示系统数据、当前游戏设置、JVM 数据、世界数据以及各端的刻(tick)信息,帮助找出耗时的代码。对于想定位卡顿来源的 Mod 开发者和服务器管理员,这项功能很有用,尤其适用于分析 TickEvent 和逐刻更新的 BlockEntity。
使用调试分析器
按下调试快捷键 F3 + L 即可开始分析。10 秒后会自动停止,也可以再次按下快捷键提前停止。
提示 分析器只能记录实际执行到的代码路径。要分析的
Entity和BlockEntity必须存在于世界中,才会出现在结果里。
停止分析后,程序会在运行目录的 debug/profiling 子目录中创建 ZIP 文件,文件名格式为 yyyy-mm-dd_hh_mi_ss-WorldName-VersionNumber.zip。
阅读分析结果
在每个端的文件夹(client 和 server)中,都能找到包含结果数据的 profiling.txt 文件。文件顶部会说明分析持续了多少毫秒,以及这段时间内运行了多少刻。
下面是结果片段示例:
[00] tick(201/1) - 41.46%/41.46%
[01] | levels(201/1) - 96.62%/40.05%
[02] | | ServerLevel[New World] minecraft:overworld(201/1) - 98.80%/39.58%
[03] | | | tick(201/1) - 99.98%/39.57%
[04] | | | | entities(201/1) - 56.83%/22.49%
[05] | | | | | tick(44717/222) - 95.81%/21.54%
[06] | | | | | | minecraft:skeleton(4585/23) - 13.91%/3.00%
[07] | | | | | | | #tickNonPassenger 4585/22
[07] | | | | | | | travel(4573/23) - 33.12%/0.99%
[08] | | | | | | | | #getChunkCacheMiss 7/0
[08] | | | | | | | | #getChunk 47227/234
[08] | | | | | | | | move(4573/23) - 40.10%/0.40%
[09] | | | | | | | | | #getEntities 4573/22
[09] | | | | | | | | | #getChunkCacheMiss 1353/6
[09] | | | | | | | | | #getChunk 28482/141
[08] | | | | | | | | unspecified(4573/23) - 36.24%/0.36%
[08] | | | | | | | | rest(4573/23) - 23.66%/0.23%
[09] | | | | | | | | | #getChunkCacheMiss 59/0
[09] | | | | | | | | | #getChunk 65867/327
[09] | | | | | | | | | #getChunkNow 531/2
由 ProfilerFiller#push 和 pop 产生的某些条目形如 [03] tick(201/1) - 99.98%/39.57%,各部分含义如下:
[03]:区段深度。tick:区段名称。- 如果该段时间没有关联子区段,则为
unspecified。
- 如果该段时间没有关联子区段,则为
201:分析器运行期间调用该区段的次数。1:每个 tick 平均调用该区段的次数,向下取整。99.98%:相对于父区段的耗时比例。- 第 0 层表示占一个 tick 的时间比例。
- 第 1 层表示占父区段的时间比例。
39.57%:占整个 tick 的时间比例。
由 ProfileFiller#incrementCounter 产生的另一些条目形如 [07] #tickNonPassenger 4585/22,含义如下:
[07]:区段深度。#tickNonPassenger:正在递增的计数器名称。#会自动添加。
4585:分析器运行期间递增该计数器的次数。22:每个 tick 平均递增该计数器的次数,向下取整。
分析自己的代码
调试分析器对 Entity 和 BlockEntity 提供基本支持。要分析其他内容,可能需要手动创建区段,例如:
Profiler.get().push("yourSectionName");
//The code you want to profile
Profiler.get().pop();
之后只需在结果文件中搜索自己的区段名称。
来源: NeoForged/Documentation(26.1)。中文翻译依据提交
4a680cdd4d15。