Дисклеймер

Внимание: в этом блоге могут описываться события, явления и факты при помощи ненормативной лексики. Убедитесь, что Вы готовы к этому.

среда, 9 июля 2014 г.

Как я избавился от тиринга (KDE, Nvidia)

Многих интересует решение вопроса с тирингом (screen tearing) в ОС, основанных на ядре Linux. Что такое тиринг? Это когда "рвётся изображение". Это не беда какой-то отдельной аппаратной или программной платформы. Стоит отключить вертикальную синхронизацию в игре на Windows - и tearing тут как тут.
У кого-то при использовании GNU/Linux его нет и не было, у кого-то периодически пропадает, некоторые его просто не замечают. Иногда тиринг пропадает при работе в полноэкранном режиме, при этом присутствуя в оконном.
Причины кроются в видеодрайверах, настройках менеджера окон, X-сервера и, возможно, в самом железе (имеется в виду не только видеокарта, но и монитор).
Не так давно у меня появился удивительно мерзкий тиринг, который натурально мешал смотреть видео, включая полноэкранные режимы, где тиринга у меня никогда не было, в т.ч. через Adobe Flash (да, я знаю, что не по фэн-шую, что "флэш-зло" и т.п., но некоторые видео иначе просто не посмотреть).
И я решил, что хватит это терпеть

Вариант 1:
После многочасовых попыток решить проблему, на горизонте нарисовалось первое решение.
Для этого нужно внести изменения в файл /etc/X11/xorg.conf, добавив в секцию Screen строку:
Option "metamodes" "nvidia-auto-select +0+0 { ForceFullCompositionPipeline = On }"
У меня получилось вот так:
Section "Screen"
    Identifier     "Screen0"
    Device         "Device0"
    Monitor        "Monitor0"
    DefaultDepth    24
    Option "metamodes" "nvidia-auto-select +0+0 { ForceFullCompositionPipeline = On }"
    SubSection     "Display"
        Depth       24
    EndSubSection
EndSection
Если blogger разобьёт выделенное жирным на 2 строки - не поддавайтесь на провокацию, всё выделенное жирным должно быть в Вашем xorg.conf одной строкой.
Кроме того, вместо nvidia-auto-select можно вручную вписать разрешение и частоту обновления. Например, вот так:
Option         "metamodes" "1920x1080_120 +0+0 { ForceFullCompositionPipeline = On }"

После этого нужно сохранить изменения в файле и перезапустить X-сервер. Но можно и "просто" перезагрузить компьютер (я так и делал).

Для полноты картины моих настроек:
  • в настройках Nvidia X Server в разделе OpenGL у меня отключён "Sync to VBlank";
  • в настройках эффектов KDE движок - OpenGL 3.1, графическая система Qt - растровая, предотвращение разрывов (Vsync) - полная перерисовка.
Совершенно нет уверенности в том, что сами по себе данные настройки повлияли в моём случае. Реально помогло лишь включение режима ForceFullCompositionPipeline, о чём написано выше. Тиринг пропал, его просто нет (или я его не вижу, что, в принципе, одно и то же). Стоит убрать строку из xorg.conf - и он возвращается независимо от того, какие опции Nvidia X Server или эффектов KDE.

На форумах devtalk.nvidia.com я слышал байки, что эта опция для решения проблемы screen tearing - ужасное решение, т.к. приведёт к страшной потере производительности. Возможно, у кого-то так и будет. Возможно, для какой-то версии драйверов это и так.

Но я на слово верить не захотел и проверил через Unigine Valley. Ключевые компоненты - i5-2500K @ 4.4 GHz и GTX 760.

С включенной опцией получил такой результат (html):
FPS: 35.0
Score: 1465
Min FPS: 22.5
Max FPS: 59.6
А вот результат того же бенчмарка с выключенной опцией (html):
FPS: 35.1
Score: 1470
Min FPS: 21.5
Max FPS: 60.1
Возможно, для кого-то потеря 0.5 от максимального FPS и 0.1 от среднего - это страшно, но по моему скромному мнению, не только лишь все, мало кто может это заметить своими глазами.
Вроде бы всё достаточно понятно.

Вариант 2:
Создать файл /etc/profile.d/antitearing.sh
В который необходимо добавить строку 

export __GL_YIELD="USLEEP"
Сделать его исполняемым через 
chmod +x /etc/profile.d/antitearing.sh

Опять же, дисклеймер: то, что работает у меня, не обязательно должно работать у других, т.к.
системы, настройки, версии драйверов и железо разное.

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

P.S. если помогло (или не помогло), просьба указать об этом в комментариях, упомянув DE, драйвер и железо. А то заметка людьми читается, а вот есть ли результат у читателей - неизвестно :-(

3 комментария:

  1. Не работает. Тиринг как был, так и есть.
    Ещё уточняйне пожалуйста где этот файл находится, а то не для всех такая инйормация очевидна.
    Ubuntu 14.04 Nvidia 331.113
    GT525m
    Core i7 2670qm
    Систему перезапускал после изменений.
    Кстати, на встроеной HD3000 интел тиринга вообще нет. Но хотелось бы Нвидию использовать

    ОтветитьУдалить
    Ответы
    1. Предполагалось, что те, кому подобная тема интересна, знают, где xorg.conf находится. Но тем не менее, дельное замечание, поправлю.
      В остальном - решение проблемы с тирингом зависит, в том числе, и от композитного менеджера, у которого есть специфичные настройки.
      Вероятно, в ubuntu стоит попробовать:
      создать файл /etc/profile.d/antitearing.sh
      в который добавить строку export __GL_YIELD="USLEEP"
      сделать его исполняемым через chmod +x /etc/profile.d/antitearing.sh

      а затем перезапустить ОС.
      либо попробовать export __GL_THREADED_OPTIMIZATIONS=1
      или же обе строки вместе.

      Удалить
  2. Спасибо, брат! Помогло! Дай, Бог, здоровья!

    ОтветитьУдалить