Freedom Land Blog

Официальный блог MMO сервера tes3mp "Freedom Land".
Дневнеки разработчиков, новости и статьи.

< Назад Обратно на сайт

Сказ о низком FPS в OpenMW

Многие игроки, не только в tes3mp но и в OpenMW жалуются на низкий FPS. Так как tes3mp использует OpenMW в качестве кодовой базы то низкий FPS не столько проблема tes3mp, сколько проблема OpenMW.

WARNING! ACHTUNG! ATENTO! Дальше будет многа букав, я ставил своей целью именно исследование как оно есть и не ставил целью найти решение.

Немного истории

В 2008 году стартовал проект OpenMW (кстати, в 2018 году ему уже 10 лет, horaaaaaaay!), сначала это был проект по просмотру ESM файлов но позже перерос в амбициозный проект по воссозданию движка The Elder Scrolls 3 - Gamebryo. Самые первые версии OpenMW были написаны с помощью: OGRE - рендер, bullet - физика. При этом для Windows и Linux использовались соответсвенно DirectX и OpenGL. С версии 0.37 все изменилось, теперь в качестве рендера используется OpenSceneGraph (далее OSG).

Проблемы с OGRE

Как говорят сами разработчики: переход на OSG был вызван множеством проблем в OGRE. Не буду сильно вдаваться в технические подробности, просто скажу что в OGRE FPS был значительно ниже чем на ванильном движке. Я пробовал версии 0.15 и 0.16 OpenMW на OGRE, тогда у меня было следующее железо: Intel Core 2 Duo E7500@2.95GHz, 3 GB DDR2@1066MHz, GeForce 8800 GTS. Эти версии выдавали у меня от 0 до 5 FPS. Если отключить воду можно было получить до 15 FPS, но отключеный шейдер воды выглядел хуже чем в ваниле (впрочем в OSG так же). Надо отметить что у Koncord при его не слабом железе (i7, GTX 770, 8 GB DDR3) тоже был невысокий FPS на сборках с OGRE. Но зато у одного из разработчиков, который делал видео-анонсы о новых версиях, всегда был высокий FPS на максимальных настройках. Что у него за компьютер остаётся только гадать.

Переход на OSG

После перехода на FPS действительно сильно вырос. Уже на 0.38 можно было спокойно играть. По крайней мере на моём “калькуляторе” (на тот момент уже Intel Core 2 Duo E7500@2.95GHz, 4 GB DDR2@800MHz, GeForce GTX 550 Ti) выдавало от 40 до 60 fps. Справедливости ради скажу что в Скайриме на этом железе, с большим колличеством модов, в том числе и на графику, FPS редко опускается ниже 60.

Вот некоторые цифры от разработчиков OpenMW на тот момент:

OpenMW OpenMW-osg
Средний FPS 49 75
Среднее время загрузки 7s 3.4s
Среднее потребление памяти 344.6mb 277.1mb

Цифры из 2015 года и тестировалось всё это на GeForce GTX 560 Ti/PCIe/SSE2, AMD Phenom™ II X4 955 Processor × 4, Linux 3.13.0-24-generic x86_64 в 1680×1050, полный экран без эффектов, 16х AF.

Так почему же низкий FPS?

Полазив по форуму OpenMW и почитав багрепорты и issue на гитхабе я пришёл к выводу, что разработчики OpenMW НЕ намеряны ничего с этим делать. Несмотря на то, что было как минимум 3 багрепорта по поводу низкого FPS их все закрыли, потому что никто не хотел заниматься оптимизацией. Один из разработчиков предложил разделить потоки вычисления физики но его голос так и не был услышан.

Хотя ко мне и приходили репорты о низком FPS в tes3mp, я ничего с этим не мог сделать. Однако, когда недавно я перепроходил (с модами, конечно), Morrowind я тоже сделал небольшое исследование FPS для себя. Я выяснил что OpenMW 0.37 и 0.38 подвержены проблеме меньше всего. А ещё что видеокарты от Nvidia отстой и их следует обходить стороной за киллометр.

Сейчас у меня следующее железо: Core 2 Quad Q6600@2.95GHz, 4 GB DDR2@800MHz, GeForce GTX 550 Ti и я имею все те же проблемы с FPS что имел и на более слабом процессоре. Камешек в огород разработчиков OpenMW - в любой игре от id Tech (да, да и DOOM 2016 тоже) я имею приемлимый FPS. По крайней мере он выше 30.

К сожалению точных цифр я тогда не записывал и как видно зря, но я точно помню что на каких то драйверах Nvidia (достаточно старых) в OpenMW у меня был явно больший FPS. То есть можно сделать вывод что Nvidia просто что-то сломала связанное с OGL в драйверах. Но это ещё не всё! На стадии тестирования когда ещё не было синхронизации AI, и он был просто отключен на уровне движка, у меня зашкаливал FPS на улице.

Дабы не быть голословным проведу эксперимент "в живую":

OpenMW 0.43
Процессор Intel Core 2 Quad Q6600@2.95GHz
Видеокарта GeForce GTX 550 Ti
Драйвера на видеокарту 390.67
Разрешение 1280x1024
Память DDR2@800MHz
ОС GNU/Linux Devuan ascii Kernel 4.14.0 (x64)
Xorg 7.7

