Может ли эмулятор терминала работать так же быстро, как TTY 1-6?


59

В последнее время я пробовал разные эмуляторы терминала, от встроенного gnome-терминала, aterm, xterm, wterm, до rxvt. Тест, который я делал, находится в следующем порядке:

  1. Откройте окно Tmux с 2 панелями
  2. Левая панель будет многословной задачей, такой как grep a /et/c -rили простойtime seq -f 'blah blah %g' 100000
  3. На правой панели будет окно 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, оно меньше этого, но я не уверен, как это повлияет на производительность.


Похоже, что где-то есть большой буфер
Торбьерн Равн Андерсен

2
Обратите внимание, что tty [1-6] не всегда бывают быстрыми. На одной из машин, которые я использую, текстовая консоль работает очень медленно, в то время как xterm работает прилично.
盐 友情 留 在 无 盐

Ответы:


75

Когда эмулятор терминала с графическим интерфейсом пользователя печатает строку, он должен преобразовать строку в кодовые точки шрифта, отправить кодовые точки в средство визуализации шрифтов, вернуть битовую карту и перенаправить эту битовую карту на дисплей через X-сервер.

Средство визуализации шрифтов должно извлекать глифы и запускать их (знаете ли вы, что шрифты Truetype / Opentype являются программами, работающими внутри виртуальной машины в средстве визуализации шрифтов ?). В процессе работы каждого глифа принимается безумное количество решений в отношении метрик шрифтов, кернинга (хотя моноширинные шрифты и кернинг плохо сочетаются), соответствия Юникоду, и это еще до того, как мы достигнем растеризатора, который, вероятно, использует sub -пиксельная адресация. Затем терминал должен взять буфер, созданный растеризатором шрифтов, и перенаправить его в нужное место, заботясь о преобразованиях формата пикселей, альфа-каналах (для субпиксельной адресации), прокрутке (которая включает в себя больше мерцания) и так далее.

Для сравнения, запись строки в виртуальный терминал, работающий в текстовом режиме (примечание: не графическая консоль), включает запись этой строки в видеопамять. 'Привет, мир!' включает в себя запись 13 байтов (13 16-битных слов, если вы тоже хотите цвета). Растеризатор шрифта X еще даже не начал выполнять упражнения на растяжку и растрескивание суставов, и мы закончили. Вот почему текстовый режим был так невероятно важен в прошлые десятилетия. Это очень быстро реализовать. Даже прокрутка легче, чем вы думаете: даже на почтенных MDA и CGA на базе Motorola 6845 вы можете прокручивать экран вертикально, записывая одно 8-битное значение в регистр (может быть 16 ... это было слишком долго). Обновления экрана схемысделал все остальное Вы существенно изменили начальный адрес буфера кадра.

Вы ничего не можете сделать, чтобы сделать графический терминал таким же быстрым, как терминал в текстовом режиме на том же компьютере. Но будьте добры: были компьютеры с более медленными текстовыми режимами, чем самый медленный графический терминал, который вы когда-либо видели на современном компьютере. Оригинальный IBM PC был довольно плох (DOS делал прокрутку программного обеспечения, вздох). Когда я увидел свою первую консоль Minix на 80286, я был поражен скоростью (прыжковой) прокрутки. Прогресс это хорошо.

Обновление: как ускорить работу терминала

@ poige уже упомянул три в своем ответе , но вот мой собственный взгляд на них:

  • Уменьшите размер терминала. Мои собственные терминалы имеют тенденцию расти, пока они не заполняют экраны, и они становятся медленными при этом. Я раздражен, раздражен графическими терминалами, затем меняю их размеры и все становится лучше. :)
  • (@poige) Используйте другой эмулятор терминала. Вы можете получить огромный прирост скорости за счет некоторых современных функций. xtermи rxvtработать действительно хорошо, у него есть фантастический эмулятор терминала. Я подозреваю, что ваши тесты, возможно, показали, что они работают лучше, чем «современные».
  • (@poige) Не используйте масштабируемые шрифты. 1986 может позвонить и попросить вернуть его терминалы, но вы не можете отрицать, что они быстрее. ;)
  • (@poige) Отключите растеризацию шрифта, отключив сглаживание / субпиксельную адресацию и хинтинг. Большинство из них допускают переопределения в переменных среды, поэтому вам не нужно делать это глобально. Примечание: бессмысленно, если вы выбираете растровый шрифт.
  • Это повредит больше всего: не использовать (несколько панелей в)tmux - запустить два отдельных терминала рядом. Когда tmuxотображаются две панели, он должен использовать терминальные директивы, чтобы много перемещать курсор. Несмотря на то, что современные терминальные библиотеки очень быстры и хороши в оптимизации, они все равно крадут байты из вашей необработанной пропускной способности терминала. Чтобы переместить курсор в произвольную строку на DEC VT-совместимом терминале, вы отправляете ESC [ row ; col H. Это 6–10 байт. Используя несколько терминалов, вы разделяете работу, избавляясь от необходимости позиционирования, оптимизации, буферизации и всего остального, что cursesпроисходит, и более эффективно используя несколько процессорных ядер.

5
+1, но вещь tmux еще сложнее, чем просто отправка некоторых дополнительных управляющих кодов. Терминалы предназначены для прокрутки всего окна, а не его половины. Поэтому, когда tmux должен переместить весь текст в левой панели вверх на строку, он не может просто создать новую строку и позволить терминалу переместить ее вверх, он должен перерисовать всю панель.
Патрик

1
Совершенно верно! Я забыл об этом. Хотя уже были терминалы , которые могут прокручивать часть экрана (IIRC его называли «защита» части экрана - он был использован для форм и т.д.), он никогда не был особенно гибким, и , вероятно , не поддерживается современными эмуляторов терминала. Даже при том, что вы найдете некоторые действительно странные устаревшие директивы, все еще осуществленные сегодня.
Алексиос

Отвечая на это через 3 года, но надеюсь, что кто-то найдет это полезным. Я замечаю задержку только тогда, когда я делаю вертикальное разделение в моем vim (да, даже NERDTree), но нормальное разделение, кажется, не проблема вообще во время прокрутки.
визг

17

Между тем @Alexios довольно хорошо описал все причины, я могу упомянуть несколько вещей, которые относительно облегчают боль:


1
Кроме того, и это болезненно, уменьшите размер терминала (OP использует окно 1920x1200px). Я люблю большие терминалы, и мои имеют тенденцию расти, пока они не становятся почти такими же большими, как экран, но скорость терминала падает по мере роста терминала. Даже konsole(что я одобряю).
Алексиос

3
konsoleвыполняет ленивые обновления экрана: вместо немедленного отображения вывода, он ждет немного времени для большего вывода, чтобы «пакетно» обновить. Вот почему он так хорошо работает, что полностью реагирует на стресс-тест ОП.
ниндзя

2
Довольно уверен, что рендеринг шрифта кэшируется в какой-то момент. Я не думаю, что пиксели, представляющие букву f, перерисовываются из определения вектора каждый раз, когда они копируются в растровое изображение. (если только он не должен отображаться под новым размером или под другим углом). Я не буду оспаривать тот факт, что есть несколько действительно хороших растровых шрифтов, которые могут быть лучшим вариантом только для внешнего вида, если они существуют для нужного размера.
Питер Кордес
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.