Alt-F4 #52 — Fluidic Power

опубликовали   stringweasel, Nanogamer7, Conor_, Therenas, Firerazer, MyNameIsTrez

stringweasel возвращается со второй  Fluidic Power Experiment где он погружается в довольно удивительную  производительность своего творения. Если вам понравилась статья на прошлой неделе, вам понравится вторая часть на этой неделе. Какой сюрприз!

The Fluidic Power Experiment: Часть 2 stringweasel

Что опять?

В статье на прошлой неделе я рассказал об истории модов переработки электросетей Factorio и о том, как они работают, а затем объяснил свой собственный взгляд на это под названием Fluidic Power. Рекомендуется сначала прочитать эту статью, но вкратце я сделал распределение мощности Factorio более реалистичным, смоделировав её как жидкость — используя уже встроенную механику моделирования жидкости. Это означает, что вам необходимо использовать трансформаторы, чтобы минимизировать падение напряжения на расстоянии. Это также означает, что, например, будет больше запарится, чтобы ваши лазерные турели стреляли на 100%, или построить хорошо схемы с маяками

Пример того, как кусаки атакуют аванпост с включенной функцией «show-fluid-box-info». Зеленая полоса показывает уровень жидкости, а синяя — скорость жидкости. Обратите внимание на то, что лазеры периодически выключаются.

Эти новые ограничения означают, что Fluidic Power достигла своей цели по созданию новой игровой механики, которая больше напоминает реалистичное электричество. Тем не менее, это значительно увеличивает накладные расходы, связанные со всеми необходимыми вычислениями новых жидкостей. Я не хотел размещать мод на портале модов, который остановит ваш компьютер, если вы построите завод приличных размеров. Поэтому я решил провести небольшое исследование. Действительно ли дополнительные расчеты жидкости имеют значительное влияние?

Какая производительность?

Есть причина, по которой Factorio реализует электричество именно так. Это позволяет нам строить абсолютно гигантские фабрики в таких масштабах, что в них можно потеряться. Добавление более реалистичной мощности может настолько сильно снизить производительность, что вам придется строить фабрики поменьше, а этого никто не захочет. Таким образом, возникает вопрос: какими были бы рабочие характеристики Factorio, если бы жидкость протекала через все столбы. Мне нужна была эталонная карта, поэтому я решил построить чистую базу Fluidic Power с помощью моего друга JanKrater.

Моя цель для этой базы состояла в том, чтобы придумать наиболее эффективный способ построения базы, а затем сделать прямо противоположное (ну, в основном). В результате получилась спагетти-база со слишком большим количеством столбов, очень запутанными конвейерами и слишком большим количеством энергоемких лазерных турелей. Однако очень важно, что ему удается стабильно производить 45 научных данных в минуту, и он потребляет около 600 МВт без единого модуля эффективности в поле зрения.

Spaghetti Base 45 SPM.

Обычно Factorio работает со скоростью около 60 обновлений в секунду (называемых UPS), и мне удалось запустить эту тестовую карту для работы на 70 UPS на моем старом ПК (процессор i7-4770k 3,5 ГГц, ОЗУ DDR3-1600 МГц). Это означает, что для однократного обновления всей базы, называемого одним тиком, требуется около 14 мс, тогда как для 60 UPS максимальное время на обновление может составлять 1/60 = ~ 16,6 мс. Этот номер также показан ниже в отладочных выходных данных «show-time-usage». Интересно, что это также показывает, что мой скрипт мода (mod-FluidicPower) оказывает незначительное влияние на производительность (~ 0,05 мс). Это возможно, потому что мой мод выполняет очень мало вычислений, так как он может переложить все дорогостоящие вычисления жидкости и мощности на оптимизированный игровой движок. Основная информация о времени, на которую следует обратить внимание, — это Fluid Manager и Electric Network.

In-game “show-time-usage” and “show-entity-time-usage” information of the 45 SPM Spaghetti Base.
Внутриигровая информация «show-time-usage» и «show-entity-time-usage» базы 45 SPM 

В выходных данных выше игра сообщает вам, где тратится большая часть времени, и сначала меня смутило, что игра, по-видимому, проводит большую часть своего времени в Electric Network. Я ожидал, что Fluid Manager получит наибольшее снижение производительности, но вместо этого вывод показывает, что  Electric Network (~10ms) использует более 70% времени обновления (~13.7ms), и чтоFluid Manager (~0.03ms) похоже, вообще ничего не делает. В этом нет никакого смысла, потому что я ожидал, что объем жидкостных вычислений приведет к значительному снижению производительности. Я направился в сообщество Technical Factorio, где они довели производительность Factorio до абсолютного предела. Здесь блестящий математик SteveTrov объяснил мне, почему время использования в игре может вводить в заблуждение, если вы не знаете, как на самом деле выполняются вычисления времени. Он описал это так:

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

  1. Запускается поток электрической сети и запускается таймер обновления электрической сети.
  2. Заявлена ветка обновления тепла
  3. Запускается несколько потоков обновления жидкости.
  4. Когда поток обновления электрической сети завершается, время использования  записывается как обновление электрической сети. Таймер обновления жидкости теперь эффективно запущен
  5. Когда поток жидкости завершен (обычно это происходит до шага 4), таймер обновления жидкости останавливается.

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

SteveTrov

По сути, это означает, что информация об  Fluid Manager связана с Electric Network и Heat Manager. Невозможно рассчитать точный показатель того, какая часть занимает больше всего времени, без изменения самого игрового движка Factorio. Мне нужен другой подход, чтобы узнать, действительно ли электрическая сеть занимает больше времени обработки, чем Fluid Manager, и если да, то на сколько?

Затем эксперт по UPS по имени flame_Sla предложил мне загрузить Very Sleepy Profiler, чтобы увидеть подробную информацию о том, какие функции C ++ движка Factorio вызываются чаще всего. Их сообщество часто использует этот инструмент для оптимизации крупнейших и наиболее эффективных мегабаз UPS. В выходных данных инструмента ниже вы можете увидеть, какие функции C ++ занимают больше всего времени, перечисленные в порядке убывания. flame_Sla также упомянул, что не следует фокусироваться на показанном абсолютном времени, а скорее использовать его как показатель, с помощью которого можно идентифицировать самых крупных виновников.

Output of the Very Sleepy profiling tool running on my spaghetti Fluidic Power benchmarking base. On the right is one instance of the call stack of the selected function.
Результат работы инструмента профилирования Very Sleepy на моей тестовой базе r. Справа — один экземпляр стека вызовов выбранной функции.

Это показало то, чего я не ожидал. Жидкостная система (FluidSystem :: update) была только в 10 первых функциях с наихудшим временем, а электрическая сеть по-прежнему занимала больше времени! Оказывается, основная проблема заключалась в FlowStatistics <ID <…> …> :: onFlow, который в основном вызывается электрической сетью. Эта статистика потоков собирает данные, необходимые для просмотра графиков игры, например. окно производства электроэнергии. Это означает, что игра не только замедляется из-за всех новых расчетов жидкости, но и из-за сбора информации для построения графиков для всех новых электрических сетей!

Весьма вероятно, что сбор статистики электрических сетей может занять значительное время обработки с помощью Fluidic Power. Движок Factorio предназначен для работы только с несколькими электрическими сетями или даже с одной. Игра должна собирать и обновлять информацию для каждой имеющейся у вас электросети, которая обычно представляет собой лишь несколько отдельных наборов данных. Таким образом, вместо нескольких сетей, Fluidic Power спроектирован таким образом, что каждый полюс мощности представляет собой единую электрическую сеть. Затем движок Factorio попытается собрать статистику для каждой из этих электрических сетей — что составляет около 3000 электрических сетей в моем тестовом сохранении! Это как минимум в 100 раз больше сетей для сбора статистики, чем рассчитано в Factorio. Это известное ограничение для некоторых других модов, но Fluidic Power выводит это на новый уровень. Однако мы до сих пор не знаем, как эти расчеты повлияют на расчеты жидкости. Неужели сбор статистики занимает гораздо больше времени, чем сами расчеты жидкости?

