Про производительность игр под Linux написано очень много. Но, во-первых, Linux быстро развивается (то есть что-то уже банально устарело), а во-вторых, многое, что написано на эту тему — написано на игровых и линуксовых форумах ярыми линуксоидами, у которых, конечно «все летает лучше чем в виндах». Поймите меня правильно, не то, чтобы я не верю 😉 Но лично я сам не видел, чтобы что-то работало быстрее… Главное — я понял, что не смогу сложить у себя в голове целостную картину, пока не попробую сам. Вопрос для меня не праздный — я использую Linux на ноутбуке, причем уже «не молодом», так что, как говорится, каждый FPS на счету.
А еще вопрос стоит гораздо шире, нежели банальное сравнение Linux — Windows:
- в Linux можно запускать нативные игры или игры в Wine;
- Wine бывает разных версий — как сильно это влияет на производительность?
- добавим сюда гибридную графику — ее можно задействовать с помощью Nvidia Prime или Bumblebee;
- c Bumblebee мы можем использовать VirtualGL или Primus.
В общем, есть из чего выбирать. Вот я и занялся тестами. Исходные данные:
Ноутбук Acer V3-772G:
Процессор: Core i7 4702MQ
Видеокарта: Intel HD 4600 \ NVIDIA GeForce GTX 760M, Nvidia Optimus.
Остальное, говоря серьезно, несущественно — здесь главное то, что сравнение будет проводится на одном и том же железе.
В качестве «осей» выступят:
Windows 10, драйвер Nvidia 388.31;
Ubuntu 16.04.3, драйвер Nvidia 384.90.
Тестирование в Wine проводилось на двух версиях — 2.0.3, которая на момент написания статьи считалась стабильной и Wine Staging 2.20. Для последней отдельно измерялись результаты с включенным и выключенным CSMT.
Обе системы перед тестами устанавливались «начисто». Ну а для тестирования я использовал бенчмарк от Unigine — Valley 2013. Именно его я выбрал, так как по «году рождения» он гармонирует с ноутбуком — модель 2012 года. Кроме того, бенчмарк работает в Windows, нативно в Linux, а так же под Wine.
Другие бенчмарки я задействовать не стал. В конце концов, мне не нужен точный до единиц результат, интересует общая картина. Даже и при таком раскладе на установку систем и тесты ушел целый день.
Производительность измерялась в OpenGL и DirectX 9. DirectX 11 я трогать не стал, так как не смотря на усилия разработчиков Wine, он еще мало где нормально работает. Не ходя далеко — выбранном бенчмарке он работал некорректно.
Бенчмарк всегда запускался c одними и теми же настройками, которые можно увидеть на скриншоте ниже (менялся только API):
Теперь про гибридную графику — Nvidia Optimus. В Windows все просто — все необходимое устанавливается вместе с драйвером видеокарты, запуск определенных приложений на высокопроизводительной карточке происходит автоматически. Проблемы и сбои в этом механизме бывают, но не часто.
В Linux, как водится, вариантов больше. Судя по форумам, самое популярное решение, чтобы заставить Nvidia Optimus работать в свободной ОС называется Nvidia Prime. Сам долго пользовался именно им. В отличие от «уютной винды», Nvidia Prime позволяет запускать в Linux весь сеанс с той или иной карточкой — то есть используем Intel, если стала нужна карточка Nvidia — ткнули нужную галочку \ ввели команду в терминале, перезагрузились или перелогинились, и весь сеанс работает на Nvidia. Чтобы перейти назад на Intel надо повторить операцию. Многие пишут, что в этом нет никаких неудобств, но это верно лишь отчасти. Точнее для тех, у кого работа и развлечения жестко разделены по времени. Если же вы захотели запустить что-нибудь ненадолго среди рабочего дня… То Nvidia Prime уже далеко не так удобен. Потому что — будьте любезны закрыть все свои рабочие дела и перелогиниться \ перезагрузиться. А потом назад. Ну или сидите целый день используя карточку Nvidia — что мне тоже не очень по душе, учитывая возможность использовать более экономичную видеокарту.
В минусы Nvidia Prime стоит записать и то, что он есть не для всех дистрибутивов. В плюсы — простоту настройки (собственно, она не требуется, в Ubuntu достаточно установить проприетарный драйвер, пакет nvidia-prime, и, для управления всем этим счастьем — пакет nvidia-settings). Какие есть альтернативы?
Альтернатива — Bumblebee (а для многих дистрибутивов — вообще единственный вариант задействовать гибридную графику). «Шмель» позволяет запускать приложения используя специальную команду, что заставляет их выполняться на мощной видеокарте. Перезагружаться не нужно. На мой вкус — самое оно, не хуже, чем в Windows. Платой за всю эту красоту называют производительность. Действительно, изначально для вывода изображения с мощной видеокарты использовали VirtualGL, что достаточно негативно влияло на производительность. Затем появилось еще одно решение — Primus, более быстрое. Хотя про «шмеля» до сих пор можно увидеть жалобы на то, что он медленный. Например, потому, что во многих «гайдах по настройке» упорно советуют использовать VirtualGL. Забегая вперед скажу, что при использовании Primus производительность, как раз, очень хорошая.
Но есть у Bumblebee и минус — его надо настраивать, и да, придется лезть в конфигурационные файлы, хоть и совсем немного. У начинающих линуксоидов это может вызвать некоторые проблемы.
Однако, довольно лирики. Предлагаю сравнить все три варианта — Nvidia Prime и Bumblebee в связке с VirtualGL (приложения при этом запускаются с командой optirun) и Primus (команда primusrun). В конечном итоге, сравним лучшие результаты с Windows — для контраста. Поехали.
Тесты
Windows 10
Возьмем за эталон Windows. Результаты прогонов бенчмарка:
OpenGL — 889;
DirectX 9 — 817.
Посмотрели, запомнили, переходим к Linux.
Ubuntu 16.04.3
OpenGL: Nvidia Prime, VirtualGL, Primus
- Nvidia-Prime — 846;
- VirtualGL — 667;
- Primus — 882.
Ого! Мало того, что VirtualGL в явных аутсайдерах, но и Primus демонстрирует производительность близкую к Windows. Не придираясь к единицам, можно даже сказать «одинаковую». Придираясь — отстает всего на 0,8%.
Схожая ситуация наблюдается и при использовании Wine:
Nvidia Prime:
Wine 2.0.3 — 845;
Wine Staging 2.20 — 831.
VirtualGL:
Wine 2.0.3 — 613;
Wine Staging 2.20 — 612.
Primus:
Wine 2.0.3 — 881;
Wine Staging 2.20 — 881.
Опять связка Bumblebee и Primus «впереди планеты всей». В свою очередь, VirtualGL, выводящий изображение «через альпы» (если интересно — загуглите), прилично просаживает производительность даже несмотря на то, что это OpenGL, а значит, программа запущенная в Wine взаимодействует с ним напрямую.
DirectX 9: Wine + Nvidia Prime, VirtualGL, Primus
Nvidia Prime:
Wine 2.0.3 — 473;
Wine Staging 2.20 — 542;
Wine Staging 2.20 CSMT — 576.
VirtualGL:
Wine 2.0.3 — 489;
Wine Staging 2.20 — 537;
Wine Staging 2.20 CSMT — 564.
Primus:
Wine 2.0.3 — 492;
Wine Staging 2.20 — 570;
Wine Staging 2.20 CSMT — 603.
Результаты очевидны. Уточню, что результат в 603 «попугая» у сочетания Bumblebee + Primus + Wine Staging 2.20 CSMT — лучший результат для Wine, который удалось получить.
И да, выгода от использования Wine Staging и включения CSMT — очень ощутимая. Если используете Wine для игр — обязательно стоит установить именно эту версию. Про версии Wine у меня есть отдельная статья.
Но насколько мы теряем по сравнению с Windows? Даже в лучшем варианте — около 25%. Очень много. Остается лишь надеяться на дальнейшее развитие и без того быстро развивающегося Wine. Я не замерял производительность для какого-нибудь Wine 1.6, но по своим прошлым ощущениям при использовании, могу предположить, что речь запросто может идти о потере 50% и более.
Подводим итоги
Итак, игры, которые используют OpenGL, по результатам тестов, должны работать в Linux не хуже, чем в Windows, ну или хуже совсем чуть-чуть. Этот результат радует, потому что около года назад пронеслась волна ропота, что-де даже нативные игры работают медленнее, чем в Windows (видим, что нет). Причем, благодаря усилиям программистов Wine, даже запущенные через него игры должны сохранять этот уровень производительности. Кстати, если озадачиться, взять какой-нибудь Gentoo, все оптимизировать… Может быть удастся и превзойти «винду», не исключаю!
Слухи же о медленно работающих нативных играх, я думаю, пошли от того, что далеко на каждая такая игра использует OpenGL, многие представляют из себя виндовый вариант, как говорят, «обернутый» в Wine. А как работает Wine мы уже видели.
Будем надеяться, что разработчики будут чаще выбирать этот API (ну или Vulkan, ситуация с которым, по идее, как минимум не хуже). Особенно учитывая тот факт, что с DirectX 9, к сожалению, все не так гладко. Да, Wine совершенствуется, но…
Даже в фигурирующем на графике варианте Bumblebbe + Primus + Wine Staging 2.20 CSMT, отставание от Windows составляет 26,2%, то есть, больше, чем на четверть. Этого, однако, совершенно достаточно для «поиграть между делом» и уж тем паче для не самых свежих игр.
Что касается гибридной графики, как видите, Bumblebee вкупе с Primus продемонстрировал лучшую производительность. Здесь даже и написать еще что-то сложно. Ну, если Bumblebee не получается настроить — можете использовать Nvidia Prime, отстает он совсем немного.
Что же, кажется ответы на все поставленные в начале вопросы — получены. В конце, для интересующих, выкладываю таблицу, в которой сведены результаты всех тестов:
Всё очень толково написано, спасибо))) А вот хотел спросить, у Виндовс всегда включены обе видеокарты или только по запросу как и у Бамбелби???
В Windows все происходит автоматом, т.е. дискретная видеокарта автоматически включается, когда запускаются игры. В панели управления Nvidia так же можно для каждого приложения задать, на чем оно должно выполняться.
За похвалу спасибо, но учитывайте, что статья уже сильно устарела. Wine с момента написания статьи сильно продвинулся вперед, уже 5-я версия «на дворе», а статья про вторую.
Появились DXVK и Proton, наконец, появилась «родная» поддержка гибридной графики от Nvidia.
Появились DXVK и Proton, наконец, появилась «родная» поддержка гибридной графики от Nvidia.
Но она всё равно не работает как драйвер Bumblebee Nvidia — жаль что не выходят новые версии драйверов для Шмеля(((
появилась «родная» поддержка гибридной графики от Nvidia — да, но это Prime, он не отключает карту, только с ребутом X сервера((