December 29, 2025

Итоги 2025-го года

Представляем вашему вниманию ставший уже традиционным отчёт о проделанной за год работе. Теперь все большие посты для удобства чтения публикуются на площадке Teletype.

Достижения и изменения

  1. Одним из главных изменений стал переход движка на OpenGL Core Profile.
    Теперь минимальная необходимая версия OpenGL - 3.2. Это позволило убрать из кода всё наследие прошлых лет и сделало движок более стабильным, в плане запуска на видеокартах от Intel и AMD. Как вы знаете, эти вендоры строго следуют стандартам от Khronos, поэтому если разработка велась на видеокарте от Nvidia и вы немного отошли от этих стандартов, то с немалой долей вероятности на встройках Intel и картах от AMD будут наблюдаться проблемы и артефакты рендеринга. Core Profile – это достаточно жёсткий стандарт, который позволяет точно выдерживать спецификации, независимо от видеокарты.
  2. По-прежнему засекреченная часть работы, которая заняла промежуток с марта по июнь 2025-го года. В 2026-м году, скорее всего узнаете, что именно это было.
  3. Создание нового звукового движка.
    Как вам известно, XashNT строился на базе Xash3D путём его полного переписывания, звуковой движок не стал исключением. Он научился учитывать геометрию уровня для моделирования более реалистичного распространения звука, приобрёл физические константы, такие как скорость распространения звука, а также научился моделировать приглушение звука, если источник и\или слушатель находятся под водой. Добавилось множественное проигрывание музыкальных треков (к примеру, можно запускать новый саундтрек ещё до остановки старого), полноценная сериализация в сейв абсолютно всех играющих звуков и окклюзия распространения звука сквозь порталы. Также отмечу, что DSP-эффекты теперь привязаны к каждому из каналов, а не к самому слушателю. Звуковая картина стала более насыщенной и с чёткой локализацией источников звука.
  4. Компилятор построения навигационной сетки для NPC практически завершён.
    Оттестированы некоторые проблемные моменты, вроде изолированных локальных участков навигационных сеток, состоящих из двух-трёх ячеек, восстановлены двусторонние связи на сетке в местах, где геометрия уровня могла потенциально их нарушить (например, слишком высокие ступеньки), улучшено сглаживание между ячейками сетки и проведён рефакторинг оффлайн-симулятора движения.
  5. В компилятор уровней добавилась поддержка импосторов.
    Пока что в виде подгрузки уже готовых моделей, но в дальнейшем компилятор научится генерировать их автоматически из исходной геометрии. Также для моделей, которые при компиляции становятся частью уровня (статики, инстансы) появилась приятная возможность выбора субмодели и анимации (это касается только моделей в формате .model). Полностью отрефакторен код нанесения декалей в compile-time, старый вариант плохо справлялся с наложением на неаксиальные поверхности, декали могли наложиться в урезанном виде или же не наложиться вовсе. Добавлена возможность задавать компрессию для уже скомпилированного уровня (влияет на размер файла на диске). Проведена окончательная стандартизация поведения компилятора для уровней, состоящих исключительно из полигональной геометрии (то есть без брашей).

    Создана новая спецификация для имён встроенных моделей. Исторически эти имена выглядели как '*число' что неизбежно приводило к коллизии имён при попытке загрузить в память сразу несколько уровней. Теперь имена встроенных моделей содержат имя уровня, что помещает их в уникальное пространство. Стандартизованы эпсилоны округления физической оболочки, чтобы предотвратить потенциальное 'застревание в текстурах' в некоторых редких случаях. Постпроцессор CSM научился исправлять T-Junc соединения до генерации первичной развертки лайтмапы, что должно помочь сделать её более бесшовной (хотя, в некоторых случаях всё же приводит к замыканию лайтмапы на саму себя).

    Также появилась возможность выборочно отключать вторичное освещение (radiosity) для произвольно выбранной геометрии. Это может пригодиться, например, для декораций за границами игровой зоны, куда игрок гарантированно не сможет добраться. Как правило такие декорации имеют большой размер, а вот вклад вторичного освещения на них практически не заметен. Переработан механизм автоматической расстановки моделей на поверхности (чаще всего это растительность, хотя и необязательно) для более равномерного их распределения и предотвращения расстановки нескольких моделей в одной и той же точке.

    Улучшен механизм предсказания размеров страницы лайтмапы на случай, если подавляющее большинство геометрии — это инстанс-модели с повертексным освещением\освещением по одному сэмплу. Раньше, в некоторых случаях, компиляция таких уровней могла закончится ошибкой из-за неверно определённого размера страницы лайтмапы.
  6. Компилятор освещения, хотя и был практически закончен на конец 24-го года, тем не менее получил несколько обновлений.
    В первую очередь, переписан механизм освещения амбиент-кубов, которые используются в качестве лайтпроб для освещения динамических объектов в сцене, например NPC. Следующим улучшением стал рефакторинг кода рейтрейсинга. Скорость расчёта освещения выросла в 3-4 раза. Добавился код расчёта запечённого Ambient Occlusion (скопление тени в углах). Окончательно стандартизовано переключение между PTPFF и классическим расчётом освещения светоизлучающих поверхностей. Проведён рефакторинг всего лайтмаппера с целью оптимизации потребления оперативной памяти.
  7. В самом движке также было сделано немало разных улучшений.
    В первую очередь, можно отметить рефакторинг 2D-подсистемы рендеринга, которая теперь тоже использует материалы и шейдеры вместо фиксированного конвейера и получила тот же набор возможностей, что и 3D-рендеринг, включая и возможность чтения параметров из пользовательских библиотек на HeadShot.

    Отладочные панели движка больше не налезают друг на друга и получили возможность динамической композиции, в зависимости от того, какие из них активны. Рендер теперь использует Uniform Buffer Objects, что значительно упростило доступ к переменным - большинство из них теперь не нужно явным образом прописывать в материалах, они подтягиваются автоматически. Значительно расширена и дополнена система частиц - она научилась на лету преобразовывать скрипты из системы частиц Aurora, созданной ещё для мода Spirit Of Half-Life в формат настроек, понятный XashNT. Был добавлен и специальный режим работы для симуляции осадков - дождя, снега.

    Ну и одно из главных изменений этого года - в движке реализовано динамическое освещение: каскадные тени от солнца, тени от всенаправленных источников и симулятор вторичного освещения на базе Light Propagation Volumes. На данный момент его работа ещё далека от идеала, хотя бы в плане производительности и ограничений, однако, я полагаю, что уже в следующем году вы сможете полноценно использовать динамическое освещение не прибегая к помощи лайтмап, или же смешивать динамику и статику в необходимой пропорции, добиваясь оптимальной производительности, в зависимости от сеттинга.

    Подключены автоматические ЛОДы, которые создаются при компиляции моделей или уровней. Сами ЛОДы были уже довольно давно, однако не использовались, я как-то совсем про них забыл. Подсистема менеджмента шейдеров получила кастомный препроцессор, что наконец-то избавило вывод сообщений об ошибках от проблемы с путаницей в реальных номерах строк и именах файлов и заодно гарантирует, что все возможности препроцессора будут присутствовать независимо от производителя видеокарты (к примеру, у AMD на некоторых версиях драйверов не поддерживается оператор двойной решётки).
  8. Исправлен редактор уровней JackHammer, который в данный момент используется в качестве основного редактора для XashNT.
    Проблема заключалась в невозможности сменить игровую папку без полного перезапуска всего редактора — это обычно приводило к вылету или же отказу редактора загружать текстуры из новой игровой директории. Данная проблема устранена.
  9. Файловая система получила механизм префетчинга.
    Теперь дерево файловой системы строится локально и поиск осуществляется минуя системные вызовы, что может несколько замедлить запуск движка, но ускоряет поиск и загрузку файлов вдвое. Впрочем, система отключаемая, так что, если у кого-то она даст негативные результаты, её всегда можно выключить. Также в этом году был произведён окончательный отказ от .zip архивов в пользу собственного формата .bundle
  10. Компилятор моделей со скелетной анимацией снова в строю.
    Последний раз его работа тестировалась в далёком 2021-м году, за это время многое успело поменяться, но собирать модели всё это время не было необходимости - висело слишком много более важных задач. Исправлены основные критичные недостатки, что позволило вновь собирать им модели. Напомню, что также есть альтернатива через конверсию моделей из старых игр с помощью нативного конвертора, входящего в состав XashNT SDK.
  11. Язык HeadShot получил расширение в виде дочернего языка под названием SubShot.
    В отличие от родительского языка, SubShot компилируется прямо при запуске приложения и его исходные тексты сливаются с основной библиотекой. Таким образом, именно от организации кода, написанного на HeadShot, зависит какие возможности и интерфейсы будут предоставлены в дочерней имплементации языка. Теперь, в настройках проекта можно указать пути и расширения, по которым будет осуществляться поиск SubShot-файлов для их компиляции.

    Язык предназначен для расширения функционала базовой библиотеки в тех случаях, когда обнародование её исходников невозможно или нежелательно. Но и сам факт, что после редактирования исходников на SubShot, вам не требуется каждый раз запускать их компиляцию, тоже может оказаться полезным и удобным. Типичные сценарии использования - добавление новых игровых объектов (например, оружие), элементов меню или пользовательского интерфейса.
  12. Игровой код Ксаш-мода портирован на 90%.
    Осталось перенести код нескольких монстров и физических объектов, но, к сожалению, до имплементации физического движка в этом году руки так и не дошли. Также отмечу, что портирование кода на HeadShot сопровождалось регулярными улучшениями и изменениями в самом компиляторе, что в свою очередь также тормозило процесс. К тому же, всё это необходимо было проверить в реальных игровых ситуациях. Теперь есть возможность перенести код оружия не в собранную библиотеку, а оформить в виде внешних файлов на языке SubShot (характерный пример его использования), что частично уже реализовано.

Планы

А теперь поговорим о планах на будущий 2026-й год. У вас наверняка есть невысказанный вопрос по поводу инструментов редактирования, да и инструментов вообще. Да, я помню, что обещал приступить к их реализации ещё в 24-м году, потом успешно перенёс в это дело на 25-й и вот, собственно - очередной перенос. Поясню, почему так происходит. Всё дело в том, что в отличие от старых игр, XashNT будет использовать для редактора тот же код рендеринга и взаимодействия игровых объектов, что и сам движок, это давно уже стало правилом хорошего тона. Единственный разумный способ это обеспечить - переиспользование кода. Но, прежде чем переиспользовать код, его необходимо дописать, отладить и абстрагировать. Чем я, собственно, и занимался эти два года (разумеется, не только этим). В противном случае мне бы пришлось постоянно рефакторить переиспользуемый код, одновременно проверяя, что он корректно работает и в редакторе, и в движке. Теперь же, когда движок XashNT практически закончен (осталось только дописать менеджер сети и физический движок), это уже не представляет особой проблемы и написанный код наконец-то можно абстрагировать и переиспользовать не только в редакторе, но и, например, в просмотрщике ресурсов.

Простыми словами, написанное выше означает, что в окне редактора будет динамическое освещение и (в перспективе) физика, возможность запускать игру и дебажить отдельные компоненты сцены – как в том же Анриле или Юнити. Таким образом, реализуется современный подход к разработке без необходимости полностью перекомпилировать весь уровень и запускать отдельно игру при каждом изменении.
Что, как вы знаете, было принципиально невозможно в Valve Hammer Editor и ему подобных редакторах старой школы.