Некоторые детали теста: графика на высоких, кроме воды, она отключена. И ещё некоторые параметры, которые я вставил в скрипт openmw, не уверен что это помогает, впрочем.

export __GL_THREADED_OPTIMIZATIONS=1
export __GL_ALLOW_UNOFFICIAL_PROTOCOL=0
export OPENMW_PHYSICS_FPS=30 # устарело для tes3mp 0.7
export OPENMW_OPTIMIZE="MERGE_GEOMETRY"
export OPENMW_DONT_PRECOMPILE=1
export OPENMW_DECOMPRESS_TEXTURES=1
export __GL_NextGenCompiler=0 # если отключить Vulkan перестанет работать, но помогает для некоторых OpenGL игр

Кроме всего прочего я не пользуюсь DE, только Openbox и Tint2.

Все моды были отключены, всё лишнее в системе отключено. Начал с начала, с коробля. Там FPS, как и ожидалось, зашкаливает. Вообще практически в любом интерьере от 100 до 150 FPS. А вот потом я вышел на улицу…

test0

А вот тут Балмора во время дождя:

test1

Дождь кончился, но ничего не изменилось. Развернулся в другую строну и…

test2

Нагруженая сцена? Не думаю.

Кстати, после перемещения в 3 локации OpenMW потребляет уже 767мб, хотя на старте и правда было всего 250мб. И нагружает целых 1.5 ядра! [сарказм] (из 4 доступных)

test3

test4

И тут меня осенило. Ограничил колличество ядер, доступных игре до 2.

taskset -p 0x00000003 $(pidof openmw.x86_64)

Нет, FPS больше не стало. Я бы вообще сказал что изменилось ровным счётом ничего. Но когда я запустил игру второй раз уже без указания кол-ва ядер я понял что было не так. Когда используются все 4 ядра игра становится менее плавной. Плавнее не считая чтения с диска -- тут всё осталось так же.

Потом я вспомнил что на сервере, когда охранник застрял в камнях было резкое падение FPS. Решил провести точно такой же эксперимент.

test5

Но честно говоря результат меня не впечатлил. И помните, выше я писал про отключение AI? Так вот - в новых версиях оно ничего не даёт. Если ещё немного почитать новости на сайте openmw.org то можно найти много интересного про OSG. Оказывается что из-за того что при анимации коллизии для персонажа пересчитываются, возникает (по словам разработчиков) небольшое падение FPS. Впрочем в OGRE этой фитчи вообще не было.

Решил протестировать тоже самое на сервере, результат ниже:

test6

test7

Различия с оригиналом не такие уж существенные (не знаю почему в Сейда-Нин так проседает Оо) НО! Нельзя забывать что другие игроки считают физику у ВАС на клиенте. То есть просадки в том числе, могут быть и из-за множества игроков и пока что с этим ничего нельзя сделать.

20 лет Год спустя

Что изменилось за 2018 и начало 2019 года? Ну, я немного обновил железо и сменил дистрибутив Linux с Devuan, который имел заметно устаревшие пакеты на Artix. В OpenMW исправили многие просадки FPS. Впрочем расчитывать на 60 FPS в tes3mp всё-равно не придётся, если сцена будет сильно нагружена NPC, то ничего не поможет. Даже на крутых машинах FPS переодически проваливается в бездну. Впрочем игра стала заметно плавнее, не знаю что явилось этому причиной.

OSG on steroids.

OSG on steroids это форк OSG от комманды OpenMW, несколько лет назад он сильно помогал увеличить FPS, но на данный момент устарел и, судя по всему, некоторые исправления вошли в апстрим. Недавно пытаясь собрать с его, я столкнулся с тем что половина текстур перестала рендерится, к тому же FPS возрос не так уж сильно, а местами даже просел. Поэтому его использование на данный момент сомнительно.

Выводы и что же делать.

Однозначного ответа я давать не буду, но я точно помню что на старых версиях OpenMW, на старых драйверах Nvidia у меня было куда больше FPS чем мы имеем сейчас. Не знаю что тому виной, у меня есть несколько предположений, но все они не выдерживают критики. Например: недавние уязвимости в процессорах и последующие патчи, которые угробили производительность всех процессоров короме самых новых i7 и i9 (на деле это был обычный маркетинг); Nvidia выпустила свою новую имплементацию OpenGL в который встроила часть из своей имплементации Vulkan, но судя по всему он не затрагивает старые видеокарты до ПЕЧ 660. И наконец - всё-таки все реализации упраления очередью (I\O, процессора), пардон, мурде. Это можно легко проверить установив любое Liquorix\Zen или другое ядро с BFQ и понаблюдав за производительностью. Однако у них же есть фатальный недостаток - производительность одного приложения и правда увеличивается, но остальные начинают "захлёбываться". Думаю золотой середины мы так и не найдём. Недавно прочитал что для всех OpenGL и Vulkan игр рекомендуется всегда ставить IO на Performance. Для линукса это делается через стандартную систему /proc для Windows через диспетчер задач.

По поводу того, что же делать я скажу так: пока что использовать те переменные окружения и всё-таки ограничить ядра игре. И ждать, недеяться и упавать на разработчиков OpenMW.

P.S. Если я в чём то не прав - поправьте меня. Возможно здесь найдуться знающие люди.


– © Volk_Milit (aka Ja'Virr-Dar) 2018-2019, CC-BY-ND.