Прогуляйтесь по 3D-киберпанк-городу, созданному исключительно из ASCII-символов.

Ascii Rust Webassembly Webgl киберпанк инди-игра tomshardware.com

Исследуйте ASCII-киберпанк-город в браузере! Движок Rust WebAssembly (283 КБ) рендерит 14 400 ячеек через WebGL. Узнайте, как работают генерация мира, кэширование символов и запасные варианты для старых устройств.

Инди-разработчик Grow Now! Games выложил в сеть играбельную браузерную сборку своего ASCII-киберпанк-города, по которому можно ходить. Она работает на движке Rust WebAssembly размером 283 КБ, который питает рендерер WebGL. Сборка появилась на этой неделе вместе со вторым видео на YouTube под названием ASCII City Update: Interiors, Elevation & Skyscrapers, которое вышло вслед за оригинальным роликом, набравшим более миллиона просмотров и 9000 комментариев. Страница загружает ascii-city-engine_bg-DqjAhqbp.wasm — модуль размером 283 КБ, который при запуске резервирует 1152 КБ линейной памяти и сообщает версию движка 0.1.0 при инстанцировании вне браузера. Его экспорты включают initialise_native_game, step_native_game и generate_native_local_map. Оставленные в бинарнике отладочные пути указывают на исходные модули Rust, стоящие за этими вызовами: city.rs, world.rs, population.rs, interiors.rs и rendering.rs. Генерация мира выполняется на Rust, который передаёт JavaScript массивы байтов, упакованные в base64, содержащие данные о высоте зданий, типах тайлов, поверхностях, оттенках, насыщенности, стилях окон, флагах освещения и идентификаторах планов этажей. Рендерер запрашивает контекст WebGL и компилирует пару вершинного и фрагментного шейдеров, причём фрагментная стадия состоит из одного вызова texture2D. Символы отрисовываются по одному в атласный холст с помощью fillText, кэшируются для каждой комбинации символа и цвета, загружаются в GPU одним вызовом texImage2D, а затем выводятся как текстурированные четырёхугольники с шестью вершинами каждый. Ячейки атласа имеют высоту 11 пикселей и ширину, равную ширине моноширинного символа плюс два. Каждая видимая ячейка попадает в одну загрузку буфера и один вызов drawArrays на кадр. Под этим слоем предусмотрено два запасных варианта: путь Canvas 2D через drawImage, если WebGL недоступен, и путь fillText для каждой ячейки, доступный через параметр URL ?direct. На десктопах рендерится 180 столбцов на 80 строк, то есть 14 400 символьных ячеек, шрифтом Consolas 10px с шириной строки 9 пикселей. На сенсорных устройствах количество строк снижается до 48, а столбцов — от 96 до 168; движок Rust использует отдельный профиль 160×112. Вершинный буфер предварительно выделяет 2,76 МБ и удваивается, если кадр превышает этот объём. Grow Now! Games описал оригинальное демо для PC Gamer как «без Unity, без Unreal, без 3D-моделей, текстур или шейдеров». Шутер от первого лица Backrooms для Sega 32X 1994 года работает на движке рейкастинга, написанном с нуля на C и ассемблере SH-2. Многопользовательская дань уважения Doom реализует рейкастинг и проецирование спрайтов как набор SQL-представлений, достигая примерно 30 FPS при разрешении 128×64. У ASCII-рогалика Thunder Lizard его символьная сетка была перерисована моделями изображений в полноценную анимацию с частотой около 10 FPS.

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

Похожие новости: