Оптимизация InventoryChangeTrigger
Основные сведения
- Оптимизирует активацию достижений при получении предметов;
- Может нарушить полное соответствие с ванильной версией, но не затрагивает ванильные достижения и не должен влиять на подавляющее большинство модов/датапаков;
- Даже в случае влияния, достижение останется доступным для получения путем сбрасывания и подбирания одного из требуемых предметов;
- На данный момент неизвестны несовместимости или проблемы;
- Каждая инъекция в ванильный код может быть отключена в файле конфигурации.
- Все изменения реализованы на стороне сервера.
Результаты
Тестирование в реальных условиях на выделенном сервере с 3 активными игроками, использующем пользовательский сборку Forge с более чем 200 модами и BlazeandCave's Advancements Pack, добавляющим более 950 достижений. Данные собраны с помощью Spark в течение одного часа.
С Icterine, InventoryChangeTrigger выполняется почти в 2.5 раза быстрее (начиная с версии 1.1.0), затрачивая около 7.5% времени тика вместо 20%.
Принцип работы ванильного InventoryChangeTrigger
1. При обнаружении изменения стека в инвентаре игрока, вызывается InventoryChangeTrigger для этого стека. Это включает подбирание предметов, их сбрасывание, сбрасывание целых стеков, перемещение предметов в инвентаре.
- При открытии контейнера (сундук, печь и т.д.), игра считает, что все слоты инвентаря изменились, и вызывает триггер для всех слотов, включая пустые.
2. InventoryChangeTrigger подсчитывает пустые, непустые и полностью заполненные слоты в инвентаре. Эта информация может использоваться в условиях достижений, но не используется в ванильной игре.
3. InventoryChangeTrigger перебирает зарегистрированные критерии достижений.
4. Если у критерия есть требования к количеству слотов, и они не совпадают со значениями из шага 2, или если у критерия нет требований к предметам, критерий пропускается.
5. Если критерий имеет только одно требование к предмету, измененный стек проверяется на соответствие этому требованию.
6. Если критерий имеет несколько требований к предметам (например, "Покрой меня обломками" требует полного комплекта незеритовой брони), каждый предмет в инвентаре проверяется на соответствие каждому требованию (но выполненным требованиям повторная проверка не проводится).
7. Сопоставление предметов, особенно по тегам, очень ресурсоемко. Однако игра сначала проверяет, совпадает ли тип предмета игрока с типом из требования, и только затем проверяет другие параметры: количество, зачарования и другие NBT-данные.
Принцип работы оптимизаций Icterine
1. На шаге 1: не вызывать InventoryChangeTrigger при сбрасывании стеков или перемещении их из инвентаря (например, в сундук). Управляется параметром конфига ignore_triggers_for_emptied_stacks
.
2. Аналогично: не вызывать InventoryChangeTrigger, если изменение стека вызвано уменьшением его размера без опустошения (например, игрок сбросил один предмет из полного стека). Управляется ignore_triggers_for_decreased_stacks
.
3. Также не вызывать InventoryChangeTrigger, если размер стека увеличился, но не превысил порог для какого-либо достижения. Например, размер стека земли увеличился с 52 до 53, но в сборке нет достижения за получение 53 земли. Управляется optimize_triggers_for_increased_stacks
.
4. Изменить проверку измененных предметов при открытии контейнера, чтобы игра не считала все стеки измененными в момент открытия. Управляется initialize_inventory_last_slots
.
5. На шаге 6: сначала проверить, соответствует ли измененный слот какому-либо требованию, и только затем проверять остальные стеки в инвентаре. Управляется optimize_multiple_predicate_trigger
.
6. На шаге 7: сначала сравнивать количество предметов в стеке, чтобы избежать ненужного сопоставления по тегам. Также использовать предыдущий размер стека для дополнительной оптимизации. Управляется check_count_before_item_predicate_match
.
Поддерживаемые версии
Icterine v1.2.0 работает с Minecraft Fabric/Quilt от 1.18.2 до 1.19.4, и Forge от 1.18.2 до 1.19.2.
Icterine v1.3.0 имеет те же функции, что и v1.2.0, и работает с Fabric/Quilt 1.20 - 1.20.4, Forge 1.19.3 - 1.20.4, и NeoForge 1.20.1 - 1.20.4.
Используйте фильтр на странице Файлы для выбора нужной версии.