В последнее время я пробовал разные эмуляторы терминала, от встроенного gnome-терминала, aterm, xterm, wterm, до rxvt. Тест, который я делал, находится в следующем порядке:
- Откройте окно Tmux с 2 панелями
- Левая панель будет многословной задачей, такой как
grep a /et/c -r
или простойtime seq -f 'blah blah %g' 100000
- На правой панели будет окно vim с включенным синтаксисом, открывающее любой файл, содержащий более 100 строк кода.
Когда левая панель печатает много выходных данных, правая панель кажется очень медленной и не отвечает, я попытался прокрутить vim, но для его изменения требуется 1-2 секунды. Когда я пытаюсь нажать CtrlCна левую панель, он ждет более 10 секунд, прежде чем он остановился
Когда я делаю то же самое в TTY (нажатие CTRL+ ALT+ ( F[1-6])), этого не происходит, и обе панели очень отзывчивы.
Я отключил некоторые настройки, такие как шрифты сглаживания, изменение цвета, использовал настройки по умолчанию и изменил на xmonad и openbox, но это ничего не меняет.
Результат time seq -f 'blah blah %g' 100000
не очень отличается между этими терминалами, но отзывчивость действительно отличается, особенно, когда я использую tmux со сплит-панелью (или другие мультиплексоры). К вашему сведению, я запускаю их все в развернутом режиме.
Я читал о терминалах с буферизацией кадров, но не уверен, как он работает и как его можно использовать для ускорения эмулятора терминала.
Итак, мой вопрос: что делает эмулятор терминала намного медленнее, чем TTY? Есть ли возможность сделать это так быстро, как TTY? Может быть, аппаратное ускорение или что-то? Одно я знаю, мое разрешение на X-сервере при запуске максимизированного эмулятора терминала составляет 1920x1080, а когда я использую TTY, оно меньше этого, но я не уверен, как это повлияет на производительность.
Ответы:
Когда эмулятор терминала с графическим интерфейсом пользователя печатает строку, он должен преобразовать строку в кодовые точки шрифта, отправить кодовые точки в средство визуализации шрифтов, вернуть битовую карту и перенаправить эту битовую карту на дисплей через X-сервер.
Средство визуализации шрифтов должно извлекать глифы и запускать их (знаете ли вы, что шрифты Truetype / Opentype являются программами, работающими внутри виртуальной машины в средстве визуализации шрифтов ?). В процессе работы каждого глифа принимается безумное количество решений в отношении метрик шрифтов, кернинга (хотя моноширинные шрифты и кернинг плохо сочетаются), соответствия Юникоду, и это еще до того, как мы достигнем растеризатора, который, вероятно, использует sub -пиксельная адресация. Затем терминал должен взять буфер, созданный растеризатором шрифтов, и перенаправить его в нужное место, заботясь о преобразованиях формата пикселей, альфа-каналах (для субпиксельной адресации), прокрутке (которая включает в себя больше мерцания) и так далее.
Для сравнения, запись строки в виртуальный терминал, работающий в текстовом режиме (примечание: не графическая консоль), включает запись этой строки в видеопамять. 'Привет, мир!' включает в себя запись 13 байтов (13 16-битных слов, если вы тоже хотите цвета). Растеризатор шрифта X еще даже не начал выполнять упражнения на растяжку и растрескивание суставов, и мы закончили. Вот почему текстовый режим был так невероятно важен в прошлые десятилетия. Это очень быстро реализовать. Даже прокрутка легче, чем вы думаете: даже на почтенных MDA и CGA на базе Motorola 6845 вы можете прокручивать экран вертикально, записывая одно 8-битное значение в регистр (может быть 16 ... это было слишком долго). Обновления экрана схемысделал все остальное Вы существенно изменили начальный адрес буфера кадра.
Вы ничего не можете сделать, чтобы сделать графический терминал таким же быстрым, как терминал в текстовом режиме на том же компьютере. Но будьте добры: были компьютеры с более медленными текстовыми режимами, чем самый медленный графический терминал, который вы когда-либо видели на современном компьютере. Оригинальный IBM PC был довольно плох (DOS делал прокрутку программного обеспечения, вздох). Когда я увидел свою первую консоль Minix на 80286, я был поражен скоростью (прыжковой) прокрутки. Прогресс это хорошо.
Обновление: как ускорить работу терминала
@ poige уже упомянул три в своем ответе , но вот мой собственный взгляд на них:
xterm
иrxvt
работать действительно хорошо, у него есть фантастический эмулятор терминала. Я подозреваю, что ваши тесты, возможно, показали, что они работают лучше, чем «современные».tmux
- запустить два отдельных терминала рядом. Когдаtmux
отображаются две панели, он должен использовать терминальные директивы, чтобы много перемещать курсор. Несмотря на то, что современные терминальные библиотеки очень быстры и хороши в оптимизации, они все равно крадут байты из вашей необработанной пропускной способности терминала. Чтобы переместить курсор в произвольную строку на DEC VT-совместимом терминале, вы отправляетеESC [ row ; col H
. Это 6–10 байт. Используя несколько терминалов, вы разделяете работу, избавляясь от необходимости позиционирования, оптимизации, буферизации и всего остального, чтоcurses
происходит, и более эффективно используя несколько процессорных ядер.источник
Между тем @Alexios довольно хорошо описал все причины, я могу упомянуть несколько вещей, которые относительно облегчают боль:
Terminal
,Terminus
- это действительно отличный),konsole
.источник
konsole
(что я одобряю).konsole
выполняет ленивые обновления экрана: вместо немедленного отображения вывода, он ждет немного времени для большего вывода, чтобы «пакетно» обновить. Вот почему он так хорошо работает, что полностью реагирует на стресс-тест ОП.