Історія: нативний завантажувач QuakeLive для Linux

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 і збільшення продуктивності. Дуже багато відгуків про цій настройці. Рекомендую почитати тут, для розвитку, тут.

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

Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.