Пятничные факты #326 — Излучатель частиц и кэш данных

опубликовали  Allaizn, Rseding, Klonan

Оптимизация частиц Allaizn

Недавняя оптимизация Rseding системы частиц (FFF-322) сделала частицы более легкими, чем они были раньше, но все же оставила частицы в виде довольно сложных существ. Краткий обзор возможных действий, которые может совершить частица во время своего обновления:

  • Переместить свою позицию.
  • Продвинуть анимацию на другой кадр.
  • Приземлится в воду и применить триггер.
  • Применить другой триггер с определенной частотой.
  • Убрать себя из игрового мира, как только закончится время жизни.

Сложность состоит в том, что триггеры — это системы общего назначения, которые могут выполнять любые действия, включая создание и уничтожение объектов, огня, дыма и других частиц, а также воспроизведение звуков или рекурсивное применение еще большего количества триггеров. Другими словами: применение триггера — это ситуация «все может случиться», и поэтому она абсолютно непредсказуема, что, в свою очередь, делает оптимизацию чрезвычайно сложной.

Излучатель частиц

Базовая игра и большинство модов не используют особо сумасшедшие триггеры при создании частиц — цель обычно состоит в том, чтобы просто порождать кучу небольших анимированных текстур и заставлять их летать по экрану (что несколько иронично обычно называют «частицей») ). Идея дальнейшей оптимизации частиц заключалась в том, чтобы создать своего рода «простую» частицу, которая не могла бы применять все виды триггеров, чтобы позволить обрабатывать их в большом количестве, что обычно быстрее, чем обрабатывать их по отдельности. Эта массовая обработка была бы сделана так называемым «излучателем частиц», вся задача которого состоит в том, чтобы создавать, обновлять, рисовать и, наконец, уничтожать простые частицы, которыми он управляет, с идеей, заключающейся в том, что  смерть кусак не должна порождать сотни частиц, но только один / несколько излучателей.

Но это еще не все: простые частицы не способны изменять любое другое игровое состояние и, таким образом, обновляются только для поддержания своих собственных внутренних значений — главным образом, их положения и скорости. Позже появилось небольшое физическое упражнение: идея вообще не обновлять частицы — вы можете вычислить их текущее положение из исходного положения! Еще лучше: если частицы никогда не рендерится, тогда нет смысла создавать их в первую очередь, поэтому нет смысла делать это до тех пор, пока излучатель не уйдет на расстояние отрисовки — миллионы кусак, умирающих в гигантских фонтанах крови за пределами экрана, могут в принципе не иметь значения для вашего кадра и времени обновления!

Самим частицам, не позволяются влиять на игровое состояние и это преимущество для многопользовательской игры каждый игрок должен генерировать только частицы, которые они видят сами, а не те, которые видны кому-либо. Также предлагается не использовать функцию обновления излучателя, а вместо этого использовать функцию рисования, что дает еще больше преимуществ из-за того, что функция рисования вызывается во время фазы подготовки рендеринга, которая выполняется на столько потоков, сколько вы позволяете.

Тем не менее, все это не работает правильно, и есть крайние случаи, которые требуют обработки. Например: что произойдет, если излучатель создается за пределами экрана, а затем попадает в поле зрения? Что произойдет, если вы сохраните и перезагрузите? Что произойдет, если вы сохраните и перезагрузите набор модов, в котором частицы больше не определены? Было бы очень странно видеть, как ваша ракетная шахта взрывается бесчисленными кусочками, видеть, как они летят и врезаются в землю, а затем сохранять и перезагружать и снова видеть все, потому что эффект частиц возобновился.

