Alt-F4 #44 — Новая перспектива

опубликовали  arrow in my gluteus maximus, stringweasel, Nanogamer7, Conor_, Therenas, Firerazer

Вы помните День дурака в этом году? Это уже было довольно давно, но если вы посещали сабреддит в тот день, вы, вероятно, видели это видео. Если нет, то в выпуске №44 Alt-F4 на этой неделе вы узнаете, как именно была достигнута эта темная магическая презентация!

Новый взгляд на «Новый взгляд на поезда в Factorio»arrow in my gluteus maximus

Четыре месяца назад я выпустил видео под названием «Новый взгляд на поезда в Factorio». Если вы еще не видели его, просмотрите его, прежде чем читать статью, иначе в нем не будет особого смысла.

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

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

Я видел, как некоторые люди предполагали, что я каким-то образом извлек из игры 3D-модели. В этом нет необходимости, это просто поворот того, что уже отображается на экране. Хотя идея может быть простой, выполнение немного сложнее. Первая проблема, с которой вы сталкиваетесь, заключается в том, что экраны — это не круги. При вращении части изображения обрезаются, в то время как другие части, такие как графический интерфейс, отсутствуют.

Example of a rotated image, corners have missing pixels because it’s not a circle.

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

Следующая проблема заключается в том, что пользовательский интерфейс тоже вращается, это не то, что нам нужно. Здесь же на помощь приходят скриншоты. У команды take_screenshot() есть опция show_gui. Хитрость заключается в том, чтобы делать два снимка экрана каждый тик, один с видимым пользовательским интерфейсом, а другой без него. Если мы возьмем только те части, которые отличаются, то в итоге мы получим только пользовательский интерфейс, который затем можно будет наложить на снимок экрана без пользовательского интерфейса. По крайней мере, таков был план. Различные проблемы с редактированием видео сделали это нежизнеспособным. Например, мой видеоредактор не поддерживал форматы без потерь (что мне удалось найти, я пробовал кучу). Таким образом, небольшие различия в кодировке отражаются в пользовательском интерфейсе.

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

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

Затем я создал небольшой мод, который воспроизводил звук всякий раз, когда я начинал записывать скриншоты, таким образом, я мог синхронизировать звуки в игре со снимками экрана. Аналогично тому, как киностудии используют трещотки. Мод также записал значение game.players [1] .vehicle.orientation в текстовый файл. Я использовал это, чтобы вычислить, сколько вращения необходимо, и сгладил с помощью сплайнов.

Я боялся, что этих шагов будет недостаточно, чтобы сделать это правдоподобным. Создание такого количества скриншотов сильно замедляет игру. Я волновался, что будет очевидно, что отснятый материал был ускорен, если посмотреть на мое движение в игре. Поэтому я стал искать способ ускорить запись. После записи скриншотов я закодировал их в mp4 с помощью FFmpeg, так почему бы не вырезать посредника и не попытаться подключить FFmpeg напрямую к Factorio. Как кодирование png, так и запись их на диски — дорогостоящие операции. Так что, если бы я мог пропустить эти шаги, все прошло бы намного быстрее.

Первым шагом будет извлечение необработанных данных изображения (не путать с форматом .raw) непосредственно из Factorio вместо их кодирования в png. Я не мог найти простого способа сделать это, но оказалось, что .bmp очень похож на то что нужно. Это данные изображения в обратном направлении с прикрепленным заголовком впереди. Так что это должно быть быстрее кодировать, чем png.

Далее: загрузить это в FFmpeg без предварительного сохранения на диск. Оказывается, FFmpeg имеет встроенные функции для передачи изображений по конвейеру, поэтому именованный канал с расширением .bmp сделал свое дело. (Пример команды: ffmpeg -f image2pipe -framerate 60 -i — -r 60 -c: v libx264 -vf format = yuv420p -crf 1 example.mp4 -y <pipe.bmp)

Не забывайте держать канал открытым между снимками экрана с помощью команды сна: sleep 10000000> pipe.bmp, завершите команду sleep в конце, чтобы FFmpeg завершил запись. Я сделал тестовый прогон с низкой частотой кадров и… что-то не так! Что тут происходит?

Проблема в том, что изображения смешиваются. Рендеринг Factorio является многопоточным. Пока один кадр все еще записывается в канал, следующий может уже начаться. По сути, смешивание пикселей обоих кадров вместе. Исправление состоит в том, чтобы заставить Factorio ждать, пока предыдущий кадр не будет отрисован, прежде чем начинать следующий. Это можно сделать, вызывая game.set_wait_for_screenshots_to_finish () каждый кадр. Однако это замедляет работу Factorio настолько, что мы больше не можем называть это в реальном времени. Хотя у меня все еще есть идеи по его ускорению, на данный момент я уже потратил слишком много времени на этот проект и решил использовать проверенный и верный метод использования повторов.

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

К сожалению, из-за использования повторов мне пришлось вырезать несколько сцен. Я собирался показать, насколько странно создавать объекты с повернутой точки зрения, но оказалось, что Factorio не сохраняет положение вашей мыши при воспроизведении. Таким образом, при воспроизведении пользовательский интерфейс следует за курсором мыши во время воспроизведения, а не за тем положением, в котором она находилась при записи.

Сравнение обычного вида здания (слева) или при просмотре повтора (справа)

В общем, это было забавное испытание, и мне понравилось сбивать с толку игроков Factorio.

Содействие

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

Comments: