Тюнинг linux для игр
Несколько раз замечал жалобы новых пользователей linux на отзывчивость игр. Говорят, что после продолжительной игры в windows, в линуксе сразу заметны странные задержки системы. В пример ставится задержка между кликом по кнопке выстрела и самим выстрелом, например, это выразительно проявляется с railgun в quakelive. Конечно, время средней реакции игрока на событие (200-220мс) существенно больше выигрыша от какого-либо тюнинга системы, но если можно обратить пару десятков миллисекунд в свою пользу, то почему бы не сделать это? В общем, и сами пользователи windows, увлекшись, ищут способы тюнинговать систему для более приятной игры. Немалую роль играет и сугубо игровой тюнинг переменных, но об этом достаточно информации на специализированных форумах, и в очередной раз обсуждать это не стоит.
Уже много лет игроки со стажем «разгоняют мыши». На самом деле мышь как таковая разгону не поддается, зато существуют способы заставить систему почаще опрашивать состояние мыши. В windows для этого существуют специальные утилиты, в линуксе же это делается на уровне драйвера. Чтобы узнать, какой драйвер используется для вашей мыши, поищите информацию в выводе команды ‘dmesg | grep input‘. У большинства игроков проводные usb-мыши, для которых используется драйвер usbhid, а этот модуль имеет специальную опцию mousepoll, определяющую период опроса мыши. По умолчанию она имеет значение 8 (мс), т.е. частота опроса равна 125Hz. Я использую mousepoll=2 и гоняю мышь на 500Hz. Сделал бы период и меньше, но с mousepoll=1 частота мыши все равно остается 500Hz вместо ожидаемых 1000Hz. Почему — мне неизвестно, я не программист и разобраться в коде драйвера не могу. Для того, чтобы модуль usbhid автоматически подгружался с опцией mousepoll=2, необходимо явно указать это в параметрах автозагрузки модулей. Здесь вам стоит прочесть документацию для своего дистрибутива, т.к. в разных дистрибутивах могут использоваться разные системы инициализации, и правило загрузки модулей для одного дистра может просто не сработать в другом.
Но ничего сложно нет. У меня, например, в файле /etc/modules.autoload.d/kernel-2.6 просто содержится строчка ‘usbhid mousepoll=2‘. У вас это может быть файл /etc/modprobe.d/hid.conf (создается руками, если каталог существует) или /etc/modprobe.conf (устаревший вариант). Проверить частоту опроса мыши можно маленькой утилитой. Для запуска нужно ее собрать (gcc evhz.c) и запустить от рута полученный a.out. Специально даю исходный код, запускайте без опаски.
Качество сети, несомненно, имеет важное значение. Но на ее качество за пределами своей сетевой карты игрок едва ли может повлиять, если только он не пользуется услугами провайдера, где работает его друг. И, думаю, не стоит говорить о том, что лучше предпочесть провода, что так же касается и мыши. А вот управлять очередью исходящих пакетов очень даже можно. Для общения с сервером большинство игр использует порты UDP в некотором диапазоне. Следующие несколько строк позволяют повысить приоритет пакетов игры над другими жалкими пакетами:
#Сброс правил
tc qdisc del dev ppp0 root 2> /dev/null > /dev/null
tc qdisc del dev ppp0 ingress 2> /dev/null > /dev/null
#Описание очередей
#Указание ширины гарантированной полосы (rate) и максимально возможной (ceil)
tc class add dev ppp0 parent 1: classid 1:1 htb rate 15mbit ceil 15mbit
#Указание rate и ceil для очереди 1:10, имеющего наивысший приоритет (0)
tc class add dev ppp0 parent 1:1 classid 1:10 htb rate 10mbit ceil 15mbit prio 0
#Указание rate и ceil для очереди 1:15, используемого по умолчанию и имеющего меньший приоритет (5)
tc class add dev ppp0 parent 1:1 classid 1:15 htb rate 5mbit ceil 15mbit prio 5
#И, наконец, определение пакетов, которые должны попадать в очередь 1:10
tc filter add dev ppp0 parent 1:0 protocol ip prio 0 u32 match ip protocol 17 0xff flowid 1:10
У меня в наибольший приоритет попадает весь udp, уточнять порты для конкретных игр я не стал, так как это полезно и для других протоколов, таких как dns. Надеюсь, вы не используете uTP и не гоняете по udp торренты. А если используете, срочно отключите и никогда не включайте. Геймеры просят.
Значения rate и ceil поправьте под свой тариф. Rate — ширина гарантированной пропускной полосы для очереди, ceil — ширина максимальной, то есть, когда пакетов в других очередях нет, данной очереди предоставляется канал шириной больше rate, но никогда не больше ceil. Рекомендуется аккуратно выбирать значения rate для очередей 1:10 и 1:15, их сумма должна быть равна rate родительского класса 1:1. Интерфейс ppp0 можно оставить без изменений, если для подключения к интернету вы используется pppd, то есть, если ваш провайдер раздает интернет через PPPoE или PPTP. Если же Вы счастливый обладатель неинкапсулированного интернета по ethernet, подставьте в правила интерфейс сетевой карты, скорее всего, eth0.
Более подробно эти и другие аспекты настройки сети в линукс описаны в шикарном документе Linux Advanced Routing & Traffic Control HOWTO.
Надеюсь, это руководство поможет даже самым увлеченным игрокам по-настоящему полюбить linux. Удачи в играх!
Linux Gaming: Кровь, пот и командная строка. Часть 2
Сижу значит, никого не трогаю, доделываю вторую часть статьи и вдруг как гром среди ясного неба Valve анонсирует Steam Deck, с линуксом и протоном на борту. И хотя сомнения в успехе устройства имеются, я рад, что игровому линуксу вколют еще одну живительную дозу зелени и может быть популярности.
Сразу говорю, эта статья не будет посвящена разбору портативки от Габена, тем более, что она еще и не вышла, тем более что ее еще и сложно будет купить в ближайшее время, тем более что моим приоритетом на игровом поприще является обновление видеокарты, увы, но пока не до портативок. Статья посвящена десктопному опыту линукс гейминга, но частично будет актуальна и для Steam Deck.
Введение
Простота запуска. В идеале игре должно хватить нажатия кнопки “Установить”, а потом “Играть”, но пара несложных действий тоже принимается.
Приемлемый фпс и стабильный. Я установил для себя планку в 60 кадров в секунду при разрешении 1080p, 30 приемлемо, ниже 30 нет. Никаких 120+ фпс я от своей системы не жду и их добиваться не собираюсь.
Высокие настройки графики. В идеале чем выше, тем лучше, но приемлемо снизить настройки ради стабильного фпс. Однако снижать в разумных пределах. Если нужно выкрутить настройки на минимальные, тогда как на Windows игра без проблем идет на высоких, в такой игре я не вижу смысла.
Система на которой я буду проводить все телодвижения является достаточно средней по игровым меркам, а видеокарта так и вовсе уже свое отжила, *шутка про дефицит*.
Дистрибутив, который я выбрал являлся для меня новым, этот выбор я сделал для… хмм нет, давайте не так. Сначала взгляните на великое древо дистрибутивов Linux
Воу, воу! Отложите дробовик! Нет, вас не атакует целая армия дистрибутивов, нет они не повсюду. Все хорошо. Пришла пора открыть вам страшную правду. Linux не операционная система. Linux семейство ОС построенных на базе ядра Linux. На основе этого ядра каждый может собрать свой дистрибутив.
И часто это делается если нужен линукс под конкретные задачи например, для установки на какое-то специфичное оборудование. Пользовательских же дистрибутивов да еще и тех, которые на слуху у сообщества наберется дай бог если десяток штук и большая часть будет в достаточной степени совместима друг с другом. На этой картинке я прошу вас увидеть, что огромное число дистрибутивов исходит из одного образуя дерево. Наиболее ветвистое дерево исходит из дистрибутива Debian. Кстати SteamOS на этом дереве является одним из ответвлений Debian, ну точнее так было раньше, современный SteamOS 3.0, который будет установлен по умолчанию в стимдеке, основан на ветве Arch Linux.
Однако не стоит думать, что каждая ветка дистрибутивов развивается обособленно от остальных. Большой выбор различных компонентов операционной системы неизбежно привел Линукс к стандартизации.
Одним из продуктов такой стандартизации является формат *.appimage.
Наиболее популярным и предпочтительным способом установки программ сегодня является магазин приложений(хотя магазин наверное не лучшее слово т.к. зачастую там или нет платных приложений вовсе или они есть, но их невероятно мало.). Такой магазин есть в каждом уважающим себя пользовательском дистрибутиве, но и тут не обошлось без стандартизации. Есть два способа доставки пакета до пользователя(установки программ) и два соответствующим им магазина приложений, которые поддерживаются(или эта поддержка без труда включается) практически любым дистрибутивом вне зависимости от ветки. Это snapstore и flatpak в этих магазинах есть большая часть необходимых программ и зачастую там содержатся достаточно свежие версии. Чем отличаются эти два магазина приложений я расписывать не будут т.к. эта усыпляющая часть статьи и так получилась более усыпляющей, чем я хотел. Скажу лишь, что первый, разработанный Canonical(создатели Ubuntu), старается быть более дружелюбным, а второй более функциональным.
Теперь, когда все уснули, пришла пора объяснить свой выбор. Я взял незнакомую для себя ветку Arch linux(сделал я это больше года назад, поэтому тот факт, что стимОС3 тоже будет основана на ней чистое совпадение), а именно дистрибутив Linux Manjaro с рабочим окружением Gnome, чтобы доказать, что пусть способы достижения результатов могут несколько различаться между собой у разных дистрибутивов, различия на самом деле не настолько существенны.
Фух, обещал сегодня без теории, а потом вывалил ее от души. Ну… что тут сказать. Краткость сестра таланта, а не моя, так что, претензии не принимаются. Итак перейдем наконец к настройке системы и установки всех игр.
Сотворение игрового Линукса.
Вначале поставил пользователь Linux. Linux был безлик и пуст.
Вообще выбранный мной дистрибутив безликим и пустым назвать будет сложно. Он наполнен до краев и на все случаи жизни. Поначалу меня это отпугнуло, ведь я люблю минималистичные сборки на которые потом ставлю необходимое мне. Но стоит отметить, что Manjaro по умолчанию настроена довольно хорошо и упомянутая в первой части статьи возможность выбирать расположение панелей очень радует не говоря уже о том, что несмотря на большое количество уже установленных программ и библиотек система работает шустро. Кстати я не приложил в первой части скриншотов как собственно различаются раскладки панелей. Исправляюсь:\
Хотя стоит отметить, что это статья делалась год и недавно разработчики Manjaro обновили графическое окружение Gnome до версии 40, поэтому интерфейс сильно поменялся в лучшую сторону. Вот актуальные скриншоты:
Однако Manjaro лучше воспринимается, когда ты понимаешь, что и зачем установлено и как это работает, поэтому рекомендовать я ее стану только людям у которых есть опыт и в частности опыт настройки gnome, графического окружения которое я выбрал. Впрочем, новичкам система тоже может подойти, если вы планируете просто пользоваться тем, что наделали разработчики, а не лезть в кастомизацию.
Кстати изначально я хотел взять Manjaro KDE, но он очень заморочен в настройке, что плохо подойдет для примера, да и для меня тоже, поэтому моя оценка Manjaro KDE: бегите глупцы! Лучше выберите другой дистрибутив с KDE, если он вам так нужен. Я же остался на ветке Arch, поэтому выбрал все тот же Manjaro, но уже с окружением Gnome.
Первым делом необходимо установить драйвера для видеокарты, т.к. свободные драйвера работающие в Линуксе по умолчанию не рассчитаны на игры. Установить драйвер можно двумя способами и ни один из них не предполагает скачивания установщика с официального сайта… и даже посещения официального сайта.
В Ubuntu и производных утилита для установки драйверов называется “Драйверы устройства” ее можно найти в меню приложений или воспользоваться поиском введя частично название. Каких-то сложностей быть не должно, просто выбрать драйвер и нажать применить и после окончания установки перезагрузить. В manjaro это называется “Конфигурация оборудования” и процесс немного отличается нужно нажать правой кнопкой по нужной версии драйвером и нажать “установить”, дождаться окончания процесса установки и нажать перезагрузить.
Через коммандную строку(данный пример актуален только для Ubuntu-производных):
Для владельцев карт AMD
Для владельцев карт Nvidia
В этих репозиториях содержатся самые последние версии драйверов, тогда как через интерфейс будут доступны те, которые протестировали разработчики системы и там они могут быть сильно устаревшими, но зато более стабильными.
Вообще после добавления репозитория “add-apt-repository” с драйверами новые версии появятся и в «Драйверах устройства». Хотя и репозиторий можно добавить через интерфейс, но в сообществе линукса в руководствах все обычно прописывают команды, а не расписывают как достичь того-же через интерфейс, это проще и для самого пользователя ведь ему нужно скопировать-вставить строку в терминал и нажать Enter.
В ветке Arch, самые новые драйвера можно найти в пользовательском репозитории AUR, однако без острой необходимости я не рекомендую их использовать.
Помимо установки драйверов необходимо активировать 32 битные библиотеки, отключенные по умолчанию.
Для этого в командной строке нужно выполнить
Для arch нужно в файле /etc/pacman.conf удалить знаки # рядом со следующими строками.
Делать это необходимо в текстовом редакторе запущенным с root правами. Как вы можете заметить процесс для Ubuntu проще, как я и говорил, Manajro лучше ставить, когда уже есть опыт в Линуксе, поэтому я не стану расписывать подробно как открыть файл.
Хотя необходимость данного этапа является достаточно спорным. После настройки системы без этого этапа 32битные библиотеки что в Убунту, что в Манджаро были активированы. По идеи это делает Steam при первом запуске.
Для Ubuntu установка немного замороченная:
С Manjaro в этот раз несравнимо проще, ведь команда всего одна, пусть и большая:
Хотя терминал поддерживает вставку команд состоящих из нескольких строк, но иногда это может привести к ошибке и невыполнению части команды, поэтому я обычно выполняю команды построчно.
Помните Feral Interactive, ну та которая ответственна за большое количество портов? Так вот они также выпустили GameMode, режим, который делает следующее:
Оптимизация Linux для desktop и игр
В этой статье я хочу поделиться почти 10-летним опытом использования Linux на домашнем компьютере. За это время я провел много экспериментов над ядром, испробовал различные конфигурации для разных применений и теперь хочу все это систематизировать в длинный пост с рекомендациями как выжать из linux максимум и добиться отличной производительности, без необходимости покупать мощное железо.
Лично я считаю часть, где я написал про тюнинг ядра все же немного устарела и современное железо уже априори выдает необходимую производительность для нормальной работы, но, как мне удалось заметить недавно, с играми все равно, даже сейчас, есть проблемы, даже на мощном железе.
Хоть я и пообещал, что после прочтения этой статьи, можно будет играть в Metro 2033 на калькуляторе (шутка, такого не будет), все же она начнется с рекомендации купить кое-что из железа, если у вас этого еще нет.
1. Купите SSD, если у вас его еще нет
Почему-то многие люди скептически относятся к SSD, хотя это первый и важнейший компонент компьютера, который собирается быстро работать.
Серьезно, все что описано дальше в статье даст вам какой-то прирост в производительности и времени отклика, но любой, даже самый дешевый SSD, сократит время запуска большинства программ до 0, что, визуально, будет очень заметно. Почти в любом компьютере (и сервере) главный тормоз это всегда дисковая подсистема и никакой HDD никогда не даст вам нужной скорости поиска (которая у SSD стремится к 0 мс). За все время общения с компьютерами и их апгрейда, только переход на SSD дал значительный прирост в скорости работы и отклике. Помните как медленно работают дискеты, какое у них огромное время поиска? Примерно вот так воспринимается жесткий диск после SSD.
Так что если у вас еще нет SSD, то продолжать дальше смысла нет, ваш компьютер (хоть даже оснащенный 12-ядерным Xeon’ом) все равно будет работать медленно, так что вперед за покупками.
Касательно надежности: есть миф что SSD умирают спустя год. Его рождению мы обязаны первым SSD на бажных чипах SandForce. Естественно, любой новый SSD из магазина как минимум надежнее и долговечнее современных жестких дисков, так что не стоит беспокоиться по этому поводу вообще. Свой SSD я купил 2 года назад б/у, на то время он был в использовании год. Сейчас у него 11 681 часов наработки и использование ресурса 10%, так что при том же режиме использования, мне его хватит еще на 27 лет. Думаю, к этому времени технологии хранения данных уже несколько раз изменятся. Так что повторюсь, проблемы с надежностью более чем надуманы.
Более подробно о мифах SSD расписал товарищ Вадим Стеркин в своём блоге. Правда, блог у него о Windows, но сути это не меняет. Настоятельно советую почитать, очень интересно.
В Ubuntu 14.04 SSD работают из коробки, опция discard автоматом прописывается в fstab, кроме этого больше ничего не нужно делать.
В других дистрибутивах нужно проверять, есть ли эта опция у разделов на SSD. Стоит упомянуть, что данную опцию поддерживает только ext4. Для других ФС придется пользоваться fstrim из планировщика.
2. Таблица разделов
Не делите диски на разделы.
Для домашнего компьютера это бессмысленно и вредно. На SSD у вас должен быть один раздел для корня, там у вас будет хранится система и все данные. На HDD (если нужен) у вас должен быть один раздел с точкой монтирования в /mnt (у меня /mnt/data), где будут хранится большие малоиспользуемые данные (фильмы, музыка, игры). НЕ НУЖНО делать HDD точкой монтирования /home, так как в /home 99% программ хранит свои данные и постоянно к ним обращается, поэтому /home должен быть на SSD.
Повторюсь кратко: на SSD у вас должно быть все, к чему система постоянно обращается (пишет/читает)!
Не слушайте вредных советов по вынесению таких данных на HDD, как уже было сказано проблемы износа SSD нет, это миф, и большое число циклов записи вообще не влияет на долговечность SSD. Еще раз отсылаю к стате Вадима Стеркина, там это все описано более подробно и подкреплено объяснениями.
Насчет SWAP-раздела: он вам не нужен. Если у вас не хватает оперативной памяти, то OOM-killer будет прибивать ресурсоемкие приложения, если это происходит то докупите оперативки, благо ее цена не сильно кусается. Использование swap как расширителя оперативной памяти значительно замедляет работу компьютера. Есть много мнений, что без SWAP будут какие-то проблемы, но ИМХО, корни эти разговоров растут от Win9x и на сегодня это уже мифы, лично я не замечал никаких проблем от отказа от SWAP. Как пруф: на VPS сейчас редко увидишь подключенный SWAP и работают же как-то!
suspend-to-disk вам тоже не нужен, потому что холодный старт с SSD быстрее чем восстановление из спячки с HDD, так что пользуйтесь suspend-to-ram или выключайте компьютер полностью. Единственный плюс от свапа — возможность уйти в гибридную спячку, это когда система готовится к suspend-to-disk, но выполняет suspend-to-ram, так что позже, если все хорошо, идет простой выход из спячки, а если произошел сбой питания — то система восстановится с диска.
3. Используйте 64-битное ядро
От производительности оперативной памяти мало что зависит, от нее не увеличится FPS в играх и не станут быстрее запускаться приложения. Использование 64-битных приложений тоже не дает никакого прироста для обычных задач, только для очень специфичных математических расчетов и операций архивирования. Также, использование 64 ядра не требуется для адресации более 4 ГБ памяти, PAE позволяет адресовать до 64 ГБ памяти на 32 битной системе.
Но используя 64-битное ядро, приложения могут адресовать больше чем 4 ГБ памяти, что довольно полезно, так как иначе может возникать ситуация когда OOM-killer будет прибивать программы, хотя оперативки еще достаточно. Также на 64-битной системе можно адресовать сразу же всю физическую память, на 32 битной же все что выше
800 МБ надо постоянно ремапить, что несколько снижает скорость страничного обмена, хотя, как я уже сказал, это особо не влияет на скорость работы.
Еще замечал эффект, что OOM-killer может прибивать процессы, которые вроде бы еще не заняли 4 ГБ. У меня такое было с некоторыми играми. Проблема решилась переходом на 64 бита. Так что без 64-битного ядра уже никуда, хоть это и добавляет небольшие накладные расходы на использование памяти.
4. Используйте патсет pf-kernel
pf-kernel — это набор патчей для ядра linux, собранные украинцем Александром Наталенко (pfactum) направленные на улучшения desktop-experience linux-систем.
Для установки, я качаю с kernel.org необходимую версию ядра без стабилизационнх патчей и накладываю на него pf-kernel. В общем случае это выглядит так:
Это очень важный патчсет, именно он позволяет системе быть отзывчивой, даже в моменты большой нагрузки. В результате, например, даже при максимальной нагрузке, время запуска приложений остается таким же, как и при простое!
Вот, например, скриншот htop при работе Dota 2 + The Sims 3 (multiseat):
При такой нагрузке на третьем экране можно спокойно работать и 25% (в 5-минутном окне по данным load-average) перегрузка CPU даже не чувствуется. Хотя, конечно, проц надо менять 🙁
5. Тюнингуйте ядро!
В ядре по умолчанию используются не очень оптимальные параметры, обусловленные историческим предназначением linux для серверов и доступности для отладки.
Так что делайте make xconfig
Я расскажу о наиболее важных опциях для оптимизации
Выключаем preemption, устанавливаем низкую частоту таймера и выключаем dynticks!
ДА! Мы действительно, даже вопреки документации к BFS отключаем «жизненно важные» опции для повышения отзывчивости системы. А причина в том что они — устарели, толку от них никакого и к тому же preemption негативно влияет на производительность.
Было время, когда у меня был одноядерный процессор, тогда еще в готовых ядрах не включали preemption и высокочастотный таймер, вот тогда, после включения этих опций был огромный эффект. А именно, тяжеловесное приложение, занимающее 100% CPU, даже при наличии дискового ввода-вывода и нехватке ОЗУ никак не влияло на интерактивность и отзывчивость. В те времена, еще кроме WinXP ничего не было, а подробно рассказывать как ужасно себя ведет XP в таких ситуациях, думаю, не надо, она обычно намертво виснет, заставляя тянуться к кнопке reset. Так что иметь систему, которая почти никогда не тормозит и не зависает было приятно.
Но те времена прошли, многоядерные процессоры и огромные объемы памяти сами по себе решают проблемы отзывчивости под нагрузкой, так что дополнительно решать их программными средствами не только бесполезно, но и вредно.
Так что идем в Processor type and features и выбираем для параметра Preemption Model значение No Forced Preemption (Server). Не пугаемся фразы «ocasional longer delays are possible» потому что данную проблему у нас эффективно решает BFS и многоядерный процессор. Как и написано в описании, мы выигрываем в «raw processing power».
Также, в целях оптимизации, для параметра Processor family выберите свой процессор.
Далее, устанавливаем для параметра Timer frequency значение 300 HZ. 100 все же будет маловато, да и смысла особого нет (читайте в описании почему), но вы можете поэкспериментировать. Также, 300 Гц нацело делится и на 25 и 30, что является типичными частотами для видео, это вносит свой вклад в борьбу с тирингом (это из хелпа. По факту, с тирингом успешно борется только тройная буферизация + vsync).
В этом разделе есть немало интересных опций, посмотрите, например можно выключить hot-plug для cpu и памяти, так как на десктопе это просто невозможно сделать (а выключать-включать на лету ядра редко кому нужно).
Так как у меня не ноутбук, я выключаю все что связано с энергосбережением, то есть к примеру выключаю поддержку CPU Frequency scaling вообще.
По умолчанию BFQ выключен и его надо включить а также выбрать используемым по умолчанию.
6. Prelink
Можно предварительно связать с исполняемыми файлами динамические библиотеки, что позволяет еще более уменьшить время запуска приложений. По этой теме есть отдельная статья от peter23.
7. Заключение
Самое главное, что я всегда замечаю — после наложения патчсета и тюнинга ядра уходят «подергивания» в играх. Чем слабее железо, тем заметнее эти подергивания, хотя у меня есть подозрения что это все же какая-то проблема в драйверах nVidia, потому что разные версии ведут себя по-разному.
Ради пруфов решил провести тесты с помощью Geekbench 3 из Steam и gputest, результаты которых немного странные:
3.14-pf:
Single-Core Score 2421
Multi-Core Score 8209
gputest: 3720 pts, 62 FPS
3.13-generic:
Single-Core Score 2646
Multi-Core Score 8414
gputest: 3713 pts, 61 FPS
Windows:
Single-Core Score 2572
Multi-Core Score 8242
gputest: 3634 pts, 60 FPS
Как видно, почему-то на «оптимизированный» вариант в тесте CPU набирает меньше попугаев, а в тесте GPU — больше. Только сейчас я заметил что тестировал разные ядра, возможно в этом и причина различий результатов. Как будет время, проведу эти же тесты на 3.16, надеюсь, удастся найти причину. Самое же веселое тут в том, что у Windows результаты хуже, особенно в 3D значительно.





