
加载性能分析器
配置文件 游戏引导 / 加载 / 启动时间
Discord:https://discord.gg/BCHNhsDMXz
本模组提供游戏加载时间的细分以及每个模组的加载时间。
加载时间的分析完全基于代码使用情况,因此资源加载(方块模型)、Mixin 以及 Fabric 模组(如果你使用 Sinytra)都会被计入原版加载时间中。
请勿在加载现有世界时使用本模组。由于本模组具有侵入性,在世界加载期间可能无法与某些模组兼容。本模组仅应用于性能分析与分析目的。
游戏加载是如何工作的?
游戏加载有三个主要阶段:
- 模组加载器初始化
- Minecraft 引导(原版初始化 + 模组初始化)
- 资源重载(资源加载 + 模组加载)
模组加载器初始化
在此阶段,Forge 模组加载器将初始化必要的服务,例如 accesstransformer、coremod、Mixin 以及本模组。在此阶段,会对模组文件进行初步扫描,但没有服务的模组不会被加载。本模组将此阶段拆分为 5 个步骤:
- 服务初始化:这是第一个步骤,应该很快。
- 服务加载:某些模组服务可能在此处执行工作,导致加载时间变长。
- 模组扫描:如果你没有其他服务模组,这将是你会看到的第一个步骤。
- 启动插件工作:在此步骤中,会扫描模组代码以收集基本信息。
- Transformer 类加载器工作:在此步骤中,accesstransformer、coremod 和 Mixin 将开始加载。如果你有大量 Mixin 或 coremod,这可能需要很长时间。
游戏引导
在此阶段,Minecraft 和模组代码开始加载。由于这些阶段中的任何一个都可能被 Mixin 显著改变,因此被拆分为 17 个步骤。提供详细的细分将有助于识别加载缓慢的原因。
- 客户端早期初始化:在此步骤中,不会加载任何游戏内容代码。此处的加载时间主要受 Mixin 影响。
- 原版引导开始:在此步骤中,加载原版游戏内容(方块、物品)。大约需要 1 秒左右。如果你看到此处耗时较长,可能是 Fabric 模组导致的。
- 加载用户 / 选项:在此步骤中,Minecraft 加载用户配置文件和客户端选项。应该很快,此处会加载许多类,因此会触发更多 Mixin 加载。它主要应该是 Mixin 加载。
- Minecraft 客户端初始化:在此步骤中,Minecraft 初始化其客户端基础设施。与上一阶段相同,在原版中很快,但由于会加载许多类,因此会触发更多 Mixin 加载。
- 加载语言:此处游戏加载 Minecraft 和 Forge 语言文件。应在 20 毫秒以内。
- 构建模组:实际模组初始化的开始。在此步骤中,模组正在被构建。实际模组加载过程中每个模组的精确细分将在后续提供。由于模组是并行加载的,模组加载的实际持续时间(实际时间)将短于每个模组所分析的模组加载时间(线程时间)。
- 创建注册表:在此步骤中,拥有自定义注册表的模组将初始化它们。
- 收集对象持有者:在此步骤中,模组注册它们的对象持有者。这是注册过程的一部分。
- 注入能力:在此步骤中,定义了 Capability 的模组将初始化它们。
- 加载注册表:在此步骤中,模组将它们的游戏对象注册到注册表中。这是模组初始化的最后一步。
- 收集模组资源包:在此步骤中,模组向游戏添加可选(默认启用或未启用)资源包。某些模组可能在此处执行工作。
- 收集任务:在此步骤中,Minecraft 和模组将它们的任务(重载监听器)注册到重载管理器。通常很快,但如果你发现它很慢,可能是因为模组在此处实际执行加载而不是注册加载器。(这是糟糕的编码)
- 设置 GUI:设置原版 GUI 组件。应该很快。
- 分发客户端事件:在此步骤中,有大量模组事件被分发给模组。
- 原版客户端设置:杂项原版客户端设置,例如旁白。
- 初始化任务:在此步骤中,Minecraft 开始初始化任务(重载监听器)。如果你发现此步骤很慢,这意味着某些模组在此处执行工作,而不是在实际的任务处理过程中执行。(这是糟糕的编码)
- 设置加载界面:初始化加载界面中的“MOJANG”文本。游戏引导的最后一步。
资源重载
在此阶段,任务被收集并并行执行。将提供每个任务耗时的详细分析。所有任务的总时间可能短于重载过程,其比率就是你的线程利用率。如果你的利用率为 400%,这意味着有 4 个 CPU 在不停并行运行以处理所有任务,因此原本由 1 个 CPU 运行需要 120 秒的任务,你只需 30 秒即可完成。
值得注意的是,此处最慢的任务应该是 ModelManager。ModelManager 负责加载游戏中的所有方块模型,此过程被拆分为 10 个阶段。
- 读取 json:模型加载器从原版、模组和资源包读取 json 模型文件。
- 解析 json:模型加载器将 json 文件解析为 UnbakedModel。
- 添加模组特殊模型:模组添加它们自己的特殊模型。
- 解析层级:处理 UnbakedModel 以分配父级。
- 拼接纹理:将所有纹理合并为一张大纹理。此过程与读取 json 并行进行。如果你发现此阶段不耗时,意味着它比前 4 个阶段更早完成。
- 烘焙模型:在此阶段,模型被附加纹理信息,形成 BakedModel。
- 模组修改模型:模组可以在此处修改 BakedModel。
- 将模型分配给方块:在此阶段,模型被分配给方块状态。如果你有大量方块状态,这可能会很慢。
- 等待屏障:等待其他任务完成。
- 上传拼接纹理:将拼接后的纹理上传到 GPU。某些模组可能在此处执行工作。
如何阅读分析报告?
一旦你使用本模组运行游戏,它将在 logs/profiler/loading-
报告中有 2 个部分:摘要和详情。摘要是详情的简略版本,因此我只解释详情部分。
游戏引导
本节显示阶段 1(模组加载器初始化)和阶段 2(Minecraft 引导)各步骤的持续时间。此处总共有 22 个步骤。通常较慢的步骤应该是:
- Transformer 类加载器工作(Mixin)
- 构建模组(模组初始代码)
- 加载注册表(模组将游戏内容对象注册到注册表)
示例格式:
Game takes <xxx> seconds to bootstrap
<Stage>: <xxx> ms
...
重载管理器(任务)
本节显示完成所有任务的总执行时间,以及各个任务的执行时间。通用任务将首先显示,然后是模组特定任务。在详细视图中,每个任务将显示 2 个数字:主线程时间和总线程时间。主线程时间是指任务在主线程中执行所花费的时间,用于那些无法并行运行的操作,例如修改游戏对象的数据。总线程时间是指此任务占用 CPU 的总时间。如果此任务被拆分为多个部分并由多个 CPU 同时执行,则它可能长于总执行时间。
示例格式:
Reload Manager takes <xxx> seconds, loading <xxx> tasks
Tasks are processed in parallel using multiple threads.
- <Task>: <main thread time> / <total time>
...
Misc <xxx> Tasks: <xxx> ms / <xxx> ms
Model Analyzer: <xxx> ms / <xxx> ms
Main thread utilization: xx%
Off thread utilization: xx%
Idle time: <xxx> ms
杂项任务是指运行时间非常短的任务。显示所有任务会导致报告过于臃肿,因此我在此处只显示所有这些任务的总和。
Model Analyzer 是本模组添加的一个任务,用于分析模型的来源。如果你发现它耗时过长,它将有助于显示哪个模组添加了大量需要加载的模型。此任务应占 ModelManager 时间的 <10%。
主线程利用率:主线程被用于加载任务的程度。如果你发现它很高,这意味着有模组在主线程中执行缓慢任务,这不应该发生。
离线程利用率:实际用于执行所有任务的 CPU 数量。
空闲时间:没有任何任务运行的时间。可能是由于模组为其任务分配了错误的执行器,导致本模组无法判断是谁在运行。
模组加载时间
本节显示每个模组初始化和加载的时间。请注意,这仅计入模组构建和模组事件。Mixin 和 Fabric 模组不在此计入。
耗时超过 0.1 秒的模组将被列出,耗时超过 1 秒的模组还将列出详情。详情将包括构建时间(通常是最长的)和模组事件时间(模组通常在每个事件期间执行工作,以便它们在正确的时间发生)。
示例格式:
Mods use <xxx> seconds to initialize
(Explanations)
Mods use <xxx> seconds to load
Mod init takes <xxx> seconds CPU time. Thread utilization: xx%
- <modid>: <xxx> ms
| - <process>: <xxx> ms
- <modid>: <xxx> ms
Misc <xxx> mods: <xxx> ms
模型管理器
本节显示模型管理器 10 个加载阶段的时间细分。
“添加模组特殊模型”和“模组修改模型”阶段通常非常快,但如果模组大量添加或修改方块模型,则可能会很慢。
示例格式:
Model Load Time per Stage:
- <Stage>: <xxx> ms
Found <xxx> packs
Loaded <xxx> model files with total size of <xxx> KB
Baked <xxx> models
- <mod jar or resource pack zip>: <xxx> KB
Misc <xxx> packs: <xxx> KB
- 包:指模组、资源包以及模组提供的可选资源包
- 模型文件:“assets//models/”文件夹下的模型 json 文件
- 烘焙模型:已烘焙的模型。如果多个模型使用相同的模型文件但使用不同的纹理,烘焙模型的数量可能多于模型文件。但由于大多数模型的纹理在模型文件中指定,因此数量不应相差太多(除非模型是由代码添加的)。
- 杂项包:太小而无法显示的包。本模组将它们的体积合计在一起。
正在加载版本记录…
正在加载评论…
评论在新手盒子客户端中发表,这里同步展示。