Решение таких проблем заняло некоторое время, и, к счастью, лишь незначительно увеличило внутреннюю сложность системы, что позволило мне сосредоточиться на расширении ее функций. В настоящее время поддерживаются следующие вещи, присутствующие на эмиттере:

  • Обработка простых частиц с индивидуальными случайными стартовыми позициями и скоростями.
  • Обработка простых потоков частиц через нормальный и мгновенный потоки, как показано в FFF-325.
  • Работа с простыми частицами с дымовой дорожкой за ними (FFF-325 имеет несколько примеров этого, но эффект уже существовал заранее).
  • Обращение с простыми частицами, воздействующими на землю, может быть заменено водяными брызгами при попадании в воду.

Излучатели частиц имеют два основных ограничения:

  • Они обрабатывают только один тип частиц (и технически связанные дыма и брызги воды). Для того, чтобы сборочная машина взрывалась на металлические куски, а масляные брызги потребовали бы двух излучателей.
  • Частицы, управляемые излучателя, не могут лететь слишком далеко от излучателя (который сам никогда не будет двигаться), потому что нам нужно знать, как далеко за пределами расстояния прорисовки искать передатчики, которые могут захотеть визуализировать свои частицы.

Время запуска — кэш данных Rseding

Время запуска игры (время входа в главное меню) так же важно для нас, как и время компиляции (см. FFF-206). С учетом того, как часто мы делаем компиляцию и запускаем игру для тестирования, каждый лишний момент времени, потраченный на ожидание загрузки игры, — пустая трата времени.

Процесс запуска Factorio состоит из 2 основных частей:

  • Просмотр каждого включенного мода и сбор данных прототипа, которые он определяет / генерирует («этап данных»).
  • Загрузить и обработать спрайты, необходимые для запуска игры.

В прошлом мы делали экспериментальную настройку, которая кэшировала бы загрузку и обработку спрайтов, поэтому нам никогда не нужно ждать этого, когда ничего вокруг них не изменилось. Тем не менее, игра все равно проходила весь этап данных каждый раз, когда игра начиналась.

Во время нормальной разработки это не было проблемой — в большинстве случаев это происходит за доли секунды. Тем не менее, по мере того, как игра росла, росло и количество вещей, которые обрабатываются на этапе данных. Кроме того, для каждого включенного мода, который имеет что-либо на этом этапе, время примерно удваивается. Недавно я начал задумываться над тем, что нужно сделать, чтобы создать такую ​​же систему кэширования, какую мы используем для загрузки спрайтов на этапе данных.

Поскольку при перезапуске результаты в основном совпадают, это означает, что не нужно выполнять большую часть работы — и должно быть быстрее. После работы над ним в течение дня у меня был рабочий прототип; но на самом деле это было не так быстро, только с основной игрой. Пока не желая уйти, я провел некоторое время с профилировщиком и сумел найти несколько областей, которые мог бы оптимизировать, и сократил время, затрачиваемое логикой кеширования, примерно вдвое. Итак, это, наконец, принесло некоторую пользу для основной игры (хотя и довольно небольшой).

Чего я не ожидал, так это того, насколько много улучшений будет для модов. То, что раньше занимало 25 секунд в моем тестировании, заняло всего 4 с новой настройкой кэша. Экономия времени становится еще лучше, так как количество включенных модов увеличивается. Настройка по-прежнему отключена по умолчанию, поскольку она очень экспериментальная, но если она окажется достаточно стабильной, мы можем включить ее по умолчанию.

Рождественские моды Klonan

Это последний FFF перед Рождеством, поэтому я подумал, что мы будем отмечать некоторые моды, которые направлены на создание праздничного духа в игре.

Alien biomes

Снежная местность просто прекрасна. В настройках карты вы можете выбрать опцию «Холодный климат», так что весь ваш мир — просто уютная зимняя страна чудес.

Holiday artillery

Мы также должны помнить о том, чтобы делиться любовью с кусаками, этот мод позволит вам доставлять подарки повсюду и украшать  «Артиллерийский подарок» прекрасной красной и зеленой краской.

Christmas tree

И конечно, ни одна зимняя фабрика не обходится без елки.

Мы желаем вам счастливого Рождества и, как всегда, дайте нам знать, что вы думаете на нашем форуме.

Comments: