Как NTSYNC в Wine 11 решает проблему синхронизации потоков в Linux-играх

2026-03-24 146 комментарии
Драйвер NTSYNC в ядре Linux 6.14 заменяет обходные решения esync и fsync. Разбираем, почему прежние механизмы были компромиссом и что изменилось

Разработчики Wine выпустили стабильный релиз Wine 11.0 — уровень совместимости для запуска Windows-приложений в Linux, macOS и BSD. За год работы внесено около 6300 изменений и исправлено более 600 ошибок. Главные новшества — поддержка драйвера синхронизации NTSYNC на уровне ядра Linux и завершение архитектуры WoW64, позволяющей запускать 32-битные приложения без установки 32-битных системных библиотек.

NTSYNC заменяет прежние обходные решения esync и fsync, которые эмулировали примитивы синхронизации Windows NT средствами пользовательского пространства Linux. Драйвер NTSYNC вошёл в основную ветку ядра Linux 6.14 и доступен без сторонних патчей. Для старых игр с высокой многопоточной нагрузкой прирост производительности по сравнению с ванильным Wine достигает сотен процентов.

Помимо синхронизации и WoW64, Wine 11 существенно продвинул поддержку Wayland, перевёл OpenGL-рендеринг на EGL по умолчанию, обновил Vulkan до версии 1.4 и добавил аппаратное декодирование H.264 через Vulkan Video.

NTSYNC: синхронизация на уровне ядра вместо обходных решений

Современные Windows-игры активно используют многопоточность — одновременно работают потоки рендеринга, физики, загрузки ресурсов, звука и ИИ. Для координации потоков Windows применяет примитивы синхронизации ядра NT: мьютексы, семафоры, события. В Linux точных аналогов этих механизмов нет, и Wine исторически эмулировал их через обращения к собственному процессу wineserver. Каждый вызов синхронизации требовал двустороннего RPC-обмена — при тысячах обращений в секунду накапливалась заметная задержка.

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

Первым обходным решением стал esync, разработанный Elizabeth Figura из CodeWeavers. Он использовал системный вызов Linux eventfd и обходился без wineserver, но у ряда дистрибутивов возникали проблемы с лимитами файловых дескрипторов — игры с большим числом объектов синхронизации быстро упирались в системный потолок.

Следующий шаг — fsync — работал через механизм futex ядра Linux и был быстрее esync. Однако fsync требовал патчей, не принятых в основную ветку ядра. На практике им пользовались только те, кто ставил кастомные ядра: CachyOS, Proton GE и аналогичные сборки.

Оба решения оставались компромиссами. Ряд операций — NtPulseEvent() и режим wait-for-all в NtWaitForMultipleObjects() — требует прямого управления очередями ожидания на уровне ядра. В пользовательском пространстве воспроизвести такое поведение корректно невозможно.

NTSYNC — драйвер ядра Linux, создающий устройство /dev/ntsync. Через него Wine обращается к ядру напрямую для выполнения операций синхронизации, минуя wineserver и обходные механизмы.

NTSYNC принципиально отличается от предшественников. Вместо адаптации Linux-механизмов под поведение Windows, драйвер напрямую моделирует API синхронизации ядра NT. Синхронизация происходит в ядре с корректной семантикой событий, атомарными операциями и правильным управлением очередями.

Автор NTSYNC — та же Elizabeth Figura, которая создала esync и fsync. Она работала над драйвером несколько лет, прошла семь ревизий патча и представила работу на конференции Linux Plumbers Conference в 2023 году. Драйвер вошёл в основную ветку ядра Linux 6.14.

Бенчмарки, приложенные к патчу, показывают результаты NTSYNC в сравнении с ванильным Wine без esync и fsync: DiRT 3 — со 110 до 860 кадров в секунду (прирост 678%), Resident Evil 2 — с 26 до 77, Call of Juarez — со 99 до 224, Tiny Tina's Wonderlands — со 130 до 360. Call of Duty: Black Ops I, ранее неиграбельная, заработала нормально.

Здесь важна оговорка: эти цифры получены в сравнении с ванильным Wine, в котором нет ни esync, ни fsync. Пользователи Proton и кастомных сборок Wine с fsync уже имеют значительный прирост — для них переход на NTSYNC даст прежде всего корректность работы и совместимость, а не кратный рост частоты кадров. Наибольший эффект заметен на старых играх с высокой многопоточной нагрузкой, где синхронизация была узким местом.

NTSYNC не требует сторонних патчей. Любой дистрибутив с ядром 6.14 и новее поддерживает драйвер — в том числе Fedora 42 и Ubuntu 25.04. Valve добавила NTSYNC в SteamOS 3.7.20, модуль загружается по умолчанию. Неофициальная сборка Proton GE уже включает поддержку NTSYNC. Когда Valve выпустит официальный Proton на базе Wine 11, поддержка NTSYNC станет доступна всем владельцам Steam Deck без дополнительных действий.

Завершение архитектуры WoW64: 32-битные приложения без multilib

На Windows подсистема WoW64 (Windows 32-bit on Windows 64-bit) обеспечивает запуск 32-битных приложений в 64-битной среде. Разработчики Wine реализовали собственный аналог этой подсистемы, и в версии 11.0 работа завершена.

На практике это означает, что для запуска 32-битных Windows-приложений больше не нужно устанавливать 32-битные системные библиотеки. Wine сам определяет разрядность исполняемого файла и выполняет трансляцию. Отдельный бинарный файл wine64 упразднён — остался единый wine, который автоматически выбирает нужный режим.

Multilib — набор 32-битных системных библиотек, установленных параллельно с 64-битными. Их настройка различалась от дистрибутива к дистрибутиву и часто вызывала проблемы совместимости.

Новый режим WoW64 поддерживает маппинг памяти OpenGL, прямой доступ к SCSI и даже 16-битные приложения. Последнее полезно для запуска Windows-программ эпохи 1990-х, которые сама Windows давно перестала поддерживать.

Для игр это изменение существенно: значительная часть старых игр — 32-битные исполняемые файлы. Раньше их запуск часто упирался в настройку multilib, качество которой зависело от дистрибутива. Теперь Wine берёт трансляцию на себя.

Wayland, графика и оборудование

Драйвер Wayland в Wine 11 получил ряд практически важных возможностей. Буфер обмена работает в обоих направлениях — из Wine в нативные Wayland-приложения и обратно. Поддерживается перетаскивание файлов из Wayland-приложений в окна Wine. Реализованы методы ввода и окна произвольной формы. Смена разрешения экрана в старых играх, пытающихся переключиться на 640x480, теперь эмулируется через масштабирование композитором — рабочий стол остаётся в исходном разрешении.

На платформе X11 разработчики переключили OpenGL-рендеринг на бэкенд EGL по умолчанию, заменив устаревший GLX. EGL разделяет часть кода с Wayland-драйвером, что упрощает поддержку обеих платформ. GLX остаётся доступным как запасной вариант.

Поддержка Vulkan обновлена до версии API 1.4.335. Реализованы расширения VK_KHR_external_memory_win32 и связанные API для обмена данными между Wine и нативными Vulkan-драйверами. Vulkan-рендерер в Wine теперь поддерживает ряд функций Direct3D прежних версий — point sprites, vertex blending, альфа-тестирование — сокращая разрыв с более зрелым OpenGL-рендерером.

Добавлено аппаратное декодирование видео H.264 через Direct3D 11 Video API поверх Vulkan Video. Это полезно для игр и приложений, использующих видеовставки и катсцены — декодирование выполняется на видеокарте, снижая нагрузку на процессор.

Интеграция с оконными менеджерами X11 улучшена: запросы на активацию окон теперь используют протокол EWMH, добавлена поддержка эксклюзивного полноэкранного режима. Старые игры на DDraw и Direct3D ведут себя корректнее.

Среди прочих изменений — улучшенная обратная связь (force feedback) для рулей и джойстиков, поддержка Bluetooth со сканированием, сопряжением и RFCOMM-соединениями через BlueZ, улучшенная обработка MIDI SoundFont, поддержка Zip64, TWAIN 2.0 для 64-битных приложений и IPv6 ping. Обновлены таблицы символов до Unicode 17.0.0, данные локализации — до CLDR 48.

Управление приоритетами потоков улучшено на Linux и macOS — это влияет на производительность многопоточных приложений отдельно от NTSYNC. На устройствах с архитектурой ARM64 реализована эмуляция 4K-страниц на системах с большим размером страниц — с ростом числа ARM-устройств на Linux эта возможность становится актуальнее.

Исправления совместимости игр

Разработчики исправили проблемы совместимости в конкретных играх: Nioh 2, StarCraft 2, The Witcher 2, Call of Duty: Black Ops II, Final Fantasy XI. Исправлена работа лаунчера Battle.net. Общие улучшения графики, ввода и сети затрагивают значительно более широкий круг игр.

Влияние на экосистему Linux-гейминга

Wine 11 — фундамент, на котором строятся все основные инструменты запуска Windows-игр в Linux. Valve Proton, Lutris, Bottles и российский проект PortProton используют Wine в качестве базового компонента. Когда Valve обновит Proton до Wine 11, все улучшения — NTSYNC, WoW64, Wayland, графика — станут доступны пользователям Steam Deck и SteamOS без дополнительных настроек.

PortProton — российский проект (linux-gaming.ru) для запуска Windows-игр в Linux без Steam. Использует Wine/Proton и Proton GE в качестве основы, включает предустановленные оптимизации, MANGOHUD и vkBasalt.

© . По материалам xda-developers
Комментарии и отзывы

Нашли ошибку?

Новое на сайте