Inform 7

Исследуя свободные игровые движки, случайно наткнулся на настоящий бриллиант – платформу для создания текстовых квестов Inform 7. Это штука, не имеющая аналогов – декларативный язык программирования, использующий естественный синтаксис английского (NLP-система). То есть, программы на нем пишутся в форме обычного текста, состоящего из определений и утверждений. Система позволяет вводить любые новые понятия и абстракции, сущности и их свойства. Получившееся в результате семантическое содержание и составляет логику игры, которая затем транслируется в стандартный код для Z-машины. Таким образом, исходник квеста представляет собой своего рода книгу, которая описывает мир игры, ее сценарий, возможности игрока, отношения и взаимодействия между игровыми сущностями и т.д.

До этого я еще не встречал NLP-системы с такой “человеческой” онтологией, ведь обычно взаимодействие с компьютером строится на математико-логическом аппарате, на классах, структурах и алгоритмах, а не на бытовом способе мыслить и разговаривать. В Inform 7 нет никаких структур и даже типов данных – есть лишь языковые инструменты, позволяющие вам выстроить ваш собственный понятийный аппарат, на основе которого будет работать игра.

Жанр классических текстовых квестов, уходящий корнями в культовый Zork, обычно предполагает перемещение игрока по карте воображаемого мира, как в ролевых играх – Inform включает в себя стандартные понятия для описания карты и соответствующий рантайм с готовым интерпретатором команд перемещения. Вы описываете мир как совокупность абстрактных “комнат”, указывая их расположение относительно друг друга (“К востоку от дома расположено озеро”). Потенциально так можно создать все, что угодно – хватило бы фантазии.

Например, впервые сев за Inform, я залип на целый вечер и написал набор определений, описывающий автомат с конфетами и напитками – игрок имеет некоторое количество денег и может делать покупки в автомате. Что такое “деньги”, и что означает “покупать” – это тоже определяет программист. Для этого приходится подключать какие-то особые мозговые доли: Inform заставляет вас думать по-новому, с изрядной долей креативности! Я бы назвал эту платформу философской машиной – в ней нужно мыслить как философ от инженерии, выстраивать в голове сложные абстракции, придумывать свои собственные системы категорий. И мне почему-то кажется, что на одних только текстовых квестах свет клином не сошелся – Inform потенциально можно использовать для каких-то инновационных способов взаимодействия с информацией, в качестве компонента базы знаний, как мощный инструмент прототипирования и описания различных моделей. Обязательно продолжу экспериментировать.

https://ganelson.github.io/inform-website/

Сжатие текстур, часть II. RGTC

Продолжение серии постов о сжатых текстурных форматах. Первая часть тут.

RGTC (BC4, BC5)

Red Green Texture Compression

Форматы сжатия для 1- и 2-канальных изображений – условно “красных” и “красно-зеленых”. Разработаны ATI (ныне AMD), поддерживаются всеми современными десктопными видеокартами.

BC4 (также известный как RGTC1, ATI1 и 3Dc+) предназначен для хранения монохромных изображений (не обязательно красных, разумеется). Формат использует 64 бита на блок 4×4. Endpoint’ы хранятся в виде 8-битных значений, из них создается 6 промежуточных значений. Индексы пикселей 3-битные. Преимущество BC4 – значительно более высокое качество при хранении монохромных текстур, чем при использовании BC1. Это делает формат самым подходящим выбором для карт высот и различных нецветовых данных, таких как шероховатость и металличность. Качество градиентов почти неотличимо на глаз от несжатого оригинала.

BC5 (также известный как RGTC2, ATI2 и 3Dc) хранит двухканальные изображения, условно называемые “красно-зелеными”. Принцип сжатия аналогичен BC4, только в данном случае каждый блок 4×4 описывается двумя каналами по 64 бита каждый, при этом красный и зеленый каналы сжимаются независимо друг от друга. В BC5 удобно хранить, например, совмещенные текстуры шероховатости и металличности.

Стандарт RGTC определяет текстуры со знаком и беззнаковые. Они полностью идентичны, разница лишь в том, что формат со знаком кодирует значения от -128 до 127, а не от 0 до 255. Для формата со знаком действует правило: если первый endpoint равен -127, второй не должен быть -128.

Стриминг уровней

Пост на правах идеи – реализации пока нет даже в черновом виде, поэтому пока сложно сказать, появится ли эта фича в следующей версии Dagon.

Стриминг уровней – это способ реализации игр с большим миром, который не может быть загружен в память целиком. Система стриминга загружает и выгружает фрагменты игрового мира по мере того, как игрок путешествует по нему.

