Главная » Пятничные факты » Пятничные факты №176 - Оптимизация конвейеров в Factorio 0.15

Пятничные факты №176 — Оптимизация конвейеров в Factorio 0.15

Просмотров: 58
Опубликовано:

Оптимизация конвейеров в Factorio 0.15

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

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

Конвейеры Factorio 0.15

Тем не менее, это не все, что может быть сделано для конвейеров. Например посмотрите на эту вещь:

Конвейеры Factorio 0.15

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

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

Конвейеры Factorio 0.15

Здесь синие линии обозначают расстояние между элементами и желтые линии обозначают начальный и конечный разрыв до крайности кумулятивной транспортной линии. Большую часть времени изменяются только эти желтые вещи, которые запрашивают убер-оптимизацию, где для каждой транспортной линии как 20-100 сегментов пояса вы только увеличиваете/уменьшаете размеры этих концевых зазоров, и не трогаете предметы на остальных! Технически это означает увеличение / уменьшение два целых числа, а не приращением положение всех 200 пунктов этих поясов. Единственное место, где вы тратите производительность это повторное выбрасывание элементов из одной последовательности в другую — вот почему мы хотим сохранить последовательности транспортной линии как можно дольше. Существует еще одна проблема — это когда ремень блокируется:

Когда это произойдет, вы не уменьшаем эту желтую часть больше, это уже ноль. Вместо того, чтобы вы уменьшить размер этого последнего ненулевого зазора, показанного с красной стрелкой. Может показаться, что каждый раз, когда ремень заблокирован, вам придется сканировать эту последовательность элементов, чтобы найти, что последний пробел (который может быть очень далеко и убить всех производительность при плавке линий), но здесь идет очевидный / неочевидный kung- фу … всякий раз, когда ремень сжимается — он будет оставаться таким образом навсегда. Это означает, что когда два элемента застряли близко друг к другу — от Inserters они останутся застряли навсегда закрыть. Это свойство позволяет кэшировать индекс последнего положительного место разрыва, и обновлять его на лету, потому что индекс не может расти, только уменьшаться. Таким образом, по существу, этот алгоритм становится амортизируется постоянной времени по отношению к количеству товаров, производимых на вашей фабрике, умноженный на число транспортных линий, что этот пункт должен путешествовать.

Этот метод, однако, имеет свои последствия. Вы больше не можете озвучить позицию элемента из его индекса в массиве транспортной линии, вы должны повторять их все сначала, чтобы получить там с суммой всех расстояний между ст. Хорошая вещь — мы никогда не использовали это свойство, ни мы делали никаких бинарных поисков. Только производительность критичных вещь зависит от такого представления является Inserters, но так как они нуждаются в этот элемент отслеживания информация последовательно с каждым тиком, Inserters может легко отслеживать, что происходит внутри транспортной линии (что было перемещено и что не последний тик), и обновить абсолютное положение гусеничной элемента еще в O (1).

Кроме того, существуют динамические слияния / стиранием подпрограммы, которые держат транспортные линии под Inserters или боковой загрузкой на некотором ограниченном диапазоне, может быть 9 плиток, в то время как свободные вставляет линии могут быть длиной 100 плитки. Эти цифры по-прежнему быть откалиброван. До сих пор общий прирост производительности по движению детали на x50-100 с этим O (1) оптимизации. Хотя это не все, что касается ремней, так что фактические доходы, как ожидается, составит около х5-х10. Изогнутые и прямые ремни все объединены вместе уже, следующим шагом будет вложение подземных лент в рамках одной очень длинной линии.

В конце концов только разветвители должны быть законные лица, чтобы разорвать транспортные линии друг от друга, в дополнение к какой-нибудь большой 100-плитки длительного ограничения, как долго транспортная линия может быть для игрока выбора / падения предметов, рендеринга и других вещей, чтобы рассмотреть , До сих пор заводы во время выступления на 25 взлетов начинают расти до 35-40 взлетов только из-за этой оптимизации ремни и пояса не все эти заводы содержат.

С 0.15 вам не придется строить подземные пояса ради исполнения :) Сердце Factorio бьется красиво сейчас и не будет отвлекать от действительно важных вещей.


comments powered by HyperComments

рек 728х90 single.php
Звёзд: 1Звёзд: 2Звёзд: 3Звёзд: 4Звёзд: 5 (1 оценок, среднее: 5,00 из 5)
Понравилось? Поделись в соц сетях!