С того момента, как 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, нативный, без вайнов.
Сразу скажу, что язык (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