flame_Sla упомянул, что однажды ему удалось измерить Fluid Manager на самой большой  мегабазе, и что он использовал только ~ 0,4 мс для мегабазы ​​40KSPM 60UPS! Это означает, что только 2,5% времени обновления было потрачено на расчеты жидкости! Он изолировал использование времени Fluid Manager от электрической сети, полностью исключив электрическую сеть из измерений. Он добился этого, переключив все машины на работу на дровах в качестве топлива, что означало, что электричество больше не использовалось, а электрическая сеть простаивала. Из-за того, как работает Fluidic Power, я не могу легко устранить влияние электрической сети таким же образом, не уменьшив при этом нагрузку на Fluid Manager, но я могу сделать это наоборот! Я могу удалить все жидкие компоненты и заменить их EEI, которые обеспечивают питание или отвод энергии. Это полностью устранит все добавленные вычисления жидкости без снятия чрезмерной нагрузки на электрическую сеть, убедившись, что завод по-прежнему работает нормально. Чтобы записать точную и сопоставимую метрику использования времени, я также попытался заставить Factorio работать на одном ядре. Я запустил быстрый сценарий для замены скрытых жидких компонентов опор для этого теста, и результат был следующим:

Исходный уровень Измененный Разница
Electric Network 9.3ms 9.2ms 0.1ms
Heat Manager 0.03ms 0.03ms 0ms
Fluid Manager 0.13ms 0.08ms 0.05ms
Итог 9.46ms 9.31ms 0.15ms

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

Это показывает, что все дополнительные вычисления жидкости от Fluidic Power в этом тесте занимают всего около 0,15 мс! Это число, вероятно, все еще не очень точное, поскольку оно находится в пределах шума основы спагетти, тест не идеален, а измерение времени в параллельных потоках неточно. Тем не менее, это дает нам хорошее представление о том, на что уходит большая часть времени обработки. Это доказывает, что электрическая сеть действительно оказывает наибольшее влияние на производительность, и что дополнительные вычисления практически незначительны. Это заставляет задуматься, какой производительности можно было бы достичь, если бы электрическая сеть не собирала статистику без надобности — возможно, мы увидели бы огромные мегабазы ​​Fluidic Power с гигантскими трансформаторными подстанциями рядом с ядерными реакторами и массивами солнечных панелей.

В целом, Fluidic Power работает намного лучше, чем я ожидал. Любые предполагаемые замедления будут в основном вызваны сбором статистики многими электрическими сетями, а не самими расчетами. Вы по-прежнему, вероятно, сможете запустить ракету, если ваш UPS не упадет ниже 60 . Вы, вероятно, могли бы даже построить немного больше, если бы у вас была эффективная компоновка (я достиг 90SPM при 220UPS!), И мод не обязательно будет заряжать ваш UPS, как предсказывал Rseding1. К счастью, Factorio действительно хорошо спроектирован и оптимизирован, даже если он работает не так, как задумано. Это доказывает, что в Fluidic Power определенно можно играть с точки зрения производительности, но это не единственный важный аспект.

Стоит ли играть в него?

Лично я считаю, что Fluidic Power создает действительно интересную задачу. Возможно, он не для вас, если вы планируете построить долгоживущую мегабазу, но если вы ищете интересное приключение с новыми испытаниями, то этот мод может быть именно для вас. Мне очень понравилось преодолевать все новые игровые препятствия, которые это создает. Например, сначала выключаются машины, наиболее удаленные от ваших паровых двигателей, обычно это электрические буры на вашем угольном участке, которые питают ваши котлы. Я никогда раньше не сталкивался с такой опасной спиралью угольной смерти. Или, если вы защищаете свои стены с помощью лазерных турелей, вам нужно убедиться, что имеется достаточно трансформаторов для подачи питания с правильным напряжением.

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

Содействие

Как всегда, мы ищем людей, которые хотят внести свой вклад в Alt-F4, будь то отправка статьи или помощь с переводом. Если у вас есть что-то интересное, чем вы хотите в изящной форме поделиться с сообществом, то это место для вас. Если вы не совсем уверены в этом, мы с радостью поможем, обсудив идеи содержания и вопросы структуры. Если это похоже на то, что вас интересует, присоединяйтесь к Discord, чтобы начать!

Comments: