Пользователь
0,0
рейтинг
19 сентября 2014 в 16:22

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

image

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

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


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

Добавляем в xorg.conf, в секцию «Screen» (если нет, то его можно создать утилитой 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'ом :)

UPD2:
Небольшой RoadMap:
1. Чат
2. Профиль.
3. Друзья
4. Установка QuakeLive (если заранее не был установлен) прямо из qllauncher
5. Кое-что очень и очень интересное, связанное с RE и патчингом :)

UPD3:
Повторюсь, изначальной целью qllauncher было и есть увеличение производительности. Понятно, что на данном этапе его развития кому-то может не хватить функционала, а так же то, что он не рассчитан на то, что может не быть скачан и установлен виндовый QuakeLive. Для этой цели пока еще нужно самому зайти на quakelive.com, зарегистрироваться, скачать инсталлятор и запустить его вайном один раз. После этого можно запускать qllauncher.

Ссылки:
Репозиторий проекта на BitBucket
anonymous @broken
карма
18,0
рейтинг 0,0
Реклама помогает поддерживать и развивать наши сервисы

Подробнее
Спецпроект

Самое читаемое Разработка

Комментарии (29)

  • +11
    Хоть я и не играю в QuakeLive, но плюс вам за проделанную работу!
  • +1
    > ppa:broken/ppa
    Я по началу даже как-то испугался.
    • +2
      Я тоже увидел как все будет уже после того, как создал ppa :) С ним было много заморочек, я решил оставить так. Да и логин в LaunchPad не поменять, как я понял, а только новый регистрировать, а на этом у меня больше 5 лет контрибьюции.
  • +1
    C# достаточно неплохо декомпилируется. Не пробовали декомпилировать оф. клиент?
    • +2
      Нет, да и смысла тоже нет. Из C# там только логин и апдейт игры, ну и список новостей. Все остальное — C++ + opengl + awesomium framework. А мой лаунчер может гораздо больше, к версии 1.0 планирую абсолютно полностью отказаться от ихнего лаунчера, для этого осталось сделать:
      1. Чат.
      2. Список/работа с друзьями.
      3. Парсинг игрового профиля.
  • 0
    >2 монитора
    >низкий фпс
    А так проделана крутая работа, интересная статья.
    • 0
      Нативный quakelive когда был — тянул абсолютно 100% производительности, было все просто идеально, так что дело не 2х мониторах.
  • 0
    Т.е. я правильно понимаю, что его теперь можно спокойно запускать под онтопиком и при этом без вайна?
    • +1
      Нет, без вайна никак, однако теперь убрано все лишнее и ненужное, тормозящее игру. Без вайна никак, только рекомпайл под систему, но исходников же нет :(
      Главный плюс нативного лаунчера — нативность самого лаунчера, весь функционал awesomium-оболочки в quakelive, а так же запуск чистого quakelive, прямо как quake3, то есть нажал — и ты в игре, без посредников.
      • 0
        Жааль. Но это тоже серьёзно:) Спасибо за старания! Надо будет попробовать, как до вменяемого интернета доберусь
        • 0
          Жаль-то жаль. Но… Тут кое-что очень и очень и очень интересное у меня с reverse engineering и quakelive есть :) Работа пока только началась, но могу сказать одно — это уже кое-когда работало. Так что может быть мы однажды увидим нативный quakelive :)
        • 0
          К слову у меня где то валяется папочка на линуксе со старым нативным Quakelive… эх. Я вот думаю, все таки если собрать много людей которым нужен квейк на линуксе и маке (а я думаю таких не мало) и навалиться на разработчиков то я думаю они все таки вернут нормальную версию.
          Тем более есть повод — стим. Стим кроссплатформенный, а значит нет никаких проблем через него теперь пускать игру на линуксе и маке.
          • +1
            Вряд ли они вернут. Я думаю, это из разряда «More politics than reality», так что тут только пистолет к виску.
            • +1
              Дело не в политике, просто текущие разработчики QL не умеют программировать под Линукс (и в общем-то не скрывают этого).
  • +4
    Мне кажется, вам сюда jobs.zenimax.com/
  • 0
    Опция Option «TripleBuffer» «false» помимо выключения тройного буфера, «включает» тиринг. Это чтобы потом никто не удивлялся. Кстати, если ничего не писать, оно и так будет отключено.
    • 0
      Лучше явно прописать, а насчет тиринга — да, но насколько я помню тут что-то от чего-то зависит. Конечно, можно еще сказать «включи вертикальную синхронизацию» и еще всего для плавной картинки, но мы же геймеры, мы хотим фпс!
      • 0
        Без тройного буфера конкретно kwin будет рвать линии при перемещении окон, это я заявляю со всей ответственностью.
        А в игры я играю с vsync и конечно с triple buffer, благо железо позволяет. В играх тоже рваные линии не хочется наблюдать.
        • 0
          Есть такое, но это жертвы :) И в настройках системы можно включить VSync же.
          • 0
            Без триплбуфера он не будет работать. Причины в статье вики, куда вы ссылку дали.
            • 0
              VSync? Не будет работать без TB? Это почему еще? Это TB сделан для VSync, а не VSync для TB.
        • 0
          VSync добавляющий лаг в пол-кадра, не нужен в Quake.

          С.О.
  • +1
    Утро предвещает рельсу и напильники вечером))

    Спасибо за проект. Супер!
  • 0
    Спасибо тебе автор! Наконец поиграю на мак.
    • 0
      Научите же и нас.
    • 0
      Конкретно данное ПО, думаю, не будет работать на маке. Под мак нужно носить все зависимости с собой в пакете и специально паковать, я пока этим не занимался, может займусь скоро.
  • +1
    Тем временем на кикстартере собирают на игру с этой же физикой и геймплеем в новой оболочке — Reflex
    • 0
      Привет, hox :)

      Пека сказал, она не оптимизированная, а ранний доступ все равно за дохрена денег дают :) Ну и помедленнее cpma, согласись.
      • 0
        Привет бро :)
        Оптимизации дело будущего, я следил за проектом и вижу заметную динамику развития по сравнению с аналогичным проектом Reborn, который даже выкладывался и примерно одновременно стартовал, Reflex заметно дальше ушел и вообще я рад что за основу cpm взят, когда в Reborn vq3 :)

Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста.