Проблемы и оптимизация

Логи вылетов клиента Killing Floor: разбор реальных критических ошибок

Отчёты о вылетах Steam и NonSteam версий с кастомного сервера, 2019-2024

На этой странице разобраны настоящие отчёты о вылетах Killing Floor 1, которые игроки кастомного сервера присылали с 2019 по 2024 год, из Steam и NonSteam сборок. Все отчёты укладываются в пять типов. Для каждого: что написано в логе, вероятная причина и что попробовать.

Как читать окно ошибки

Критическая ошибка Killing Floor выглядит так:

Build UT2004_Build_[2004-11-11_10.48]

OS: Windows NT 6.2 (Build: 9200)
CPU: GenuineIntel PentiumPro-class processor @ 1993 MHz with 4095MB RAM
Video: NVIDIA GeForce MX130 (8816)

CreateTexture failed(8007000E).

Журнал: FD3D9Texture::Cache <- FD3D9RenderInterface::CacheTexture <- ...
        <- USkeletalMeshInstance::Render <- ... <- Level KF-BellTolls <- UpdateWorld <- MainLoop
  • Build UT2004_Build_[2004-11-11_10.48] одинаковая у всех установок KF1. Игра работает на ветке движка UT2004 от Tripwire и сохранила его строку сборки.
  • Windows NT 6.2 (Build: 9200) так Windows 8, 10 и 11 представляются старым программам. Это не значит, что у игрока Windows 8.
  • PentiumPro-class processor и 4095MB RAM выдаёт код определения железа образца 2004 года. Современный процессор и больше ~4 ГБ ОЗУ игра показать не может, на эти строки не смотрите.
  • Строка ошибки (CreateTexture failed, General protection fault!, Виртуальная память исчерпана) называет тип сбоя.
  • Журнал (History в английской версии) — это стек вызовов, который читается слева направо, от самого глубокого вызова. Левый край — место, где игра упала. Правее обычно видно имя карты (Level ...), а иногда и объект, который загружался или рисовался (текстура, звук, актор). Хвост FMallocWindows::Free <- ... FArray::Realloc повторяется во всех отчётах: это история самого аллокатора, его можно не читать.

1. CreateTexture failed(8007000E)

CreateTexture failed(8007000E).
Журнал: FD3D9Texture::Cache <- FD3D9RenderInterface::CacheTexture
  <- FD3D9RenderInterface::HandleCombinedMaterial <- ... <- USkeletalMeshInstance::Render
  <- (FlameThrower KF-BellTolls-TN1.FlameThrower @ Function KFmod.KFWeapon.RenderOverlays)
  <- (SRHUDKillingFloor ... Engine.HUD.PostRenderActors) <- ... <- Level KF-BellTolls

Что это: 0x8007000E — это E_OUTOFMEMORY. Direct3D не смог создать текстуру при отрисовке скелетного меша: здесь огнемёта от первого лица, в другом отчёте моба на KF-Fortress. HandleCombinedMaterial означает, что текстура входила в Combiner, Shader или другой составной материал, а это типично для скинов оружия и персонажей.

Вероятная причина: нехватка памяти. Либо 32-битный процесс подошёл к пределу адресного пространства, либо закончилась видеопамять. Отчёты пришли с ноутбука с GeForce MX130 и 4 ГБ ОЗУ на кастомных картах.

Что попробовать:

  1. Применить low-memory профиль клиента: снизить детализацию текстур, выключить precache.
  2. Включить Large Address Aware для KillingFloor.exe.
  3. Перезапускать игру каждые несколько карт: за сессию память фрагментируется.
  4. Владельцам серверов: держать скины и текстуры оружия в сжатых (DXT) форматах и грузить ресурсы кастомного оружия по требованию.

2. Виртуальная память исчерпана

Виртуальная память исчерпана. Чтобы устранить неполадку, освободите место на основном жестком диске.
Журнал: FMallocWindows::Malloc <- FMallocWindows::Realloc <- 00000000 643 FArray <- ...
  <- UStaticMeshInstance::Serialize <- LoadObject
  <- (StaticMeshInstance KF-Arcade-Horzine-Mall.StaticMeshInstance6158 ...) <- ULinkerLoad::Preload
  <- ... <- UGameEngine::LoadMap <- AttemptLoadPending
Журнал: FMallocWindows::Malloc <- ... 4194304 FArray <- ... <- TLazyArray::Load
  <- FStaticTexture::GetTextureData <- KF_IJC_Halloween_Weapons.Cheetah.cheetah_d
  <- FD3D9Texture::Cache <- ... <- Level Arena Gurubashi

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

Что видно в стеке: число перед FArray — размер неудавшегося выделения. В первом случае игра упала при загрузке карты (LoadMap, ULinkerLoad::Preload) на static mesh тяжёлой кастомной карты. В двух других — при подгрузке данных текстуры: cheetah_d из KF_IJC_Halloween_Weapons просила 4 194 304 байта (несжатая текстура 1024×1024 RGBA), кастомный скин Jason просил 1 МБ. Игра была так близко к пределу, что не нашлось даже 1 МБ.

Что попробовать:

  1. Large Address Aware здесь помогает сильнее всего: в 64-битной Windows предел поднимается с 2 до 4 ГБ.
  2. Перезапускать клиент после долгих сессий и перед тяжёлыми картами.
  3. Владельцам серверов: вылет внутри LoadMap указывает на карту. Проверьте её размер, сколько пакетов она тянет и можно ли её облегчить или убрать из ротации. Вылет в GetTextureData указывает на названный пакет: пережать текстуры или убрать его из трейдера.

3. D3DERR_OUTOFVIDEOMEMORY

CreateVertexBuffer failed(D3DERR_OUTOFVIDEOMEMORY).
Журнал: FD3D9VertexStream::Cache <- FD3D9RenderInterface::SetVertexStreams
  <- USkeletalMeshInstance::Render <- ... <- Level Police Station
IDirect3DVertexBuffer9::Lock failed(D3DERR_OUTOFVIDEOMEMORY).
Журнал: FD3D9VertexStream::Cache <- FD3D9RenderInterface::SetVertexStreams
  <- ATerrainInfo::Render <- RenderLevel <- KF-AntarcticOutpost.myLevel <- ...

Что это: Direct3D 9 не смог создать или заблокировать вершинный буфер для скелетного меша или ландшафта (ATerrainInfo::Render). Один отчёт пришёл с ноутбучной RTX 3050 Ti, так что дело не только в слабой видеокарте. Direct3D 9 держит копии managed-ресурсов в памяти самой игры, поэтому 32-битный процесс у своего предела может получить «нехватку видеопамяти» даже при свободной VRAM.

Что попробовать:

  1. Снизить детализацию текстур, мира и разрешение: сильнее всего страдают открытые карты с ландшафтом.
  2. Large Address Aware и перезапуск клиента, как выше.
  3. На ноутбуках с двумя видеокартами убедиться, что игра запущена на дискретной (панель NVIDIA или настройки графики Windows).
  4. Владельцам серверов: если большая часть таких отчётов приходит с одной карты, проверьте её на слабом ПК или замените.

4. General protection fault в FWaveModInfo::ReadWaveInfo

General protection fault!
History: FWaveModInfo::ReadWaveInfo <- callingGetPerioid <- 1 <- FSoundData::Load
  <- TLazyArray<< <- USound::Serialize <- LoadObject
  <- (Sound KF_BaseScrake_Xmas.Chainsaw.Scrake_Chainsaw_Swipe1 ...) <- ULinkerLoad::Preload
  <- ... <- UPackageMap::PairToObject <- ... <- UActorChannel::ReceivedBunch
  <- ... <- UTcpNetDriver::TickDispatch <- ... (NetMode=3) <- Level Police Station

Что это: клиент упал при разборе WAV-звука (ReadWaveInfo). Звук загружался потому, что сервер реплицировал актор, который его использует (UActorChannel::ReceivedBunch, PairToObject). Во всех отчётах этого типа фигурирует звук из пакетов рождественских мобов: KF_BaseScrake_Xmas (холостой ход, взмах и удар бензопилы) и KF_BaseStalker_Xmas. Вылеты были на разных картах, в Steam и NonSteam сборках.

