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

Пост на правах идеи – реализации пока нет даже в черновом виде, поэтому пока сложно сказать, появится ли эта фича в следующей версии 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-машина не является основной для работы. Может быть, получится запустить какую-нибудь старую версию – буду экспериментировать.

Обновления

Лето подошло к концу – это печально 🙁 Но при этом спешу порадовать читателей хорошими новостями: одновременно вышли новые версии dlib и Dagon.

dlib 1.2.1 – в основном, исправляющий релиз. Исправлены ошибки в dlib.filesystem.posix.common, предупреждения о депрекациях в dlib.core.thread и dlib.math.utils. В dlib.image добавлен медианный фильтр (модуль dlib.image.filters.median).

Dagon 0.15.0 – первый релиз за последний год. Добавлена поддержка 1D и 3D-текстур и новые методы для класса Texture (setFaceImage, setFaceBit, createFromImage3D). Шейдер цветовых таблиц (LUT) теперь поддерживает таблицы в формате Hald CLUT – нужно создать 3D-текстуру из изображения Hald CLUT и просто передать в game.postProcessingRenderer.colorLookupTable. Появились новые параметры шейдера глубины резкости (DoF) для ручного управления эффектом: dofManual, dofNearStart, dofNearDistance, dofFarStart, dofFarDistance. Загрузчик glTF теперь декодирует встроенные в JSON-файл текстуры. Менеджер событий обзавелся поддержкой относительного режима мыши (EventManager.setRelativeMouseMode) для более надежной реализации управления мышью в играх. Соответственно, компонент управления FirstPersonViewComponent теперь использует по умолчанию относительный режим.
Обновился биндинг Newton Dynamics до свежей версии библиотеки: функция NewtonUserJointSetRowSpringDamperAcceleration удалена в пользу NewtonUserJointSetRowMassDependentSpringDamperAcceleration и NewtonUserJointSetRowMassIndependentSpringDamperAcceleration. Добавлен новый метод для ньютоновских твердых тел: NewtonRigidBody.localPointVelocity.

Реализация движка Sacrifice на D

Недавно узнал, что Dagon использовался для разработки свободной реализации игры Sacrifice (2000 г.) на D – sacengine. Только сейчас дошли руки собрать и протестировать. Сама игра мне не знакома, но проект очень интересный. Dagon используется в нем в качестве графического бэкенда. Как следствие, картинка sacengine имеет ряд существенных улучшений по сравнению с оригиналом – поддерживаются мягкие тени, SSAO, постэффект свечения, антиалиасинг.

Я рекомендую собирать игру компилятором LDC и обязательно в релизном режиме, в противном случае она будет заметно притормаживать:

dub build --compiler=ldc2 --build=release-nobounds

Для запуска нужно скопировать скомпилированный 3d.exe в папку с игрой, также нужны библиотеки freetype.dll, libmpg123-0.dll, OpenAl32.dll, SDL2.dll.

Исходники движка доступны под GNU GPL v3.