Как работает загрузка игры?
Процесс загрузки игры включает три основные фазы:
- Инициализация загрузчика модов
- Начальная загрузка Minecraft (базовые настройки Vanilla + инициализация модов)
- Перезагрузка ресурсов (загрузка ресурсов + загрузка модов)
Инициализация загрузчика модов
На этом этапе Forge Mod Loader инициализирует необходимые сервисы, такие как AccessTransformer, coremod, mixins, и данный мод. Происходит первичное сканирование файлов модов, но моды без сервисов не загружаются. Данный мод разделяет эту фазу на 5 стадий:
- Инициализация сервисов: Первая стадия, обычно быстрая.
- Загрузка сервисов: Некоторые сервисы модов могут выполнять работу здесь, что может замедлить загрузку.
- Сканирование модов: Если нет других сервисных модов, это будет первая видимая стадия.
- Работа плагинов запуска: На этой стадии сканируется код модов для сбора базовой информации.
- Работа загрузчика классов трансформера: Загружаются AccessTransformers, coremods и mixins. Может занимать много времени при большом количестве mixins или coremods.
Начальная загрузка игры (Game Bootstrap)
На этой фазе начинается загрузка кода Minecraft и модов. Она разделена на 17 стадий из-за возможности значительного изменения любой из них mixins. Детализация помогает выявить причины медленной загрузки.
- Ранняя инициализация клиента: Код игрового контента еще не загружен. Время загрузки здесь в основном определяется mixins.
- Начало загрузки Vanilla: Загружается игровой контент Vanilla (блоки, предметы). Обычно занимает ~1 секунду. Большее время может указывать на влияние Fabric-модов.
- Загрузка пользователя / настроек: Загружаются профиль пользователя и настройки клиента. Должна быть быстрой, но загрузка многих классов активирует mixins.
- Инициализация клиента Minecraft: Инициализируется клиентская инфраструктура Minecraft. Быстрая в Vanilla, но загрузка классов активирует дополнительные mixins.
- Загрузка языков: Загрузка языковых файлов Minecraft и Forge. Обычно менее 20 мс.
- Создание модов (Constructing Mods): Начало фактической инициализации модов. Моды создаются (конструируются). Детализация по модам будет позже. Так как моды загружаются параллельно, фактическое время загрузки модов будет меньше профилируемого времени (время потока).
- Создание реестров (Creating Registries): Моды с пользовательскими реестрами инициализируют их.
- Сбор Object Holders (только 1.20): Моды регистрируют свои Object Holders.
- Внедрение Capabilities (только 1.20): Инициализация Capabilities, определённых модами.
- Загрузка реестров (Loading Registries): Моды регистрируют свои игровые объекты в реестрах.
- Замораживание реестров (Freezing Registries) (только 1.21+): Реестры замораживаются, моды выполняют финальные операции над записями (например, расчет форм блоков).
- Завершение регистрации (Registration Complete) (только 1.21+): Регистрация завершена, некоторые моды выполняют пост-регистрационные задачи.
- Сбор модифицированных ресурсных пакетов (Gather Modded Resource Packs): Моды добавляют опциональные ресурсные пакеты. Некоторые моды могут выполнять работу здесь.
- Сбор задач (Gather Tasks): Minecraft и моды регистрируют свои задачи (слушатели перезагрузки) в менеджере перезагрузки. Обычно быстро, но может быть медленным, если моды загружаются вместо регистрации загрузчиков (плохая практика).
- Настройка GUI: Настройка компонентов GUI Vanilla. Должна быть быстрой.
- Отправка клиентских событий (Dispatch Client Events): Отправка множества событий модов.
- Настройка клиента Vanilla: Различные настройки клиента Vanilla (например, диктор).
- Инициализация задач (Initializing Tasks): Начало инициализации задач (слушателей перезагрузки). Замедление указывает на выполнение работы модами на этом этапе вместо процесса задачи (плохая практика).
- Настройка экрана загрузки (Setup Loading Screen): Инициализация текста "MOJANG" на экране загрузки. Последний этап начальной загрузки игры.
Перезагрузка ресурсов (Resource Reload)
На этой фазе задачи собираются и выполняются параллельно. Профилируется время выполнения каждой задачи. Суммарное время всех задач может быть меньше времени процесса перезагрузки. Отношение показывает коэффициент использования потоков. Коэффициент 400% означает, что 4 процессора работали параллельно без простоев, сократив время выполнения задач, которые заняли бы 120 секунд на одном ядре, до 30 секунд.
Самой медленной задачей обычно является ModelManager, отвечающий за загрузку всех моделей блоков. Этот процесс разбит на 10 стадий:
- Чтение JSON: Загрузчик моделей читает JSON-файлы из Vanilla, модов и ресурсных пакетов.
- Разбор JSON: JSON-файлы преобразуются в UnbakedModel.
- Добавление специальных моделей модов: Моды добавляют свои специальные модели.
- Разрешение иерархии: Обработка UnbakedModel для назначения родительских моделей.
- Сшивание текстур (Stitching Textures): Объединение всех текстур в одну большую текстуру. Выполняется параллельно с чтением JSON. Если стадия занимает мало времени, значит завершилась раньше предыдущих 4 стадий.
- Запекание моделей (Baking models): К моделям добавляется информация о текстурах, формируя BakedModel.
- Изменение моделей модами: Моды могут изменять BakedModels.
- Назначение моделей блокам: Модели назначаются состояниям блоков. Может быть медленным при большом количестве состояний.
- Ожидание барьера (Waiting for barrier): Ожидание завершения других задач.
- Загрузка сшитой текстуры (Uploading stitch): Загрузка сшитой текстуры в GPU. Некоторые моды могут выполнять работу здесь.
Как читать отчет профилирования?
После запуска игры с этим модом в папке logs/profiler/ будет сгенерирован отчет loading-<время>.txt.
Отчет содержит 2 раздела: Сводка (Summary) и Детали (Detail). Сводка является сокращенной версией детального отчета.
Раздел 1: Начальная загрузка игры (Game Bootstrap)
В этом разделе отображается длительность этапов фазы 1 (инициализация загрузчика модов) и фазы 2 (начальная загрузка Minecraft). Всего 22 этапа. Обычно медленными являются:
- Transformer Class Loader Working (mixin)
- Constructing Mods (начальный код модов)
- Loading Registries (регистрация объектов игрового контента модами в реестре)
Формат примера:
Игра загружается за <xxx> секунд
<Этап>: <xxx> мс
...
Раздел 2: Менеджер перезагрузки (Задачи)
В этом разделе отображается общее время выполнения всех задач и время выполнения отдельных задач. Сначала перечисляются общие задачи, затем задачи конкретных модов. В детальном представлении для каждой задачи указываются два числа: время основного потока (main thread time) и общее время потока (total thread time). Время основного потока — время, затраченное на выполнение задач в основном потоке (для операций, которые нельзя распараллелить, например, изменение данных игровых объектов). Общее время потока — общее время занятости CPU этой задачей. Может превышать общее время выполнения, если задача разбита на части, выполняемые параллельно несколькими процессорами.
Формат примера:
Менеджер перезагрузки выполняется <xxx> секунд, загружая <xxx> задач
Задачи обрабатываются параллельно с использованием нескольких потоков.
- <Задача>: <время основного потока> / <общее время>
...
Разные <xxx> задач: <xxx> мс / <xxx> мс
Model Analyzer: <xxx> мс / <xxx> мс
Использование основного потока: xx%
Использование других потоков: xx%
Время простоя: <xxx> мс
"Разные задачи" (Misc Tasks) — задачи, выполняемые очень быстро. Для избежания перегруженности отчета они суммируются.
Model Analyzer — задача, добавляемая данным модом для анализа происхождения моделей. Помогает определить, какой мод добавляет много моделей для загрузки, если это занимает слишком много времени. Эта задача должна занимать <10% времени ModelManager.
Использование основного потока (Main thread utilization): степень использования основного потока для задач загрузки. Высокий процент указывает на медленные задачи модов, выполняемые в основном потоке (чего следует избегать).
Использование других потоков (Off thread utilization): эффективное количество используемых CPU для выполнения задач.
Время простоя (Idle time): время, в течение которого задачи не выполнялись. Может быть вызвано неправильным назначением исполнителя задачам модами.
Раздел 3: Время загрузки модов
В этом разделе отображается время инициализации и загрузки каждого мода. Учитывается только создание модов и обработка их событий. Mixins и Fabric-моды здесь не учитываются.
Перечисляются моды, занявшие более 0.1 секунды. Моды, занявшие более 1 секунды, детализируются. Детализация включает время создания (обычно самое долгое) и время обработки событий (моды обычно выполняют работу во время событий).
Формат примера:
Моды используют <xxx> секунд для инициализации
(Пояснения)
Моды используют <xxx> секунд для загрузки
Инициализация модов занимает <xxx> секунд процессорного времени. Использование потоков: xx%
- <modid>: <xxx> мс
| - <процесс>: <xxx> мс
- <modid>: <xxx> мс
Разные <xxx> модов: <xxx> мс
Раздел 4: Менеджер моделей (Model Manager)
В этом разделе показана детализация времени по 10 стадиям загрузки менеджера моделей.
Стадии "Добавление специальных моделей модов" и "Изменение моделей модами" обычно очень быстрые, но могут замедляться, если моды активно добавляют или изменяют модели блоков.
Формат примера:
Время загрузки моделей по стадиям:
- <Стадия>: <xxx> мс
Найдено <xxx> пакетов
Загружено <xxx> файлов моделей общим размером <xxx> КБ
Запечено <xxx> моделей
- <JAR мода или ZIP ресурсного пакета>: <xxx> КБ
Разные <xxx> пакетов: <xxx> КБ
- Пакеты: моды, ресурсные пакеты, опциональные ресурсные пакеты модов.
- Файл модели: JSON-файлы моделей в папке "assets/<modid>/models/"
- Запеченные модели (Baked models): обработанные модели. Их количество может превышать количество файлов моделей, если несколько моделей используют один файл с разными текстурами. Для большинства моделей текстура указана в файле, поэтому числа не должны сильно различаться (кроме моделей, добавляемых кодом).
- Разные пакеты: пакеты, слишком маленькие для отображения. Их размер суммируется.