Второй важный момент заключается в том, что я хотел непременно использовать в качестве оконного менеджера библиотеку VCL из Delphi, портировав её на HeadShot. Библиотека эта весьма сложная, использует специфичный функционал самого языка Delphi и на C++ не портируется никоим образом. HeadShot же, создавался с расчётом на то, что портирование VCL на него будет возможным. Но одно дело создать язык, а другое - убедиться в его работоспособности. Разумеется, никакие unit-тесты не дадут нам объективной картины. Только практика и общее время использования могут доказать, что язык стал достаточно стабильным и пригодным для подобных вещей. Если вы помните, первую попытку портировать VCL я сделал ещё осенью 22-го года, но тогда язык явно был не готов для этого. Сейчас же, полагаю, HeadShot готов для портирования VCL полностью. Остался лишь последний штрих - реализация исключений, чем я и занимаюсь, параллельно с написанием этой статьи :)

Подводя итоги, могу сказать, что 2026-й год уже полностью распланирован и максимальные приоритеты получили задачи по созданию инструментов редактирования. Так что 2026-й год, возможно, и станет той переломной точкой, когда от запуска движка из простого любопытства - "посмотреть, что это такое" – вы перейдёте к попыткам сделать на нём собственную игру, используя уже нативный инструментарий.
Тогда разработка Ксаша естественным образом вступит в следующую фазу: улучшать уже существующее, не ломая привычного.

🎄 🎄 🎄Поздравляем наших подписчиков с наступающим 2026-м годом! 🎄 🎄 🎄

Автор: Дядя Миша

Корректор: Евгенiй Дикс

© Seamless Realm www.seamless-realm.ru

https://t.me/xashnt

28.12.2025