Сидорович за стойкой своего бункера на Кордоне, кадр из MH-X-Ray

MH-X-Ray

Движок S.T.A.L.K.E.R.: Тень Чернобыля с открытым кодом, перенесённый на 64-битную Windows. Та же игра и те же сохранения, но на 20–23 % больше кадров.

Версия x64-1.0 от 29 сентября 2026 года. Лицензия MIT.

Что это

MH-X-Ray — форк xrModder/X-Ray: исходного кода X-Ray 1.0007rc1, на котором вышла «Тень Чернобыля». Это только движок. Чтобы играть, нужна установленная копия S.T.A.L.K.E.R.: Тень Чернобыля.

Игровые данные, форматы уровней и сохранений не менялись. Сейвы открываются и в 64-битной, и в 32-битной сборке, обе собираются из одного кода. Проект для одиночной игры: мультиплеер из движка удалён.

Что изменилось

64-битная сборка
Движок собирается для x64 и для Win32. В коде не осталось ассемблерных вставок и API, которые есть только на x86.
Скрипты на LuaJIT 2.1
LuaJIT 1.0.3 с корутинами Coco работал только на x86. Новая версия понимает скрипты GSC вместе с их комментариями в стиле C. Ошибки Lua теперь попадают в лог и в Release-сборке.
Звук на OpenAL Soft
Вместо роутера Creative, DirectSound и EAX.dll. EAX эмулируется, поэтому реверберация окружения слышна на любой звуковой карте.
4K и два монитора
При масштабировании Windows картинка больше не размывается, а курсор доходит до края экрана. Шрифты растут вместе с разрешением. В окне без рамки курсор не уходит на второй монитор.
Исправленные ошибки
Редкое падение R2 при загрузке уровня. Пропадание геометрии на больших уровнях — о нём ниже.
Удалено
Мультиплеер, GameSpy, DirectPlay, BattlEye, выделенный сервер, патчер, проверка CD-ключа и маркеры SecuROM. Около 65 тысяч строк, которые одиночной игре не нужны.

Мир больше не исчезает

В оригинальной игре на больших уровнях иногда пропадали целые куски мира и возвращались, только если развернуться. Виновата система, которая отсекает геометрию за стенами и холмами. Если в кадре не было ни одного такого препятствия, она проверяла видимость по положению камеры из прошлого кадра. MH-X-Ray обновляет камеру каждый кадр.

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

На 20 % больше кадров

x64-сборка быстрее Win32 на каждом из 18 уровней. Ниже — точный замер на одном и том же сохранении: Release, 1280×720, по 30 секунд, сборки чередовались, медиана трёх прогонов.

Кадров в секунду, больше — лучше
  • Win32
  • x64

R1 статическое освещение

Win32 751,5 Прогоны: 740,6; 751,5; 758,6
x64 898,3 Прогоны: 893,7; 898,3; 917,7

x64 быстрее на 19,5 %

R2 динамическое освещение

Win32 400,9 Прогоны: 396,9; 400,9; 401,5
x64 493,2 Прогоны: 491,5; 493,2; 506,5

x64 быстрее на 23 %

Все прогоны таблицей
РендерСборкаПрогоныМедиана
R1Win32740,6; 751,5; 758,6751,5
x64893,7; 898,3; 917,7898,3
R2Win32396,9; 400,9; 401,5400,9
x64491,5; 493,2; 506,5493,2

Проверено на всех уровнях

Каждую сборку проверяет автоматический тест. Игра загружает сохранение, рисует уровень, считает кадры и выходит, а скрипт сравнивает предупреждения в логе с эталоном. Перед выпуском x64-1.0 так прошли все уровни сюжета: Win32 и x64, рендеры R1 и R2, 72 прогона без ошибок. Предупреждения у двух сборок совпали на каждом уровне.

Вручную на x64 в 4K пройдены Кордон, диалоги, торговля, задания, ПДА, сохранение и загрузка, переходы между уровнями. Полное прохождение сюжета с концовками ещё впереди.

Как запустить

Готовых сборок пока нет, движок собирается из исходников.

  1. Установите инструменты

    Visual Studio 2022 или новее с набором C++ v143 и Git.

  2. Соберите движок

    В Developer Command Prompt для Visual Studio:

    git clone https://github.com/midnightheartsgames/MH-X-Ray.git
    cd MH-X-Ray
    msbuild X-Ray.sln -p:Configuration=Release -p:Platform=x64 -m

    Готовые файлы появятся в Output\Binaries_x64.

  3. Скопируйте файлы в папку игры

    Папку Output\Binaries_x64 — под именем binaries_x64, содержимое папки Game — в корень папки игры. Архивы игры не меняются. Файлы в gamedata только убирают из меню сетевую игру и проверку обновлений.

  4. Запустите игру

    Файлом Launch_x64.cmd. Нужны Microsoft Visual C++ 2015–2022 Redistributable (x64) и DirectX End-User Runtime.

32-битная сборка собирается так же с -p:Platform=Win32, кладётся в binaries и запускается через Launch.cmd.

Как шёл перенос

Сначала всё лишнее удалялось, а x86-код переписывался на рабочей 32-битной сборке. Так каждое изменение проверялось на игре, которая уже запускается, и переход на x64 касался только настоящих 64-битных проблем.

  1. Базовая линия Точка отката и автоматический тест загрузки уровня.
  2. Удаление мультиплеера GameSpy, DirectPlay, выделенный сервер; исходники переведены в UTF-8.
  3. Переносимый код Ассемблер и x86-only API заменены на C++ и интринсики.
  4. Зависимости LuaJIT 2.1, OpenAL Soft, библиотеки DirectX для обеих платформ.
  5. Сборка x64 Платформа x64 в решении и сторонних библиотеках.
  6. Движок под x64 Решение собирается, усечение указателей — ошибка компиляции.
  7. Первый запуск Исправления x64, 4K и двух мониторов.
  8. Выпуск Обход всех уровней, замеры FPS, версия x64-1.0.

Причины каждого решения и найденные ошибки — в плане переноса.