Начат
FAF-RE
Движок Supreme Commander Forged Alliance, восстановленный в виде C++-исходников. Собирается под x86 и x64 и играет настоящие партии с теми же контрольными суммами, что и оригинал. Для сообщества FAF.
О проекте
Supreme Commander: Forged Alliance вышла в 2007 году, и её движок Moho с тех пор так и остался застывшим бинарником. Сообщество Forged Alliance Forever годами поддерживало игру, латая этот бинарник на месте. FAF-RE — тот же движок, заново записанный в виде читаемого C++20: он собирается, запускается и играет настоящие партии точно так же, как оригинальный ForgedAlliance.exe. Значит, его можно сопровождать как обычный код.
Восстановление закончено: каждая функция движка, которую использует игра, теперь в исходниках. Дальше — сделать его лучше оригинала.
- функций движка в исходниках, недостающих нет
- 40 617
- реплеев совпадают с оригиналом по всем контрольным суммамтекущий тестовый набор из хранилища FAF
- 75 / 75
- меньше времени, чем у оригинала, на реплей в x64пять реплеев, 8 потоков симуляции, от 4 до 33 %
- 19 %
- оригинал, сборки x86 и x64 в одной партии без рассинхронизациибои ИИ, живая сетевая игра
- 21 мин
Что работает
| Что | Состояние |
|---|---|
| Сборка | x86 (main.exe) и x64 (main_x64.exe), CMake и clang-cl |
| Графика | главное меню, ролики, игровой мир; Direct3D 9 и 10, как в оригинале, плюс добавленные Direct3D 11, Direct3D 12 и Vulkan |
| Игра | собственные сохранения и загрузка на обеих архитектурах |
| Реплеи | все 75 реплеев текущего тестового набора совпадают с оригиналом в каждой записанной контрольной сумме |
| Сетевая игра | оригинал, пересобранный x86 и пересобранный x64 в одной партии: 21 минута боёв ИИ без рассинхронизации; оригинал и x64 вдвоём продержались 30 минут, с потоками симуляции и без них |
| Ролики | .sfd через FFmpeg, без библиотеки Sofdec из оригинала |
Откуда я знаю, что всё совпадает
RTS с сетевой моделью lockstep — строгий судья. Каждый игрок считает одну и ту же симуляцию и сверяет контрольные суммы, так что одно неверное число с плавающей точкой в одном тике сразу даёт рассинхронизацию. Поэтому тестовый набор — это хранилище реплеев FAF: настоящие партии на стандартных и пользовательских картах, от 1 до 12 живых игроков, против встроенного ИИ и M28AI. Каждая проигрывается на пересобранном движке и сверяется с оригиналом сумма за суммой.
Ускоренная сборка x64 живёт по тому же правилу. Работа симуляции уходит в рабочие потоки только там, где результат доказуемо тот же, что и при последовательном счёте, и у каждой такой правки есть переключатель, который возвращает исходный код.
Как собрать
Нужна своя копия игры: в репозитории нет ни бинарников, ни ресурсов, ни карт, ни скриптов игры, ни чего-либо, полученного из них. Дальше так:
-
Поставьте Visual Studio 2022 с нагрузкой C++, LLVM (clang-cl и lld-link) и Git.
-
Клонируйте репозиторий вместе с подмодулями:
Terminal window git clone --recursive https://github.com/Draiget/faf-re.git -
Соберите и скопируйте исполняемый файл в папку запуска FAF:
Terminal window .\build.ps1 # x64 Release.\build.ps1 -Arch both # x64 и x86
При конфигурации все зависимости скачиваются и собираются из исходников строго заданных версий: Wild Magic 3.8, wxWidgets 2.4.2, Boost 1.34.1, zlib 1.2.3, FFmpeg 7.1.3 и остальные. Полный список и параметры — в README.
Ссылки
faf-re на GitHubИсходники, скрипты сборки, заметки про совпадение с оригиналом и производительность.github.com SC:FA Moho engine sourcesТема с анонсом на форуме FAF.forum.faforever.comСпасибо
FAF-RE опирается на годы изучения движка сообществом Forged Alliance Forever. Отдельное спасибо Hdt80bro и 4z0t.
Это независимый проект по сохранению игры и совместимости с ней. Он никак не связан с издателем или разработчиком игры и не одобрен ими.
Дорожная карта
Готово 22 из 34обновлено
Готово22
Пока пусто.
- СетьУстойчивость к битым сетевым данным
Испорченное сообщение от одного игрока больше не роняет лобби и не завершает игру. Повреждённые реплеи и сохранения отклоняются с объяснением причины.
- Сборка и инструментыCMake и clang-cl
Вместо проекта Visual Studio теперь одна сборка на CMake и clang-cl для x86 и x64. Все библиотеки, включая FFmpeg, скачиваются в зафиксированных версиях и собираются из исходников.
- ВосстановлениеВосстановление завершено
Все функции движка, которые использует игра, написаны в исходниках: 40 617 функций, не осталось ни одной.
- СимуляцияПатчи FAF в исходниках
Исправления движка, которые FAF выпускает патчами к исходному exe, перенесены в код и включаются по версии игры, вплоть до 3840.
- ПроизводительностьСборщик мусора Lua в рабочих потоках
Пометка и очистка идут в рабочих потоках симуляции с тем же результатом, что и у последовательного сборщика. Время сборки мусора за игру сократилось с 35,9 до 9,3 с.
- ПроизводительностьБыстрее оригинала
На пяти реплеях из хранилища с восемью потоками симуляции сборка x64 тратит в среднем на 19 % меньше времени, чем оригинал (от 4 до 33 %), и все контрольные суммы совпадают.
Показать ещё 16
- ГрафикаЗначки и туман войны на GPU
Стратегические значки, туман войны, рамки выделения и значки снарядов рисует GPU на Direct3D 11, 12 и Vulkan. Каждый такой путь включается, только когда прошёл сверку с исходной отрисовкой.
- Платформыx64 без ограничения в 2 ГБ
Сборка x64 по умолчанию работает с полным 64-битным адресным пространством. x86 упирается в него примерно на 60 000 юнитов, x64 продолжала работать и на 90 000.
- ПроизводительностьРазгрузка основного потока
Реплеи считают до 10 тактов впереди экрана, а значки, отсечение по видимости, туман войны и обновление юнитов выполняются в рабочих потоках. Одно только опережение сократило 41-минутный реплей на 12 игроков с 37:33 до 20:46.
- ГрафикаDirect3D 11, 12 и Vulkan
К исходным Direct3D 9 и 10 добавились Direct3D 11, 12 и Vulkan, игра сама выбирает самый новый из тех, что запустились. Эффекты игры переводятся при загрузке, и DXC компилирует все 339 точек входа 11 эффектов для Direct3D 12 и Vulkan.
- Симуляция76 из 76 реплеев
Совпадают все игры тестового набора: от 1 до 12 игроков, стандартные и пользовательские карты, игры против встроенного ИИ и M28AI, от 9 до 83 минут.
- СетьОригинал, x86 и x64 в одной игре
Три клиента, оригинальная игра и обе новые сборки, провели в одной живой игре 21 минуту боёв под управлением ИИ без рассинхронизации.
- ПроизводительностьСимуляция в рабочих потоках
Первым в рабочие потоки ушло обновление отметок разведки по армиям. С 0 и с 8 потоками реплей на 12 игроков дал побайтно одинаковый результат на всех 6814 проверенных тактах.
- СимуляцияПервые реплеи совпали с оригиналом
Девять настоящих игр из хранилища реплеев FAF (8–12 игроков, 30–46 минут) дают ту же контрольную сумму, что и оригинал, на каждом игровом такте.
- Сборка и инструментыОтчёты о сбоях
При сбое пишется один текстовый отчёт: стеки всех потоков, стеки Lua со строками исходников, состояние игры и хвост лога, плюс минидамп. Раньше сбой просто вешал игру, а лог обрывался.
- СимуляцияСохранение и загрузка
Сохранения записываются и загружаются в обеих сборках, x86 и x64.
- ГрафикаСвой видеоплеер
Ролики .sfd играют через собственный плеер на FFmpeg, видеобиблиотека из оригинала не используется.
- ПлатформыСборка x64
main_x64.exe собирается из тех же исходников. Стенд для локального мультиплеера свёл её в одной игре со сборкой x86: 1250 тактов в lockstep без рассинхронизации.
- ГрафикаВ игре
Командир появляется и отрисовывается на местности, работают выделение юнитов и игровой интерфейс.
- СимуляцияЗагружается карта для схватки
Карта загружается, симуляция создаётся, блупринты читаются, армии появляются.
- ГрафикаГлавное меню
Текстуры меню загружаются, кнопки отвечают на нажатия.
- Сборка и инструментыПервая сборка, которая линкуется и запускается
Восстановленные исходники собираются в один исполняемый файл, и он без сбоев доходит до создания графического устройства.
В работе3
Пока пусто.
- СетьВыделенный сервер
Необязательный режим для турниров: единственная симуляция работает на Linux-сервере без графики, и игроки подключаются к нему, а не друг к другу. Обычные игры остаются P2P и не меняются.
- ПлатформыСимуляция на Linux
Симуляция собирается на Linux с clang и проигрывает тестовые реплеи до конца с теми же контрольными суммами, что и на Windows. Следующий шаг — весь набор реплеев.
- СетьКлиент на данных сервера
Клиент показывает игру по потоку данных от сервера, а не по своей симуляции.
В планах6
Пока пусто.
- ПроизводительностьПозы и анимация в рабочих потоках
Позы и анимация занимают около 14 % времени симуляции. Следующим шагом они переедут в рабочие потоки, а результаты будут применяться в исходном порядке.
- ПроизводительностьРабочие потоки симуляции по умолчанию
Сейчас рабочие потоки симуляции выключены, если не задан /simworkers. По умолчанию они включатся после проверок с другим числом потоков и с перемешанным порядком выполнения.
- ГрафикаDirect3D 12 в быстрых реплеях
На реплее на полной скорости Direct3D 12 пока медленнее Direct3D 9: 1032 с против 924 с на одной и той же игре.
- СетьLinux-сервер и клиенты на Windows
Сервер на Linux и клиенты на Windows: сначала в локальной сети, потом через ретранслятор. Реплей, который пишет сервер, должен проигрываться на Windows с теми же контрольными суммами.
- СетьТурнирные функции
Лобби на сервере, переподключение, трансляция с задержкой для комментаторов, пауза и принудительный старт от администратора, результаты отправляет сервер.
- ВосстановлениеТипизированные параметры-указатели
962 функции принимают нетипизированный параметр void*, и у 70 из них можно указать настоящий тип. Остальные — обратные вызовы, намеренно стёртые типы или мёртвый код.
Потом3
Пока пусто.
- ПлатформыВся игра на Linux
Работа над сервером переносит на Linux только симуляцию. Vulkan уже есть, но окну, вводу и звуку нужна своя реализация под Linux.
- ПлатформыmacOS и arm64
Сборки clang под macOS на x86_64 и arm64 есть в долгосрочном плане, но собирать и проверять их пока не на чем.
- ГрафикаРолики с альфа-каналом и субтитры
Ролики с альфа-каналом и субтитры пока не поддерживаются: такие ролики отклоняются при открытии с записью в лог.
Серия
Постов про этот проект пока нет.