Я планирую написать систему, предназначенную для перемещений преимущественно на плоскости – как правило, по поверхности планеты. Мир разбивается на 2D сетку с каким-то заданным шагом – например, 100×100 метров. Каждая ячейка сетки представляет собой отдельный ресурс, который можно создать и загрузить независимо от остальных. По умолчанию игра загружает только “домашнюю” ячейку, в которой находится игрок в начале пути, а также 8 соседних ячеек. Таким образом, видимыми и интерактивными для игрока одновременно являются 9 ячеек. В зависимости от размера ячейки и особенностей игры этот параметр, скорее всего, можно будет настраивать – также, возможно, для далеких ячеек можно будет отображать LOD’ы. Когда игрок перемещается в соседнюю ячейку, игра подгружает необходимые отсутствующие в памяти ячейки, если они существуют, и выгружает ячейки, ставшие слишком далекими. Загрузка будет происходить в фоновом потоке, по возможности без прерывания геймплея.

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

Сжатие текстур, часть I. S3TC

Я как-то обещал написать пост с подробным разбором всех форматов сжатия текстур и соответствующего инструментария – и вот, наконец, начинаю публиковать частями. Сегодня рассмотрим один из старейших и самых популярных – S3TC (DXTn).

Тот или иной способ сжатия сегодня используется почти во всех стандартных графических форматах. Однако такие форматы, как PNG или JPEG, хотя и сжимают весьма эффективно, для текстур в видеопамяти не годятся – они предназначены для хранения на диске и передачи по сети. В качестве текстур их можно использовать только после декомпрессии. Для хранения текстур в сжатом виде были созданы специализированные форматы, которые позволяют считывать пиксели на лету, без полной декомпрессии данных.

(далее…)

Я возвращаюсь на Linux!

Если вы читаете мой блог с самого начала, то должны помнить, что в первой половине десятых я в основном пользовался именно этой ОС: я даже написал две статьи о своем опыте работы с системой – Почему я выбираю Linux? (2012) и 7 лет с Linux (2015). К сожалению, с 2018 года мне по работе пришлось стать виндузятником. Не то, чтобы это создало какие-то неудобства, но времени на Linux хватать перестало – к тому же я купил новые компьютеры, а старый линуксовый ноутбук отдал родственникам. Систему, естественно, пришлось снести. Но недавно захотелось мне привести в рабочее состояние другой ноут, с ужасно тормозной OEM-версией Windows 10. Я выбрал для него все тот же Linux Mint, а именно 21.2 MATE Edition (кто не в курсе – MATE является форком классического рабочего стола GNOME 2). Кстати, впервые в жизни не стал ставить Linux в дуалбут с Windows, переформатировал весь диск – терять было нечего. И вот я опять как дома!

Я был приятно удивлен: за 5 лет моего отсутствия линуксовый десктоп стал заметно лучше. Системные приложения, конечно, в основном все те же, привычные для старого гномовода. Однако в мое время пакеты ставились вручную в консоли, при помощи apt-get – теперь же есть удобный каталог ПО с графическим интерфейсом. Хорошая поддержка оборудования: Wi-Fi заработал из коробки без необходимости устанавливать драйвер. Драйвер для видеокарты система сама обнаруживает и скачивает – правда, показалось странным, что при этом нужно вводить пароль Secure Boot. Ну, видимо, такие теперь порядки в эпоху UEFI.

Пожалуй, самое важное нововведение последних лет – это Flatpak. Я в свое время прошел все круги ада в плане установки приложений – наверное, каждому линуксоиду нулевых знакомы проблемы с зависимостями бинарников, версиями glibc, зоопарком звуковых подсистем. О том, чтобы ставить программы инсталляторами, как в Windows, приходилось только мечтать – я всегда твердил, что популярности Linux на десктопе мешает именно это. Похоже, что Flatpak решает данную проблему: это утилита для создания самодостаточных бинарных пакетов без зависимостей, которые запускаются в изолированном окружении-песочнице. Они могут взаимодействовать с ОС через механизм порталов – можно дать приложениям доступ к диску, сети, устройствам и т.д. При этом в системные папки типа /usr/bin, /usr/lib ничего не устанавливается, и это просто замечательно! Флатпаки, естественно, дистрибутиво-независимы – не нужно создавать отдельные пакеты на каждый дистрибутив и разные его версии, что всегда было дичайшей головной болью разработчиков. В Mint поддержка Flatpak встроена в менеджер приложений: вы можете устанавливать как традиционные deb-пакеты, так и пакеты с Flathub. Минусом такого подхода является то, что флатпаки достаточно много весят, но, по современным стандартам объемов носителей, это не так уж важно.

Очень понравилось, что в виде флатпаков можно установить все бесплатные приложения, нужные мне для работы: Figma, VS Code, GitHub Desktop и др. А еще в мое время под Linux было совсем мало игр. Сегодня ситуация гораздо позитивнее: есть Steam, где я обнаружил linux-версии многих своих любимых игр последних лет. Радует полноценная поддержка Linux в мейнстримных игровых движках, особенно свободных. Установил Node.js, и с полоборота запустились все мои тулчейны для разработки баннеров и браузерных игр – благо там почти все кроссплатформенное. Хобби-проекты теперь, конечно, тоже буду полноценно тестировать под Linux.

Единственный серьезный минус, который пока заметил: свежий Photoshop не запускается под WINE. Но в моем случае жить можно и без ФШ, учитывая, что linux-машина не является основной для работы. Может быть, получится запустить какую-нибудь старую версию – буду экспериментировать.