Вероятные причины, от более вероятной к менее:

  • у клиента повреждённая или другой версии копия пакета .uax (частая история с NonSteam сборками, собранными из разных источников);
  • из-за нехватки памяти загрузка оборвалась на середине, и парсер прочитал мусор.

Что попробовать:

  1. Steam: проверить целостность файлов. NonSteam: заменить Sounds/KF_BaseScrake_Xmas.uax и KF_BaseStalker_Xmas.uax копиями из чистой установки той же версии.
  2. Очистить папку Cache, чтобы клиент заново скачал пакеты сервера.
  3. Владельцам серверов: если сезонные мобы включены принудительно вне ивента, подумайте, чтобы их выключить. Игроки со старыми или битыми сборками будут падать при первом же появлении такого моба.

5. General protection fault при отрисовке или тике

General protection fault!
History: FD3D9RenderInterface::SetMaterial <- USkeletalMeshInstance::Render <- FDynamicActor::Render
  <- RenderLevel <- KF-MeowNight-CUZUS.myLevel <- ... <- Level Meow Night
General protection fault!
History: ULevel::BuildRenderData <- UGameEngine::Draw <- ... <- Level Police Station
General protection fault!
History: UInteractionMaster::MasterProcessTick <- ULevel::Tick <- (NetMode=3) <- TickLevel
  <- UGameEngine::Tick <- Level HelmsDeep

GPF — это обращение к недопустимой памяти. Первая функция в стеке подсказывает, какая подсистема споткнулась:

Первая функцияНа что указываетЧто попробовать
FD3D9RenderInterface::SetMaterial под USkeletalMeshInstance::RenderМеш персонажа, моба или оружия с битым или недогруженным материалом: кастомный скин, текстура которого не загрузилась, или Combiner без входаВыяснить, какие кастомные скины и мобы есть на карте. Повторить с отключёнными. Сверить версии .utx. Недогруженный материал бывает и от нехватки памяти (см. п. 1-2)
ULevel::BuildRenderData сразу после загрузки картыКлиент не смог построить данные рендера уровня, часто под нехваткой памяти после смены на тяжёлую картуПерезапустить клиент и переподключиться. Если повторяется на той же карте, проблема в карте
UInteractionMaster::MasterProcessTickInteraction (кастомный HUD, меню или обработчик клавиш из мутатора) тикает после того, как используемый им объект уничтожен, обычно около смены картыАвторам мутаторов: снимать interaction в NotifyLevelChange() через Master.RemoveInteraction(self) и проверять каждую ссылку на актор на none перед использованием

Быстрая сортировка

  1. Смотрите на строку ошибки: CreateTexture/OUTOFVIDEOMEMORY/«Виртуальная память исчерпана» означают проблемы с памятью. Для GPF нужен стек.
  2. Смотрите на левый край журнала: рендер (FD3D9...), загрузка (LoadObject, LoadMap), сеть (ReceivedBunch) или скрипт (ProcessEvent, MasterProcessTick).
  3. Найдите объект в скобках: пакет до первой точки — это файл, который надо проверить (KF_BaseScrake_Xmas → Sounds/KF_BaseScrake_Xmas.uax).
  4. Запишите карту. Если большинство отчётов с одной карты, подозревать нужно её, а не ПК.
  5. Соберите несколько отчётов, прежде чем что-то менять. Один вылет — шум, пять с одинаковым стеком — закономерность.

Вопросы и ответы

Что значит CreateTexture failed(8007000E) в Killing Floor?
0x8007000E — это системная ошибка Windows E_OUTOFMEMORY. Direct3D не смог выделить память под текстуру: обычно 32-битной игре не хватило адресного пространства или видеокарте не хватило памяти на тяжёлой карте или скине.
Почему в окне ошибки написано UT2004_Build и Windows NT 6.2?
Killing Floor работает на версии движка UT2004 от Tripwire и сохранил его строку сборки. Windows 8, 10 и 11 представляются старым программам без манифеста совместимости как NT 6.2 build 9200.