История: нативный загрузчик QuakeLive для Linux

в 12:22, , рубрики: game development, linux, python, Steam, X11

image

С того момента, как id Software прекратила поддержку Linux и Mac и сделало Launcher для QuakeLive в виде отдельного standalone-приложения, написанного на C# с использованием кроссплатформенного фреймворка(!) для рендеринга веб-страниц в OpenGL, прошло немало времени. Я уже затюнил свой дистр для стабильного-максимального количества fps (у меня все равно слабая видеокарта), но он по-прежнему тормозил. Сейчас я расскажу, что сделал для того, чтобы поиграть в любимую игру в свободное время, в игру, с которой я начинал свое сидение за компьютером в 7 лет. Я не останусь равнодушным к таким плевкам к людям никогда. Под катом расскажу о том, как повысить производительность в игре на Linux и о том, как я сделал свой собственный Launcher.

1. Оптимизация OpenGL

Так как видеокарта у меня NVIDIA, то здесь все для NVIDIA. Сразу скажу, что данные настройки дают ощутимый прирост производительности.

Добавляем в xorg.conf (если нет, то его можно создать утилитой nvidia-settings:

Option «NoFlip» «True»
Option «NoRenderExtension» «False»
Option «NoLogo»
Option «AllowGLXWithComposite» «true»
Option «RenderAccel» «true»
Option «UseEvents» «false»
Option «TripleBuffer» «false»
Option «RegistryDwords» «OGL_MaxFramesAllowed=0x0; EnableBrightnessControl=1»

Скажу лишь о главных настройках, дающих ощутимое — это TripleBuffer = false и OGL_MaxFramesAllowed=0x0. Первое, как ясно из названия, отключает тройную буфферизацию, второе — устанавливает количество фреймов, которых нужно рендерить после того, как отрендерилась вся картинка для видеокарты (например, для 60 герц-монитора отрендерилось 60 кадров). Главные цели этих настроек — это уменьшение InputLag и увеличение производительности. Очень много отзывов было об этой настройке. Рекомендую почитать тут и, для развития, тут.

Так же, в игре необходимо полностью выключить пост-обработку (postprocessing) и включить r_vertexlight = 1.

2. Приоритеты процессов

Так как лаги были по-прежнему, я начал рыть глубже. Кто-то наверняка мог подумать, что повышение приоритетов процессов через renice поможет. Какие только я не видел попытки — понижаем до минимального (20) wineserver, до максимального приоритета — игру, наоборот, все вместе. Поверьте, это результата не дает.

3. Свой Launcher.exe

Роем еще глубже. Я сделал простой вывод ps ax | grep quake и увидел так называемый awesomium_process.exe. Я не буду пояснять что это за процесс, скажу лишь, что его спавнит quakelive.exe для встроенного веб-браузера. Проблема в том (как я полагаю), что awesomium всегда работает с логгированием, в связи с чем где-то раз в 30 секунд происходит абсолютно всегда какой-то лаг на полсекунды, плюс вместе с ним в игре всегда меньше FPS, чем может быть. Сначала я попробовал его убивать, но через пару секунд его снова спавнит quakelive.exe. Затем я попробовал его стопать (kill -stop pid) — тогда все шло как по маслу. Конечно, руками это делать всегда надоедало, хотя у меня и два монитора и всегда открыта консоль. Я задумался над тем, что знаю достаточно большое количество людей, кто играет с Mac или Linux.

И здесь я решился написать свой Launcher, нативный, без вайнов.

image

Сразу скажу, что язык (Python) был выбран потому, что я осознавал, что придется много возиться с парсингом и строками. Ну и вообще быстрее это все будет происходить.

Сначала я проанализировал то, как работает quakelive, хотя и не без сторонней помощи (однако ее около 5% и она устарела (API изменился)). В этом деле мне помог мой любимый Wireshark и, на удивление, FireBug. С помощью последнего я смотрел как и что делает браузер (с его кастрированным функционалом) на quakelive.com. Но ведь 80% функционала спрятано в stand-alone клиенте, а это exe! В этом случае помог Wireshark.

Сначала я посмотрел что делает сам quakelive.exe с помощью утилиты netstat, посмотрел IP, к которым обращается клиент. Затем вбил эти IP в Wireshark и с помощью анализа пакетов понял, что в большинстве случаев это так же quakelive.com:80, как и на сайте. Ну что ж, тут все просто — анализируй все подряд аккуратненько и подделывай. На данный момент я подделал практически все и знаю как устроен абсолютно весь quakelive-клиент. Но тут есть один интересный момент — чат.

Я сразу догадался, что это XMPP. Я спросил своих друзей-линуксоидов (один из них является администратором одного irc-канала для проведения pickup-игр), и он мне подсказал, что это действительно так и даже дал ссылочку на «почитать» как оно работает (кто-то написал небольшой алгоритм своими словами как сделать клиент для чата quakelive). На самом деле это обычный xmpp-аккаунт на домене quakelive.com. Но тут проблема — и чат и игра связаны, так как уведомления о том, где находятся друзья (на каком сервере) и прочие штуки-дрюки (ростер, инвайты в друзья) и так далее — все использует XMPP, а все данные зашифрованы, и с помощью Wireshark их не увидишь. Я поступил проще — подключился к xmpp-серверу quakelive.com через собственный python-клиент и анализировал все данные в сети, которые мне приходят. Далее я попробовал законнектиться к ресурсу через любимый qutIM и еще раз убедился, что все работает так, как я думаю.

Немного оффтопа и продолжение

Цель моего Launcher'а была отвязка от клиента (и от лагающего процесса awesomium_process.exe), который использовался игровым веб-браузером. Проблема состояла в том, что невозможно было запустить игру без него (и зайти на сервер), так как он был должен в обязательном порядке пройти аутентификацию на сервере XMPP. Пораскинув мозгами я собразил, что сама игра и без этого процесса может аутентифицироваться на сервере, и с помощью правильных команд и парочки дней времени я-таки добился этого — запустил quakelive.exe без веб-браузера, зашел на сервер и поиграл, при этом fps держался стабильно максимальный и не было никаких подергиваний, как это было с awesomium_process.exe. Эти наработки так же вошли в мой launcher.


Итог
Имеем приложение для всех deb-based -дистрибутивов, написанный на python и позволяющий запускать игру с максимально возможной производительностью.

Кроме того, я заимел несколько контактов в разных уголках мира, одним из которых является автор знаменитого QLPrism, он в свободное время занимается тестированием моего приложения, как и другие люди.

Напоследок скажу, что без нашего программистского мышления (это когда все друг другу помогают) это все было бы сделать гораздо труднее, за что спасибо всем тем, кто мне хоть как-то помог.

Что может мой клиент:
1. Автоматический апдейт игры.
2. Запуск сразу с заходом на сервер (вбил линк и Enter)
3. Браузер серверов
4. Запуск собственного сервера (при наличии pro-account'а)

Установка:

sudo add-apt-repository ppa:broken/ppa
sudo apt-get update
sudo apt-get install qllauncher

UPD: Вчера quakelive вышел в Steam, что опять же, в очередной раз связывает руки мне и другим людям, желающим играть с Mac или Linux с использованием сети Steam. У меня уже есть некоторые идеи, как сделать так, чтобы было возможным запустить quakelive в нативном (Linux- или Mac-осовском Steam), но это требует изучения. Однако, как меня заверили «приближенные» люди, поддержка старого Launcher'а (в виде exe-файла) планируется около года, так что еще все впереди и можно пользоваться моим Launcher'ом :)

Ссылки:
Репозиторий проекта на BitBucket

Автор: broken

Источник

* - обязательные к заполнению поля