воскресенье, 1 мая 2016 г.

Исправляем тиринг в KDE

Собрал в одну статью способы борьбы с тирингом для всех видеокарт...




ВНИМАНИЕ: Данная инструкция не тестировалась с гибридной графикой, будьте осторожны!



Тиринг (англ. Tearing) - это разрыв картинки, который обычно характеризуется горизонтальными полосами. Происходит это из-за выключенной или неправильно работающей вертикальной синхронизации.  Часто проявляется в динамических сценах игр и при просмотре видео или в рабочем окружении при прокрутке и манипуляции с окнами.
Вы можете проверить, существует ли у вас тиринг, глянув это видео. Если наблюдается разрыв картинки значит эта инструкция для вас.


И так, нам нужно добавить пару опций в настройки нашего драйвера видео. Но прежде чем мы начнем, то давайте узнаем какая видеокарта у нас установлена и какой модуль используется:
lspci -k| grep -EA2 'VGA|3D'

Так же не забываем, что вертикальную синхронизацию можно задействовать в самом рабочем окружении KDE, открыв Параметры системы - Экран - Обеспечение эффектов и перейдя к пункту Предотвращение разрывов (Vsync). Я надеюсь, что вы сами подберете для себя производительный и лучший вариант.


INTEL
Видеокарты Intel по-умолчанию используют ускорение SNA и DRI2. Для решения проблем с тирингом рекомендуется использовать опцию TearFree, либо включить DRI3. Нельзя TearFree и DRI3 использовать одновременно, ибо у вас начнут виснуть иксы или рабочее окружение. Напомню, что TearFree немного снижает производительность графики.
1 вариант
/etc/X11/xorg.conf.d/20-intel.conf
Section "Device"
   Identifier  "Intel Graphics"
   Driver "intel"
   Option "AccelMethod" "sna"
   Option "TearFree" "true"
EndSection
2 вариант
/etc/X11/xorg.conf.d/20-intel.conf
Section "Device"
   Identifier  "Intel Graphics"
   Driver "intel"
   Option "AccelMethod" "sna"
   Option "DRI" "3"
EndSection
3 вариант
/etc/X11/xorg.conf.d/20-intel.conf
Section "Device"
   Identifier  "Intel Graphics"
   Driver "intel"
   Option "AccelMethod" "uxa"
   Option "DRI" "3"
EndSection

AMD
Обладателям этих видеокарт рекомендуется использовать открытый драйвер radeon или amdgpu (для карт семейства Volcanic Islands и Sea Islands). Так же как и для Intel тут доступны TearFree и DRI3, которые нужно задействовать.
radeon - свободный драйвер
/etc/X11/xorg.conf.d/20-radeon.conf
Section "Device"
    Identifier "Radeon"
    Driver "radeon"
    Option "DRI" "3"
    Option "TearFree" "on"
EndSection
amdgpu - свободный драйвер для новых моделей видеокарт
/etc/X11/xorg.conf.d/20-amdgpu.conf
Section "Device"
    Identifier "AMD"
    Driver "amdgpu"
EndSection
fglrgx - проприетарный драйвер
Если по каким-либо причинам вам необходим проприетарный драйвер, то вы можете избавиться от тиринга включив опцию снижение помех на рабочем столе, чтобы уменьшить помехи  в Параметры дисплея - Снижение Помех.


NVIDIA
Для карт Nvidia лучше всего использовать проприетарный драйвер. В настройках драйвера установите галочку на Sync to VBlank


Так же рекомендуется включить в Параметрах системы - Экран опцию Повторное использование в поле Предотвращение разрывов (VSync).
И добавить опции профиля системы:
sudo sh -c 'echo "export __GL_YIELD=\042USLEEP\042" >> /etc/profile'
sudo sh -c 'echo "export KWIN_TRIPLE_BUFFER=1" >> /etc/profile'

7 комментариев:

  1. NVIDIA
    sudo sh -c 'echo -e "export __GL_YIELD=\042USLEEP\042" >> /etc/profile'
    В сам файл добавяет вот так
    export __GL_YIELD="USLEEP"
    042 — это какие-то системные маркеры, или таки ошибка в команде закралась?

    ОтветитьУдалить
    Ответы
    1. А, кажись пока писал вопрос — понял, это же кавычки.

      Удалить
  2. пишет ошибка синтаксиса после этих команд. что не так?


    # /etc/profile: system-wide .profile file for the Bourne shell (sh(1))
    # and Bourne compatible shells (bash(1), ksh(1), ash(1), ...).

    if [ "$PS1" ]; then
    if [ "$BASH" ] && [ "$BASH" != "/bin/sh" ]; then
    # The file bash.bashrc already sets the default PS1.
    # PS1='\h:\w\$ '
    if [ -f /etc/bash.bashrc ]; then
    . /etc/bash.bashrc
    fi
    else
    if [ "`id -u`" -eq 0 ]; then
    PS1='# '
    else
    PS1='$ '
    fi
    fi
    fi

    # The default umask is now handled by pam_umask.
    # See pam_umask(8) and /etc/login.defs.

    if [ -d /etc/profile.d ]; then
    for i in /etc/profile.d/*.sh; do
    if [ -r $i ]; then
    . $i
    fi
    done
    unset i-e export __GL_YIELD="USLEEP"
    export KWIN_TRIPLE_BUFFER=1

    ОтветитьУдалить
  3. Этот комментарий был удален автором.

    ОтветитьУдалить
  4. Этот комментарий был удален автором.

    ОтветитьУдалить
  5. Извиняюсь, поправил команду для NVIDIA

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