От клавиатурата до фотона: втора част

0
926

В първата част на този материал се спряхме на човешкия фактор при бързото въвеждане на текст – обратната връзка, моторните умения, времето на реакция на човека и други. Време да обърнем внимание на латентността, която добавя компютърната система при процеса на въвеждане на текст и което е може би по-важно – при игрите, където времето за реакция при професионалните състезания е решаващо и не бива да се допуска каквато и да било латентност.

Компютърната система

Какво се случва от момента на натискане на клавиш до момента на появата на символ на екрана? Оказва се, че се случват много, при това различни неща, като всичките имат нужда от време. Дали не е по-добре просто да си купим някой топ-компютър, за да си осигурим въвеждане на информация с удоволствие и бърза реакция при игрите? Разбира се, това ще помогне до известна степен, понеже редица елементи от този процес не зависят от централния процесор и видеокартата. Да се задълбочим.

Забавянето на реакцията от страна на компютърната система може да бъде разделена на следните основни части:

  • Входна латентност – клавиатурата
  • Латентността на обработката – софтуерът
  • Изходната латентност – мониторът

Да се спрем на всеки един от тези елементи.

Входната латентност

Да обърнем внимание по какъв начин обикновената USB клавиатура обработва нашите натискания на клавиши. По принцип, именно такива клавиатури масово се използват към днешен ден при десктоп компютрите и при лаптопите.

Сканирането на клавиатурата

Обикновената клавиатура включва над 100 клавиша, което съвсем не е малко. За да се минимизира броя на проводниците и на входовите на клавиатурния процесор, клавишите обикновено са обединен в една обща матрица, в която редовете и колоните се пресичат. По този начин броят на проводниците и входните контакти на контролера на клавиатурата се намаляват от „X*Y“ на „X+Y“ – например, от 121 на 22.

Но при този подход клавиатурният процесор не може да прочете състоянието на два и повече натиснати клавиша и се налага периодично сканиране на състоянието на клавишите. Това сканиране се осъществява с някаква постоянна честота, което води до известна латентност. Типичната честота на сканиране матрицата на клавиатурите е 1000 Hz и това означава, че максималната латентност от сканирането при този тип клавиатури е 1 милисекунда (средното значение е 0,5 милисекунди).

Притрепването на контактите (Contact bounce)

Независимо от типа клавиатура, клавишните превключватели са механично несъвършени и при тях се проявява така нареченото „притрепване на контактите“ (Contact bounce) – вместо чисто включване и изключване превключвателят много бързо и често преминава от включено към изключено състояние и обратното, преди да спре в едно устойчиво състояние. Продължителността на този процес зависи от използваната технология на превключването – така например, за устройствата Cherry MX производителят заявява Contact bounce под 5 милисекунди. Натрупаните статистики показва, че средната стойност на Contact bounce е около 1,5 милисекунди.

Премахването на притрепването на контактите (Contact bounce)

Тъй като честотата на сканиране на клавиатурната матрица е доста висока, Contact bounce се интерпретира като няколко натискания на даден клавиш. За да отстрани този неприятен ефект контролерът на клавиатурата усреднява сигналите за определен период от време, за да се получи абсолютно надежден резултат дали имаме натиснат, задържан или отпуснат клавиш. Но това филтриране води до допълнително забавяне, което зависи от фърмуера на клавиатурата и нейния процесор. Тук интересното е, че производителите на практика никога не съобщават характеристиките на техните микропрограми във фирмените фърмуери. Ето защо можем да се спрем на типичните алгоритми за премахване на Contact bounce и да приемем, че филтрацията добавя още около 7 милисекунди латентност, а максималното време за справянето с Contact bounce е около 12 милисекунди (средно 8,5 милисекунди).

USB прекъсванията

USB е шина, която се управлява от компютърната система и клавиатурата трябва да изчака да пристигне запитване от тази система, за да се изпратят данните за регистрирано натискане на клавиш (процесорът за управление на клавиатурата си има собствен буфер, я който записва всички събития). Но въпреки че клавиатурата може да се сканира и опреснява с честота 1000 Hz, операционните системи обикновено използват 125 Hz за работа с USB устройствата. Тоест, максималната латентност от този процес е около 8 милисекунди (средно 4 ms). Тук е време да подчертаем, че тази честота може да бъде повишена ръчно.

USB преобразуването

Разбира се, необходимо е някакво време за преобразуване на данните. Тук само ще отбележим,че това време е около 1 ms, но при новите USB портове почти няма закъснения от този вид.

Нека да съберем всички тези латентности, за да разберем колко може да ни забави клавиатурата:

Максималната латентност на една USB клавиатура достига 22 ms, минималната – 4 ms, а средната – 8 ms. Не е малко.

Тези резултати съответстват на някои експериментални резултати по измерване на латентността предизвиквана от клавиатурата.

Може ли да се справим с това? Разбира е, че може – не е сложно. Трябва да се използва професионална клавиатура със следните особености:

  • Превключватели с малък Contact bounce, като добри резултати дават оптичните превключватели
  • Висока честота на сканиране на матрицата
  • Адаптивен алгоритъм за премахването на Contact bounce
  • Фърмуерът на клавиатурата да дава възможност за извършване на настройки
  • Използване на по-новите USB портове

Всичко това значително намалява както максималната, така и средната латентност на клавиатурата. Аз използвам малко старата вече клавиатура Kinesis Advantage, но когато я взех, моментално усетих разликата в сравнение с моята предишна обикновена клавиатура.

