DefLoadCache
DefLoadCache кэширует результат загрузки XML-определений (defs) и применения патчей RimWorld, поэтому повторные запуски с тем же списком модов пропускают две самые медленные этапа запуска.
При списке из 414 модов это сокращает время запуска с ~9 минут до ~2:40 после первого запуска.
Как RimWorld загружает моды
При запуске с модами RimWorld проходит через серию этапов. Ключевые из них для загрузки определений:
[list=1]
Обнаружение модов — сканирует папку Mods/ и Steam Workshop на наличие активных модов
Загрузка сборок — загружает DLL каждого мода
LoadModXML — считывает каждый файл Defs/*.xml из каждого мода в память
CombineIntoUnifiedXML — объединяет все разобранные XML в один XmlDocument
ApplyPatches — выполняет каждый файл Patches/*.xml через XPath для объединенного документа
ErrorCheckPatches — проверяет, что патчи применены успешно
ParseAndProcessXML — преобразует XmlNode в типизированные объекты Def
ResolveReferences — связывает межопределённые ссылки
Загрузка текстур, аудио и строк — Unity загружает ресурсы мода
При списке из 414 модов этапы 3 и 5 (LoadModXML + ApplyPatches) сами по себе занимают около 6 из 9 минут. Кроме того, они дают одинаковый результат при каждом запуске, если ничего не изменилось.
Что делает DefLoadCache
DefLoadCache пропускает этапы 3, 5, 6 и 8 при запусках с попаданием в кэш. После обычного первого запуска он сериализует полностью пропатченный XmlDocument на диск, а при последующих запусках потоково считывает кэшированный документ вместо повторного чтения файлов и выполнения патчей.
Кэш автоматически сбрасывается при любом изменении, влияющем на содержимое определений. Для каждого файла во всех Defs/, Patches/, Assemblies/ и About.xml модов вычисляется отпечаток SHA-256. Любое изменение на уровне байтов в любом из этих файлов меняет отпечаток и заставляет перекомпилировать. Добавление, удаление, переупорядочивание модов, изменение версий, обновления RimWorld и перекомпиляция DLL все запускают перекомпиляцию.
Этапы, которые всё равно выполняются при каждом запуске независимо от состояния кэша: загрузка текстур/аудио/строк, ParseAndProcessXML, ResolveReferences, патчинг Harmony и статические конструкторы. Они составляют оставшиеся ~2:40 времени запуска при попадании в кэш.
Производительность
Измерено на списке загрузки из 414 модов Combat Extended milsim:
- Первый запуск (создает кэш): ~9:10 — обычная скорость плюс несколько секунд на сериализацию
- Последующие запуски (попадание в кэш): ~2:40 — на 71% быстрее
- Размер кэша на диске: ~7 МБ
При любом изменении (добавлен, обновлен, удален, переупорядочен мод) следующий запуск выполняется полной перекомпиляцией за ~9 минут, и цикл начинается снова.
Наибольшую выгоду приносит SSD и 16 ГБ+ ОЗУ. На старом оборудовании всё ещё работает, но прирост меньше, так как чтение кэша конкурирует с другими операциями ввода-вывода на диске.
Когда использовать DefLoadCache вместо MissileGirl
MissileGirl — это комплексное решение для производительности. Оно включает Gagarin (кэширование XML-определений), RocketMan (кэширование статистики/сущностей), Soyuz (ограничение тиков пешек), Cosmodrome (оптимизация патчей) и кэш текстур. Если вам нужен один мод, который решает множество проблем с производительностью одновременно, MissileGirl обычно лучший выбор. Он делает больше, чем DefLoadCache.
DefLoadCache сфокусирован на одной вещи: конвейере XML-определений. Он пересекается с Gagarin на этом конкретном этапе, поэтому запускать оба избыточно. Остальные подсистемы MissileGirl (кэширование статистики, ограничение пешек, кэш текстур) не затрагивают загрузку XML и могут работать вместе с DefLoadCache без проблем. Вы можете использовать только один. Если вам предпочитают другие функции, предоставляемые MissileGirl, используйте MissileGirl.
Выбирайте DefLoadCache, если:
- Вам нужно только кэширование XML без более широких изменений MissileGirl в статистике, тиках пешек, патчах и текстурах. Меньшая площадь поверхности означает меньше точек взаимодействия с другими модами.
- Вы столкнулись с проблемами совместимости с не-XML подсистемами MissileGirl.
- Вы хотите, чтобы кэш сохранялся до тех пор, пока ничего не меняется. Gagarin автоматически сбрасывает свой кэш через 2 дня, даже если список модов не тронут; DefLoadCache этого не делает.
Совместимость в двух словах
- FasterGameLoading (Taranchuk / mushroomTW продолжение): совместим. Работает на разных этапах конвейера (кэширование отражения, отложенная загрузка графики, выпекание атласа). В собственном About.xml FasterGameLoading перечисляет DefLoadCache в разделе "работает хорошо с".
- Image Opt (soeur): совместим. Работает только с декодированием текстур.
- Performance Fish (bbradson): совместим, известных конфликтов нет.
- MissileGirl (ViralReaction): Не совместим. Вы не можете отключить кэширование MissileGirl.
- HugsLib: совместим.
- Harmony, Prepatcher: необходимые зависимости.
Часто задаваемые вопросы
Q: Это делает то же самое, что и FasterGameLoading?Нет. FasterGameLoading оптимизирует отражение во время выполнения, отложенную загрузку графики и выпекание атласа текстур. Он не кэширует разобранные определения или пропатченные XML на диск. DefLoadCache нацелен конкретно на этапы загрузки XML и применения патчей. Они работают на разных частях конвейера запуска и могут быть установлены вместе.
Q: Почему мой кэш сбросился после обновления в Steam Workshop?В старых версиях любое изменение временной метки файла запускало перекомпиляцию, включая повторные загрузки Steam, даже когда содержание было идентично на уровне байтов. Текущая версия использует хеширование содержимого SHA-256, поэтому обновление Steam, которое не меняет фактическое содержимое файлов, больше не сбрасывает кэш.
Q: Может ли это повредить моё сохранение?Нет. DefLoadCache влияет только на то, как определения загружаются при запуске игры. Он не читает и не записывает файлы сохранения. Если загруженные определения неправильные, вы увидите ошибки при запуске игры, а не после загрузки сохранения.
Q: Может ли это сломать другие моды?Не должно. Кэшированный XmlDocument эквивалентен тому, что produces обычный запуск. При каждом попадании в кэш выполняется проверка сравнения количества определений по модам с базовой линией. Несоответствие запускает автоматическое удаление и чистую перекомпиляцию при следующем запуске. Если вы отлаживаете другой мод, нажмите "Тестировать без кэша (только при следующем запуске)" в настройках DefLoadCache, чтобы изолировать проблему.
Q: Я разрабатываю мод. Помешает ли это?Кэш сбрасывается при любом изменении файла, поэтому он просто перекомпилируется, когда вы редактируете Def или Patch. Если вы хотите полностью отключить кэш во время разработки, отключите "Пропускать чтение файлов модов при повторных запусках" в настройках.
Q: Работает с RimPy, RimSort или ручным управлением модами?Да. DefLoadCache создает отпечаток независимо от того, какие моды активны и как они туда попали. Каждая конфигурация списка модов автоматически получает свой собственный кэш.
Q: Где хранятся файлы кэша?В папке данных сохранений RimWorld в DefLoadCache/. Вы можете увидеть точный путь и управлять файлами кэша на странице настроек мода.
Требования
- Prepatcher (необходимая зависимость)
- RimWorld 1.6
- Расположите где угодно в списке модов после Prepatcher и Harmony
Исходный код
GitHub.
Благодарности
- FluxxField — автор
- Harmony от Brrainz — библиотека патчинга, на которой построены Prepatcher и большинство модов RimWorld
- Prepatcher от Zetrith — система IL-инъекций [FreePatch], которая это делает. Благодарю Jikulopo за поддержку форка, пока Zetrith отсутствовал.
- Krafs.Publicizer — компилятор для доступа к внутренним типам Cecil
- Performance Fish от bbradson — вдохновение для шаблона Publicizer + HintPath