опубликовали Klonan, Rseding
Планы релиза Klonan
На этой неделе мы выпустили версию 0.17.79 и отметили ее как стабильную. Внутренне мы называем это «Стабильный релиз 3», и главной особенностью стали новые всплывающие подсказки, которые мы показали в FFF-318.
Есть одно ограничение, которое мы наложили на себя, когда начали этот более быстрый график выпуска функций: мы хотим избежать поломки модов. В принципе, это достаточно просто, не начинайте переименовывать объекты, не удаляйте функции API и т. Д. Однако, по мере дальнейшего развития, существуют определенные функции и улучшения, которые мы не можем реально сделать так, чтобы они не сломали. моды, такие как новый символьный графический интерфейс (FFF-289), и коррекция цвета (FFF-320).
Именно по этой причине мы собираемся накопить некоторые из этих изменений, нарушающих моды, и выпустить их все сразу. Поскольку они определенно будет ломать моды, мы увеличим номер основной версии, поэтому она станет 0.18.0.
Мы уже начали внутреннее объединение этих функций 0.18 в нашу основную ветку, поэтому мы не будем больше выпускать версии 0.17 (если не будет обнаружено что-то абсолютно катастрофическое).
Проблема с частицами Klonan
Частицы были в игре наверно всегда, и они довольно просты, учитывая все обстоятельства. Это небольшая, в основном декоративная сущность, которую мы используем, чтобы добавить немного визуального сопровождения смерти и смерти жуков и машин.
Например, кусаки полны крови, поэтому, когда они умирают, они производят настоящий всплеск. Попробуем подсчитать, сколько частиц мы породим в типичном умирающем взрыве.
В этом ролике спрайт частиц крови был заменен визуализацией отладки, чтобы облегчить подсчет
Так что это немало. Кусака породил 427 частиц, а Спаунер 749. Ну, они не сохраняются очень долго, и они только декоративны, так что все в порядке, верно?
Одним из ключевых слов, которое я хотел бы выделить в предыдущем описании, является то, что они являются сущностью. Когда kovarex и slpwnd начали создавать Factorio, они создали надежную систему управления игровыми объектами и их взаимодействиями — систему сущностей — и все, что имеет физическое представление в игровом мире, было построено поверх этой системы. Когда игра стала больше, стало очевидно, что система сущностей слишком тяжела для некоторых вещей, и мы можем повысить производительность, создавая более специализированные системы. Это привело к удалению элементов на конвейерах из системы объектов в 0.12, и к тому же было сделано для декоративных элементов дыма и ландшафта в более поздних версиях. Несмотря на то, что большинство других игр или игровых движков имеют очень эффективные системы частиц на ранних стадиях разработки, частицы в Factorio по-прежнему используют систему сущностей в 0,17.
Это означает, что частицы регистрируются на игровой поверхности так же, как и все остальное. Это также означает, что они выполняются при выполнении поиска сущностей. Так какие действия движка выполняет поиск сущностей?
- Триггерные эффекты для области — такие как граната, урон от потока огнемета, атомная бомба, ядовитая капсула.
- Поиск пути — чтобы проверить, может ли путь пройти заданную клетку.
- Проверки столкновения движений — такие как Персонажи, Юниты, Снаряды.
- И многие другие…
Как вы можете себе представить, наличие тысяч дополнительных сущностей для повторения каждого тика может замедлить симуляцию. Худший случай в наши дни — защищать свои стены огнеметами. На изображении ниже все объекты выделены визуализацией отладки.
Огнеметы против Кусак- в значительной степени прекрасный пример проблемы:
- Кусак над проверять каждый тик при движении, если они сталкиваются с чем-либо.
- Когда огнемет попадает на землю, он наносит всплеск урона, который является триггерным эффектом области.
- Поток огнемета также создает огонь на земле, который проверяет столкновение.
- Каждые 10 тиков Огонь на земле наносит урон с помощью триггерного эффекта.
- Огнеметы очень эффективно убивают кусак, поэтому за короткое время появляется много частиц.
Эта комбинация приводит к некоторым существенным замедлениям позже в игре, когда большие группы атакуют. Кроме того, поскольку мы улучшили поиск пути, проблема еще хуже в последних версиях 0.17.
Так как мы решаем это?
Оптимизация частиц — Техническая часть Rseding
Когда Posila впервые поговорил со мной о переделке работы частиц в игре, у меня было много идей. Не все они сработали в конце концов, но звучали они неплохо:
- Они не были бы сущностями.
- Они будут работать как дым (хранится в смежных блоках памяти).
- Их не нужно будет обновлять каждый тик, если они не влияют на состояние игры.
В конце концов, я обнаружил, что сложность 3 пункта того не стоит.
Процесс
Частицы должны были не быть сущностями. Быть сущностью значит есть много памяти и производительности, которые просто не нужны частицам. К сожалению, когда я применил артиллерию, я сделал маркер ручного прицеливания частицей. Причины, по которым это больше не имеет значения, но это означало, что мне пришлось добавить миграции для обработки этого и затем миграции для обработки удаления всех частиц сущности.
Я удалил все дополнительные данные / логику из частиц, которые им больше не нужны — уменьшив размер каждой частицы в памяти с 224 до 64 байтов. Как побочный эффект того, что они не становятся сущностями, это также уменьшает количество информации, которая должна быть сохранена в файле сохранения. Однако в большинстве случаев частицы не существуют достаточно долго, чтобы попасть в файл сохранения, так что это не имеет значения.
Мне нужно было какое-то место для хранения / работы со средой выполнения частиц, когда они созданы, существуют в течение некоторого короткого промежутка времени и уходят. Большая часть вещей в игре хранится в определенном фрагменте (область 32×32 мира). Что касается частиц, то мне было наплевать на все остальное в данном куске, поэтому я не хотел их там прикреплять. Вместо этого я сделал отдельную вещь, которая очень тесно связана с кусками, и назвал ее «частицей». Ключевые различия заключаются в том, что они существуют только тогда, когда есть частицы для обновления, и единственные данные, которые они содержат, это частицы. Это означало, что когда игре нужно пройти по каждой частице, чтобы обновить их, все, что нужно сделать, — это пройти по всем существующим «кусочкам частиц» и запустить обновление. Кроме того, поскольку у меня был полный контроль над этими новыми порциями частиц, я могу перерабатывать их в памяти по мере необходимости, чтобы не тратить дополнительное время на выделение и отмену выделения памяти, когда частицы приходят и уходят.
Конечным результатом является хороший прирост производительности, снижение использования памяти и упрощение логики работы частиц. Простым ненаучным тестом, который мы провели, было уничтожение одной и той же базы битов в старой и новой системах, а также запись максимального времени обновления.
Старая система:
Максимальное обновление сущности = 7 мс.
Количество объектов (исключая снаряды) = 7769
Новая система:
Максимальное обновление сущности = 2,4 мс.
Максимальное обновление частиц = 1,7 мс
Количество объектов (исключая снаряды) = 786
Это не очень научно или строго контролируется, но просто чтобы дать представление о масштабах улучшения. Сокращение количества созданных объектов в 10 раз и максимальное время обновления примерно на 40%. Наличие новой оптимизированной системы частиц также означает, что команда GFX может в будущем немного помешаться на эффектах частиц …
Как всегда, дайте нам знать, что вы думаете на нашем форуме.
Comments: