Как стать автором
Обновить

Комментарии 15

Пытался сделать свой процессор, но до конца не довёл. Предложенный в статье дизайн — не единственно возможный, практически каждый компонент можно реализовать иначе.

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

В моём дизайне получилась RAM память, которая уже через три или четыре такта (точно не помню) способна отдать записанное значение, и я вообще думал отказаться от регистров. А ещё что забавно — можно получение внешних данных или управление чем-то сделать как доступ в RAM память. Практически DMA.

Ещё у меня была чисто теоретическая мысль сделать что-то типа гипертрединга. Если есть схема без ячеек памяти и обратных связей, которая выдаёт результат через N тактов, то можно каждый такт отправлять на неё новые данные и с задержкой в N тактов получать один результат за другим. Таким образом, можно на одной схеме паралелльно делать несколько рассчётов. Кстати, то что я писал про RAM память — аналогично, можно писать хоть каждый такт.

Создание процессора заглохло на том, что мне стало лень расставлять-настраивать всё в факторио, и я захотел написать эмулятор логических цепей. Чтобы с помощью кода «собрать» схему, протестировать, а потом на её основе сгенерировать готовый блюпринт и вставить в игру. Руки всё никак не дойдут)

P.S. Ещё в факторио можно прям из комбинаторов собрать стек и использовать его вместо регистров, как в forth.
мсье знает толк в извр комбинаторах. Для меня это темный лес какой-то

Э-э-э, а что там в принципе может быть сложного для программиста с высшим образованием?

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

Поэтому и выглядит как «магия».
Например, комбинатор стоящее левее быстрее инкрементирует свое значение.

Не верю. Вот даже специально эксперимент только что провёл: поставил 200 таймеров в ряд, запустил их все, подождал немного и остановил. В итоге все таймеры показали 3133, включая самый левый и самый правый.


На этом эффекте есть схема защиты, когда массив лазерных турелей активируется отдельно стоящей.

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


В общем, нет нем никакой магии, совсем никакой. Каждый комбинатор делает ровно то что написано, и ничего кроме этого.

А я этого не исключаю. Без деталей сложно сказать что за интересный эффект с комбинаторами, но вероятно это как-то связано с чанками, в которых они расположены и с порядком их обновления (как, например, было вот тут) или даже с каким-нибудь багом (как тут).
А может быть имелось ввиду что-то вида «поставь два комбинатора, которые попробуют изменить одно и то же значение (или друг друга) и одновременно запусти — победит тот, что обновится быстрее, и это будет левый». но это просто предположение — опять же, без деталей можно только спекулировать

Если оно и связано с чем-то хитрым — то только с багом, но баги в факторке исправляют, а не изучают.


Что же до варианта с "изменить одно значение", то это абсурд — комбинаторы не "меняют значение", а устанавливают значения на своих выходах. Если выходы соединить — их значения сложатся, а не перезапишутся.

память меня подвела, прошу понять, простить.

там действительно использовался другой эффект — при разрядке аккумулятора приоритет питания идет на турель, а комбинатор при этом отключался. за счет этого возникала разница в значениях. на версии 0.17. по крайней мере это работало, а на 1.х не пробовал. Вчера вспомнил вечером по пути домой.
давно не играл, подзабылось что-то.
В моём дизайне получилась RAM память, которая уже через три или четыре такта (точно не помню) способна отдать записанное значение, и я вообще думал отказаться от регистров. А ещё что забавно — можно получение внешних данных или управление чем-то сделать как доступ в RAM память. Практически DMA.

К слову, в самых первых компьютерах регистров тоже не было. Затем появился кэш. И уже потом — собственно регистры.

Создание процессора заглохло на том, что мне стало лень расставлять-настраивать всё в факторио, и я захотел написать эмулятор логических цепей. Чтобы с помощью кода «собрать» схему, протестировать, а потом на её основе сгенерировать готовый блюпринт и вставить в игру. Руки всё никак не дойдут)


Возможно я не совсем правильно понял в чем Ваша проблема, но есть же, например, Logisim. Производительности мне хватило, чтобы симулировать свою имплементацию RV32I на частоте порядка 1 кГц.
нам нужно подождать 10 игровых тактов (fps), чтобы начать следующий такт системы.

я правильно понимаю, что чтобы разогнать процессор, надо разогнать систему, на которой он запущен, чтобы повысить число кадров в секунду?

Здесь автор не совсем точно выразился — в factorio есть tps, а есть fps. tps — это и есть игровые такты, и в нормальном состояние тактов всегда ровно 60 в секунду. Они могут проседать под нагрузкой (тем самым замедляя всё вокруг), но никогда не могут быть больше.
А fps можно сделать любой — он никак не влияет на tps.

А если ещё чуть точнее, то есть FPS и UPS (updates per seconds, те самые такты). UPS влияет на фактическую скорость игры (ниже — медленнее), FPS же обозначает именно что частоту обновления кадров. Собственно FPS стремится быть равным UPS (может быть меньше, но не может быть больше. как объясняли разработчики — смысл просчитывать графику ещё раз, если не было обновления и потому картинка будет идентичной пиксель в пиксель), а ups стремится быть равным 60, но естественно может проседать. При этом если комп вытягивает, UPS можно поднять с помощью консоли. Т.е., если комп потянет 600 UPS, то можно ввести в консоль /c game.speed=10 и игра постарается держать уже 600 UPS и соответственно всё ускорится в 10 раз. При этом FPS может быть меньше (особенно если включен VSYNC).

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

Ну вот, такая шутка пропадает — когда надо разогнать GPU чтобы ускорить буквально CPU.
В свое время было прикольно было играть с ускорением времени в старых играх на новых процессорах. Когда эта скорость не фиксировалась по максимальному значению, а упиралась в производительность процессора. И на современном процессоре все начинало в прямом смысле летать.
Не говоря про очень старые игры, которые почему-то привязывались к частоте процессора даже в реальном времени, и становились неиграбельными на современных системах.

Они были очень быстрые, если запускались в win9* под нативным DOS-ом. Сегодня такие игры играются через DOSBox, где таймер ведет себя адекватно и проблем со скоростью уже нет на любой системе.

Зарегистрируйтесь на Хабре, чтобы оставить комментарий