Разработчик под ником Isabella Bosia представила открытый проект под названием raycaster in bash. Исходный код решения опубликован на GitHub.
Raycasting — это метод рендеринга для создания 3D-перспективы на 2D-карте. Когда компьютеры были медленнее, было невозможно запускать настоящие 3D-движки в реальном времени, и raycasting был первым решением. Raycasting может работать очень быстро, потому что для каждой вертикальной линии экрана нужно выполнить только расчет. Самая известная игра, использующая этот метод, — это, конечно, Wolfenstein 3D.
Полное техническое описание разработки проекта raycaster in bash, включая скриншоты, проблемы и решения, опубликовано на этой странице разработчика.
Isabella Bosia пояснила, почему это было немного сложно.
bash медленный. Это, безусловно, самая большая проблема. Он настолько медленный, что вы не сможете достичь приемлемой частоты кадров, если вам придется выполнять хотя бы одну команду на пиксель. Это означает, что вы также не сможете хранить состояние экрана в памяти, ни как массив цветов (вы знали, что доступ к случайному элементу в массиве занимает линейное время?), ни как одну длинную строку (вы знали, что доступ к n-му символу в строке занимает линейное время даже в LANG=C?), потому что буквально простое чтение этого представления для его выгрузки на экран займет больше времени, чем кадр.
bash не поддерживает числа с плавающей точкой и не имеет доступа к библиотеке математических функций. Вся математика выполняется с целыми числами, масштабированными в 100000 раз
Терминалы уродливы, если вы используете полный символ для представления каждого пикселя, поэтому здесь используются полублоки unicode с разными цветами переднего плана и фона, что фактически удваивает вертикальное разрешение. К сожалению, нет способа обновить только один из двух цветов в ячейке, или запросить текущие цвета ячейки (кроме того, это было бы слишком медленно для bash), поэтому каждый раз, когда мы записываем пиксель, нам нужно знать цвет соседнего пикселя. Было бы очень удобно, если бы bash мог как-то сохранять состояние, но, увы, он не может.
Пояснение разработчика по различных проблем:
Ранее разработчик под ником 0x0mer выпустил проект doom-htop, который позволяет играть в Doom при использовании консольной утилиты диспетчера задач htop. Исходный код проекта опубликован на GitHub под лицензией GNU General Public License v2.0. «Вы когда-нибудь задумывались, можно ли использовать htop для рендеринга графики культовых видеоигр? У меня кое-что есть подобное. Чтобы утолить наше любопытство, и для вашего удовольствия от просмотра я создал doom-htop», — уточнил разработчик проекта.
В сентябре разработчик под ником SomeUnusualGames представил игру Tux-vs-Mutant-Window, написанную на Shell и C. Исходный код проекта опубликован на GitHub под лицензией MIT. «Я сделал игру в Bash с помощью raylib. Это игра в жанре bullet hell с любимым пингвином Tux против злого мутанта Window. Одна вещь, которая меня удивила в Bash, это то, как быстро он может обрабатывать вставку и удаление элементов в массивах. Сначала я думал, что это будет узким местом, но он на удивление быстрый», — уточнил автор проекта.
Источник: habr.com