Дисклеймер

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

Убедитесь, что Вы готовы к этому.


Показаны сообщения с ярлыком tearing. Показать все сообщения
Показаны сообщения с ярлыком tearing. Показать все сообщения

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

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

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

Вариант 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.

С включенной опцией получил такой результат:
 
Unigine Valley - Тест с ForceFullCompositionPipeline = On
Текстом:
FPS: 35.0
Score: 1465
Min FPS: 22.5
Max FPS: 59.6
А вот результат того же бенчмарка с выключенной опцией:
 
Unigine Valley - Тест без ForceFullCompositionPipeline
 Текстом:
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, драйвер и железо. А то заметка людьми читается, а вот есть ли результат у читателей - неизвестно :-(