Пятничные факты #322 – Новая система частиц

Поделиться

опубликовали 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 может в будущем немного помешаться на эффектах частиц …

Как всегда, дайте нам знать, что вы думаете на нашем форуме.


Поделиться

Комментарии: