← На основной сайт
Фризы и зависания в The Crew: Motorfest — разбор FSI TechLabs
Цифровая экспертиза - #8745-TL-1

Подвисания в The Crew: Motorfest

В процессе игры происходят подвисания длительностью от 0,5 до 5 секунд. Причин оказалось две — со стороны диска и со стороны сети.

Оборудование, на котором проводился разбор

Физические характеристики

Материнская платаASRock B660M Steel Legend
ПроцессорIntel Core i5-12400
Оперативная память40 ГБ: 2× A-Data AX4U32008G16A-DTBKD3 (DIMM 2/4), Kingston HX421C14FB2/8 (DIMM 1), Apacer GD2.1843BS.00L (DIMM 3)
ВидеокартаNVIDIA GeForce GTX 1660 SUPER (ASUS ROG-STRIX-GTX1660S-O6G-GAMING)
НакопителиNVMe Samsung MZVLB256HBHQ-000L2; Toshiba DT01ACA050; Toshiba MQ01ABF050; WDC WD10EZEX-08WN4A0; WDC WDS480G2G0A-00JH30
Блок питанияCougar VTE600

Программные характеристики

Ядра / потоки — частота6 / 12 — 2496 МГц
Память — тайминги3200 МТ/с — 22-22-22-53 CR1
СистемаWindows 11 25H2, сборка 26200.8246 (Eagle)

Где стояла игра

  • Диск D: — WDC WDS480G2G0A-00JH30
  • Здоровье по SMART: хорошее (74%)
  • Путь установки не содержит кириллицы
  • Проверка целостности файлов игры выполнена

Чем измеряли

  • Windows Performance Recorder — профили CPU Activity и GPU Activity
  • Windows Performance Analyzer — разбор полученной трассировки

Ход профилирования

Пиковая активность диска в момент зависания The Crew: Motorfest

Трассировка в Windows Performance Analyzer — видна пиковая активность диска.

Причина первая: чтение с безбуферного диска

В процессе анализа проблемы была найдена пиковая активность по диску. Среди процессов, активных на момент пика, обнаружен BEService.exe — в его ветке находился процесс чтения d2d1.dll. Попытки чтения были произведены за 10 секунд до зависания и 4 раза в начале пика.

Процесс чтения занял в общей сумме 173 748 700 микросекунд, создав 973 обращения на операцию чтения.

Процесс BEService.exe в момент пиковой нагрузки на диск

Процессы, активные в момент пика нагрузки.

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

Причина вторая: блокирующий DNS-запрос

Главный поток игры 11,15 секунды висел на блокирующем DNS-запросе.

Точные тайминги: поток TheCrewMotorfest.exe TID 25616 — тот самый, что владеет окном, — ушёл в ожидание в t=6.207 с с причиной WrLpcReply и был разбужен в t=17.355 с. Это 11 147 275 мкс непрерывного ожидания.

Стек в момент блокировки (изнутри наружу):

ntoskrnl (ALPC wait) ← ntdll ← rpcrt4 ← dnsapi ← mswsock ← ws2_32 ← TheCrewMotorfest.exe

Это getaddrinfo() — разрешение доменного имени, вызванное синхронно из главного потока. Через RPC запрос ушёл в службу Dnscache (svchost.exe PID 3056 — система с момента записи не перезагружалась, это точно она), и ответа не было 11 секунд.

Почему встала вся игра

За 100 микросекунд до главного потока в ожидание ушли ещё четыре рабочих потока джоб-системы (11568, 30200, 26324, 3128) с причиной UserRequest — они ждали задач от главного. Рендер-поток 30092 добавился следом. Все шесть показали ровно 0 мкс CPU на протяжении всего окна.

Пробуждение в t=17.355 с зафиксировано: svchost.exe (3056) tid=23600 разбудил поток 25616, тот через 1,1 мс поднял всех воркеров, и игра сразу вернулась к полной скорости: 2780 → 169 → 3270 мс CPU на секунду.

Перед решением: проверьте состояние диска

Прежде чем что-то менять, нужно выяснить техническое состояние диска, на котором установлена игра. Скачайте CrystalDiskInfo и сверьте показатели ниже. Если по ним есть отклонения — настройками проблема не лечится, диск под замену.

АтрибутЧто означаетКогда менять диск
05Переназначенные блоки Больше 00000000000C (например 0D)
C5Проблемные блоки, ждут переназначения Больше 000000000150
A9То же, у части моделей вместо C5 Больше 000000000150
C7Ошибки шины UDMA От 000000000001 — проблема с подключением или шиной на плате
Если отклонений нет Диск исправен, переходите к решению ниже.

Решение первой причины: диск

1. Свободное место и обслуживание диска

  • Для диска без буфера настоятельно рекомендуется держать занятым не более 85% объёма.
  • Выполните defrag <буква диска>: /L /U /V. Повторяйте после удаления 10% и более данных.

2. Отключить индексацию на диске с игрой

Проводник → правой кнопкой по диску → «Свойства» → снять галочку «Разрешить индексировать содержимое файлов на этом диске в дополнение к свойствам файла» → выбрать «Применить ко вложенным папкам».

3. Перенести файл подкачки

Назначьте файл подкачки на более быстрый диск или хотя бы на тот, где не лежит игра.

Win + Rsysdm.cpl → «Дополнительно» → «Быстродействие» → «Дополнительно» → «Изменить» → снять галочку автоматического выбора объёма.

4. Включить управление питанием канала AHCI

Создайте на рабочем столе текстовый файл и вставьте в него:

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Power\PowerSettings\0012ee47-9041-4b5d-9b77-535fba8b1442\0b2d69d7-a2a1-449c-9680-f91c70521c60]
"Attributes"=dword:00000002

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Power\PowerSettings\0012ee47-9041-4b5d-9b77-535fba8b1442\dab60367-53fe-4fbc-825e-521d069d2456]
"Attributes"=dword:00000002

«Файл» → «Сохранить как…» → <любое название>.reg → открыть и применить изменения.

Затем: Win + Rpowercfg.cpl → «Настройка схемы электропитания» → «Изменить дополнительные параметры питания» → «Жёсткий диск»:

  • AHCI Link Power Management — HIPM/DIPM → выбрать HIPM+DIPM
  • «Отключать жёсткий диск через» → значение 0 → «Применить»

5. Проверить TRIM

В PowerShell от имени администратора выполните:

Get-PhysicalDisk | Select FriendlyName, MediaType, HealthStatus
Get-Volume | Select DriveLetter, FileSystemLabel, SizeRemaining, Size
fsutil behavior query DisableDeleteNotify

Если DisableDeleteNotify = 1, включите TRIM:

fsutil behavior set DisableDeleteNotify 0
После всех пунктов перезагрузите компьютер Часть настроек — питание канала и TRIM — применяется только после перезапуска.

Решение второй причины: DNS

Игра обращается к своим серверам из главного потока, поэтому любая задержка ответа DNS останавливает процесс игры.

Сначала учтите, как вы заходите в игру Если игра недоступна в вашем регионе и вы пользуетесь VPN или Zapret, менять DNS вслепую нельзя: неподходящий сервер может отдать адрес, до которого нет доступа, и игра перестанет подключаться вовсе.

1. Посмотреть, какие DNS используются сейчас

PowerShell от имени администратора:

Get-DnsClientServerAddress -AddressFamily IPv4 | Where-Object ServerAddresses | Select InterfaceAlias, ServerAddresses

2. Замерить, кто отвечает быстрее

Этот скрипт опрашивает несколько известных серверов и показывает время ответа в миллисекундах — меньше значит лучше:

$servers = "77.88.8.8","1.1.1.1","8.8.8.8","9.9.9.9","208.67.222.222"
$host_to_test = "ubisoft.com"

$servers | ForEach-Object {
    $s = $_
    $t = (Measure-Command {
        try { Resolve-DnsName $host_to_test -Server $s -DnsOnly -ErrorAction Stop | Out-Null }
        catch { }
    }).TotalMilliseconds
    [pscustomobject]@{ Сервер = $s; Ответ_мс = [math]::Round($t) }
} | Sort-Object Ответ_мс | Format-Table -AutoSize

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

3. Либо подобрать автоматически - DNSJump

Если возиться с командами не хочется, есть DNSJump - маленькая бесплатная утилита, которая сама опрашивает список публичных DNS, замеряет отклик каждого и показывает результат таблицей. Дальше достаточно выбрать самый быстрый и применить его кнопкой - программа пропишет адреса в настройки адаптера за вас.

Порядок работы простой: запустить от имени администратора, нажать проверку скорости, дождаться окончания теста, выбрать верхнюю строку и применить.

Проверяйте на том подключении, через которое играете Замер под VPN и без него даст разные результаты. Если играете с туннелем - включите его и только потом меряйте.

4. Применить выбранный сервер вручную

Замените Ethernet на имя своего адаптера из первого шага, а адреса — на выбранные при замере. Второй адрес нужен как запасной: если первый не ответит, система сразу спросит его.

Set-DnsClientServerAddress -InterfaceAlias "Ethernet" -ServerAddresses ("77.88.8.8","1.1.1.1")

Вернуть как было — получить адреса от роутера автоматически:

Set-DnsClientServerAddress -InterfaceAlias "Ethernet" -ResetServerAddresses

5. Очистить кеш и перезапустить службу

ipconfig /flushdns
Restart-Service Dnscache -Force

6. Убедиться, что игра открывается

Запустите игру и проверьте вход. Если после смены DNS подключение перестало проходить — значит новый сервер отдаёт адреса, недоступные из вашей сети. Верните прежние настройки командой из четвёртого шага и возьмите следующий по скорости сервер из таблицы.

Что должно измениться Длинные зависания на 5–11 секунд уходят: имя разрешается быстро, и главный поток больше не ждёт ответа. Короткие подтормаживания могут остаться — за них отвечает первая причина, диск.
Все решения проблем