Геймърските клавиатури отиват още по-далече – ако предпочитате безкомпромисно решение, можете да разгледате устройство с технологията Cherry’s RealKey, при която прочитането състоянието на клавиша става по аналогов път и Contact bounce напълно липсва.

Латентността на компютърната система

Това е забавянето от получаването на входния сигнал от клавиатурата до генерирането на въведения символ от видеокартата. Или по-конкретно, латентността на компютърната система.

Това забавяне на обработването далеч не се определя само от производителността – на теория може да имаме компютърна система, която дава 300 FPS, но появата на символ на екрана да закъснява с цели 5 секунди след натискането на съответния клавиш на клавиатурата. Най-често използваните методи за справянето с този проблем са използването на пакетиране и буфериране. По принцип в една компютърна система има много източници на латентност, но те са толкова директно свързани с използването на конкретния редактор за писане на текст и код, че се измерва латентността директно на съответния редактор. Конкретните числа на тестваните редактори и среди за писане на сорс код ще дадем в следващата част.

Операционната система

След като USB хостът или казано по друг начин, USB портът на компютъра получи данните от клавиатурата, той инициира хардуерно прекъсване, за да може драйвера в операционната система да прочете тези данни чрез интерфейса на този USB хост – обикновено чрез PCI или PCIe интерфейса. След това тези данни се обработват от подсистемата за човешки интерфейс (HID) на ОС, което в крайна сметка довежда до поместването на събитието „Натиснат клавиш“ (от типа на WM_KEYDOWN) на опашката за съобщения на операционната система. След това събитието отива в цикъла на събитията на програмния прозорец на активното приложение.

Всички тези действия изискват известно време, но то е пренебрежимо малко за нашата цел – бързо печатане и бърза реакция в игрите. Важното тук е друго: основните операционни системи Windows, Mac и различните Linux дистрибуции не са реално времеви операционни системи и няма гаранция точно колко голяма ще бъде латентността. Хардуерните процеси в стандартните ОС и многозадачността на софтуера могат непредсказуемо (и неограничено) да увеличат времето на обработка.

Тук за по-опростен анализ ще приемем, че нашият компютър не е твърде много натоварен при въвеждане на информация от клавиатурата и има латентност под 1 ms.

Виртуалната машина

Ако текстовият редактор или IDE работят в средата на виртуална машина, като например JVM на Java или CLR при .NET Framework, то възниква допълнителна забавяне заради това, че те също не работят в режим на реално време с точно зададени латентности. Днес виртуалните машини са значително усъвършенствани, но в началото дават известна латентност, която бързо намалява по време на работа.

Текстовият редактор или средата за програмиране

Използваният редактор има най-голямо значение Именно той дава най-голямата латентност на компютърната система. Има немалко случаи, когато редакторът внася забавяне от 1-2 секунди.

Самият редактор използва преди всичко ресурса на централния процесор и е логично да намалим латентността на редактора чрез използването на по-мощна машина, а в последно време съвременните текстови редактори масово използват и графичния процесор. Но надеждата само на мощността на процесорите не е оправдана, понеже техният ресурс често отива на съвсем друго място – например за други приложения, за обработката на данни във фонов режим и т.н. Трябва да се има предвид, че дори и лаптопът от висок клас може да е много вял, ако е включен режимът за икономия на енергия. Така че този подход е само частично ефективен, а освен това е и скъп.

Има други начини. В края на краищата, не ни е необходим суперкомпютър, за да си въвеждаме текстовете и кода. Въвеждането на информация в един текстов редактор е един сравнително несложен процес и дори компютрите с процесори 286 осигуряваха моментално въвеждане. В един съвременен и сложен IDE редактор е напълно възможно да се постигна близка до нулата латентност при въвеждането на текст с клавиатурата, което всъщност е направено в режима за печатане с нулева латентност в IntelliJ IDEA. Това е една сравнително нова и доста сложна технология с ключови идеи, които могат да се използват за създаването на графични интерфейси от нов тип.

IDE средите и редакторите на код силно се различават по латентността на въвеждане на информацията. В следващата част ще покажем тестовете на редактори и IDE, работещи в различни компютърни конфигурации.

Конвейера на рендирането

централният и графичният процесори работят паралелно и си взаимодействат чрез буфера на командите, допълнен от буфера на драйвера на видеокартата. Повечето команди за рендиране са асинхронни и съвсем не е задължително да се изпълнят веднага, а да изчакат приключването на други процеси. Командите за рендиране се натрупват в буфера на драйвера на графичната карта, след това се пакетират и се изпращат към буфера на командите на графичния процесор, като идеята е да се получат повече кадри за сметка на латентността, която може да се променя в значителни граници.

Едно типично приложение за десктоп компютър най-често работи в средата на някой фреймуърк за рендиране на графичния интерфейс. Обикновено това е съвсем приемливо за десктоп приложенията, които не са чувствителни към натрупаната по този начин латентност. Само че има процеси, които остро чувствителни към това забавяне – например, въвеждането на данни в IDE. Ето защо редакторите използват технологии за „пробутване“ на свои команди в буфера, за да може тези команди да са изпълнени още при следващия кадър и по този начин да се намали латентността. За пример може да се даде синхронизацията в OpenGL. Има и други методи от подобен тип.


Край на втора част. В следващата част ще разгледаме влиянието на двойното буфериране, на вертикалната синхронизация и ще оценим влиянието на изходната латентност – времето на реакция на мониторите.

4.2 6 гласа
Оценете статията
Абонирай се
Извести ме за
guest
0 Коментара
Отзиви
Всички коментари