[моё] Постмортем по модификации HoI IV SD
Несколько мегабайт текста об игровой модификации размером 500 килобайт.
Если вы не планируете вкатываться в IT по профилю разработки игр или тестирования - лучше пропустите этот текст.
Мысль как-то порезать и облегчить файлы игры Hearts of Iron IV грызла меня уже достаточно давно.
Последний крупный патч, из-за "оптимизаций" в котором я три игровых года (1936-1939) одолевал больше трёх часов реального времени на максимальной скорости, оказался последней каплей.
Я засучил рукава и... сел думать.
Потому, что без плана добиться успеха можно только случайно.
Что мы знаем о ресурсах этой игры?
200+ стран (корректнее сказать, "тэгов стран", поскольку каждая обладающая суверенитетом административная единица, от левой задней ноги четвертованной в гражданской войне Испании и до Североамериканской Конфедерации, - это потенциальный игрок).
Около 5 флагов х 3 типоразмера флага = 15 флагов на страну, плюс от десятка советников разного пошиба на страну.
Из этих 200 тэгов, наверное, порядка сотни - с уникальным деревом фокусов. По 30-50 иконок.
Порядка полусотни - со своими модельками/текстурками техники и прочих внеполитических красивостей.
Ну пусть будет по десятку в среднем.
Итого что-то около 5000 + 4000 + 500 = чуть-чуть недотягивает до десяти тысяч файлов связанных только с государствами и юнитами.
Плюс всякие текстурки деревьев, облачков и прочего дерьма с глобальной карты, которые при проблемах с производительностью всё равно отключают.
И 90% всей этой визуальной красоты я в ходе партии не увижу либо не замечу, а значит, это всё можно по максимуму обкорнать.
Нужно было проверить, что из этого занимает больше всего места, а потом начать думать, что с этим делать, желательно, не влезая в код игры.
К счастью (!!!), я совсем забыл, что львиную долю этого дерьма игра при первой загрузке собирает в атласы, а значит искать "как есть" было заведомо бесполезно.
Надо было смотреть размеры результирующих атласов, а не файлы поштучно взвешивать.
Но я влез в папку gfx, бахнул от бедра команду
и очень сильно удивился результату.
Потому, что в топе по занимаемому объёму оказались... шрифты.
Файлы шрифтов китайской, корейской и японской локализации.
DDS'ки с китайскими шрифтами занимают 1 гигабайт.
Остальные две папки со шрифтами оказались не менее пухлыми.
Я мысленно выматерился, взялся за сигаретку и стал пытаться вспомнить хоть один случай, когда я видел в игре иероглифы именно шрифтом, а не пререндеренной иконкой.
И конечно же не вспомнил ни одного.
Потому, что разработчики из Paradox Interactive, конечно, халтурщики, но не настолько конченые, чтобы в английской локализации использовать для текстов дальневосточную иероглифику.
Даже не открывая .dds файл шрифта в редакторе (а на линуксе с простыми и понятными графическими редакторами беда), я могу по памяти сказать, что там будет какая-то атласообразная фигня, к конкретным кускам которой чуть ли не попиксельно будет обращаться движок при попытке отрендерить иероглиф.
Но если иероглифов для рендеринга нет - обращения к конкретному куску файла не будет.
А значит, можно даже не лезть в код.
А уменьшить каждую текстуру шрифта с... какого бы размера она ни была до размера 1х1 пиксель.
Вжух
и вместо 1 гигабайта китайской мандариницы у меня на руках 32 килобайта.
Следующим кандидатом на вынос вперёд ногами оказался всплывший где-то в середине списка mip_debug.dds .
Тоже вжух.
5.6 мегабайт > 144 байта.
Что бы это ни было, скучать по нему мы вряд ли будем.
На душе в этот момент уже очень сильно полегчало, поэтому дальше я только быстренько подёргал и обрезал текстуры с 3D моделей - и партиклов.
В число которых затесались эти самые четыреждыблядские текстуры стреляных винтовочных гильз.
Ну и 16 мегабайт рекламы месячной подписки на DLC попали под горячую руку (отчего - сюжетный спойлер - главное меню прикольно покорёжило).
Не то, чтобы это было 100% необходимо, но мне как-то надо было проверить догадку, что:
1. При первом прогоне игра всё-таки пытается закэшировать или хотя бы проверить на наличие даже те ресурсы, которые в принципе не использует.
Типа текстур для отключенных 3D моделей.
2. От обрезания этих бесполезных ресурсов к худшему не изменится ничего.
Тут я, кстати, ошибся во второй раз.
Даже с отключенными 3D моделями на глобальной карте:
1. Игра всё равно использует 3D модели техники в редакторе шаблонов дивизий и модульной техники.
2. Некоторым landmarks типа Великой Китайской Стены как-то насрать на отключение 3D моделей и они всё равно продолжают стоять и жрать ресурсы.
Раз-два, ножки врозь - модификация готова, можно играть...
...фигушки!
Во-первых, надо провести смоук-тест.
После такого варварского вмешательства игра может не завестись.
Может завестись, но из монитора Гитлер полезет.
Или ещё чего.
Во-вторых, надо как-то проверить влияние на производительность.
Причём, сделать это быстро, но достоверно.
Что в игре со средней продолжительностью сессии от 5 часов - мягко говоря, затруднительно.
Да и без нормальных инструментов для замеров с этим беда.
После пары кофе нарисовалось какое-то подобие сценария тестирования.
Поскольку при первой загрузке изменённых файлов игра занята кэшированием чего попало и сверкой контрольной суммы (а то утибожемой кто-нибудь хакнет Достижения Steam... Будто СЭМ не существует и не позволяет добиться того же результата без правок файлов игры), грузиться надо два раза.
Куда-нибудь в центр континента.
За страну, в которой в первые дни партии не происходит абсолютно ничего.
1. Грузимся в игру.
2. Создаём новую Ironman Ahistorical партию на средней сложности за Польшу.
3. Проматываем время на 1 игровые сутки.
4. Закрываем игру штатно (через кнопку "выйти на рабочий стол").
5. Грузимся в игру.
6. Создаём новую Ironman Ahistorical партию на средней сложности за Польшу. В тот же файл сохранения, что и в шаге 2.
7. Проматываем время на 1 игровые сутки.
8. Смотрим потребление ресурсов игрой через amdgputop.
Повторить один раз без мода, один раз с модом.
VRAM 1562 > 1563
GTT 903 > 887
CPU 255 > 246
GFX 97 > 98
GPU Edge Temp 82 > 76
Из того, что в кадр не попало, но всплыло благодаря моему навыку QA's Hunch:
При первой загрузке с модом игра впала в глубокую задумчивость минут на десять (против обычных 2-5), что в принципе подтвердило мою догадку, что даже бесполезные ресурсы где-то кэшируются или как минимум опрашиваются на наличие.
Парадоксы немного намутили воды тем, что в тот же день перед началом сборки моего мода выкатили патч-хотфикс.
Что в принципе даже хорошо для достоверности тестирования: после патча игра как минимум должна попытаться пересчитать чексуммы (кококо ачивки) и как минимум посмотреть, не изменились ли файлы с графикой.
По показателям потребления ресурсов, вроде бы, ничего не изменилось, все отклонения в пределах погрешности.
Но.
Моё железо в этой игре и так работает на пределе возможностей, так что отсутствие изменений в лучшую сторону по показателям - это ОЖИДАЕМЫЙ результат.
Если изменений нет - всего-то, нужны более длительные тесты, чтобы оценить выхлоп в затяжной партии.
И ещё одно Но.
Полный прогон теста занимает что-то около 14-20 минут по максимуму.
Другими словами, я дохожу до этапа "снимаем показания" не настолько быстро, чтобы железо не успело нагреться после запуска игры.
В т. ч. потому, что железо моё - полное дерьмо :3
Более того.
Из-за того, что какой-то мудила впилил предварительные обсчёты игромеха, игра даже на паузе продолжает какое-то время вертеть такты CPU как на полной скорости.
(зачем-то. Зачем точно - пока без понятия, видел краем глаза в чейнджлогах упоминание)
Т. е. моя микропечка в ходе теста должна была одинаково быстро нагреться.
Либо сильнее, поскольку следующую итерацию мы по определению начинаем с остатками нагрева от предыдущей.
Но по факту температура, с которой я подошёл к концу второй итерации теста (читай: с модом), оказалась на 6 градусов ниже, чем в конце первой итерации (без мода).
При абсолютно одинаковых условиях проверки (минус влияние мода).
Нагрев был меньше = меньше энергии потреблено = меньше вычислений произведено = порезанные модом ресурсы всё-таки были как-то задействованы.
(памятка начинающему QA:
Вы можете возразить, что на второй запуск игры что-то уже было закэшировано в оперативке с прошлых раз и потому вывод о положительном влиянии мода - невалидный.
Обращаю внимание, что в том числе именно поэтому каждая итерация теста состоит из двух запусков игры.
Первый запуск - прогревочный, чтобы все текстуры легли в атласы, все куски ресурсов легли в оперативную память.
А вот уже на втором запуске, с подготовленной оперативкой и (если движку не перемкнёт) атласами, меряем фактический результат.
Отдельно оба прогона без мода.
И потом всё-таки оба прогона с модом.
По-хорошему, между итерациями комп всё-таки НАДО перезапускать или иным способом чистить оперативку + кэши.
Но... это сраный мод для игры, а не ААА проект стартапа из Силиконовой Промежности, и я обычный игрок, а не Project Support Specialist (World of Tanks) from Wargaming.net .
Вот если бы отклонения по потреблению ресурсов превышали 10% - тогда вопрос об очистке оперативы и прочем усилении стерильности тестового окружения имел бы место быть)
В принципе, на этом этапе мод уже можно было публиковать.
Смоук пройден, хуже не стало.
А проводить пробную партию было бесполезно потому, что после моей последней партии за Австрию разработчики накатили хотфиксик, который МОГ повлиять на ресурсоёмкость игры.
А играть две партии подряд (без и с модом) мне было тотально влом.
Но я решился покатать пару часиков за Уругвай!
Так, чисто поразмяться и убедиться, что игра не крэшнется, если я в ходе игрового процесса куда не туда полезу...
...я не знаю, из-за мода это или из-за хотфикса, но за те же три часа я пулей влетел чуть ли не в 1941 год, успел от души пофлексить под Гондурасом и повозиться с конструктором самолётов.
Это при том, что в целом по плотности событий и боевых действий в мире партия за Уругвай была даже интенсивнее, чем за Австрию.
И на этот раз я даже оказался вовлечён в долгосрочные боевые действия.
Почти ничего не тормозило, не проседало и не крэшилось.
И - за вычетом откровенно пластиковых 3D моделей и слегка всратого главного меню игры - никаких артефактов.
По метрике "фан на единицу времени" с модификацией однозначно веселее.
Да, это почти чисто психологический эффект - знать, что огромная куча бесполезного дерьма была вырезана абсолютно без потерь для геймплея.
Ради этого стоило испортить себе выходной и заняться приведением в порядок чужого проекта, который по уровню общего качества мне совершенно отвратителен.
Хоть мозги размял.
(а теперь пора пожинать плоды своего труда...
Душа требует гонок по пустыне на бронеавтомобилях!
За Южную Африку порофлить, что ли, хмммм...)
Отношение пожительных и отрицательных голосов: 3/0