28 января, 2017

Пятничные факты 175 - Программируемый динамик

Пост написан Twinsen'ом. Оригинал.

Программируемый динамик


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

Так что сегодня мы поговорим о новой классной штуке в обновлении 0.15: Программируемый динамик. Его основные функции это:
  1. Показывать настраиваемые оповещения в интерфейсе и проигрывать звуковые оповещения в зависимости от логических условий.
  2. Создавать простые мелодии, управляя проигрыванием семплов с помощью логики.
Внутренний интерфейс выглядит так (графика временная):


Начнем с функционала, он достаточно очевиден. Устанавливаем логическое условие, звук, который должен проигрываться при его соблюдении, а также то, где будет слышно оповещение, недалеко от динамика или на всей карте. Также можно включить оповещение в интерфейсе. Когда логическое условие будет истиной, динамик проиграет звук и если нужно, то выведет интерфейское оповещение. Семпл может проигрываться постоянно, или, используя комбинаторы, можно настроить интервалы проигрывания.
Теперь к веселому. Мы хотели чтобы динамик мог проигрывать простые мелодии. Посыпались сумасшедшие идеи и все это разрослось до полноценной DAW системы с синтезаторами и полным контролем над происходящим. Но все это должно было просто управляться через логическую сеть без постройки компьютеров на комбинаторах. В итоге я сделал чтобы динамик работал как пошаговый секвенсор. Если мы посылаем импульс с сигналом по логической сети, семпл начинает проигрываться, в противном случае ничего не происходит. Длина семпла или эффекты не настраиваются, но в итоге динамиком легко управлять через логистическую сеть.

Довольно слов. Вот демо песни из уже добавленных семплов. Все что вы слышите сделано в фактории. Можете самостоятельно разобраться как именно генерируется мелодия.


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

В логической сети будут и другие улучшения в версии 0.15, но об этом как-нибудь в другой раз.

Борьба с багом при загрузке карты (техническая часть поста)

Сколько я помню в нашем загрузчике карты (среди других проблем) была проблема, когда подгрузка карты зависает на 100%. Проблема очень редкая и случайный человек решил сообщить о ней. Мы могли продолжать забивать на нее, перекидывая ее в "ожидающие" или в "дубликаты" или в "магия нулей и единиц", но через несколько месяцев другой человек снова сообщил о ней. Я обычно зацикливаюсь на этих редких "нерешаемых" багах (падение обработки звука, проблема с производительностью вертикальной синхронизации, не пиксельно точная отрисовка спрайтов), так что я начал разбираться с проблемой в загрузчике карт.

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

Ближе к концу я понял что произошло, спасибо игрокам за помощь. Глядя на данные, полученные wireshark'ом с сервера и клиента, один из пакетов с определенным содержимым или контрольной суммой всегда фильтруется. Какой-то нахальный файрволл на компьютере, роутере или у провайдера смотрит данные пакета и блокирует те, которые ему не нравятся. Не важно сколько раз я пересылал пакет, он никогда не приходил, хотя сотни тысяч других пакетов с картами и игровыми данными приходили без проблем. Поправьте, если я не прав, но такое не должно случаться. Все подробности этой проблемы можно почитать в последних сообщениях на форуме или на Stackexchange.

Похоже проблема решается если я добавлю один байт случайных данных в пакет, но в первую очередь я хоче знать почему это происходит. Если вы знаете что происходит или знаете кого-то, кто может знать - не стесняйтесь просветить нас. :)
Это показывает насколько сложно сделать, чтобы софт "просто работал" у всех. Всегда найдется 0,1% дюдей, которые сталкиваются с проблемами, которые никогда не происходят у остальных. Большое спасибо admalledd, dadymax, Rippie и другим форумчанам, которые помогли или продолжаются помогать с расследованием этой странной проблемы.

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

Как обычно, пишите свои мысли на форуме.

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

Отправить комментарий