Что такое аппаратный курсор и как он работает?

Есть ли кто-нибудь, кто может объяснить, как именно работает аппаратный курсор? Как это связано с графикой, которую я рисую на экране? Я использую OpenGL для рисования, как аппаратный курсор связан с графикой OpenGL?

РЕДАКТИРОВАТЬ: Для тех, кто может быть заинтересован в этом в будущем, я только что реализовал то, что необходимо для отображения курсора с оборудованием. Реализация была в ядре, и для ее использования было достаточно простого ioctl. Работает отлично.


person Luca Carlon    schedule 05.08.2011    source источник
comment
привет Лука, мне интересно увидеть твой код с ioctl для аппаратного курсора без X11! Можете ли вы связать свой код или страницу / справочную страницу, описывающую, как это сделать? Спасибо.   -  person Sam Watkins    schedule 02.05.2013
comment
Собственный код, извините. Я мог только добавить информацию о том, как я это реализовал.   -  person Luca Carlon    schedule 02.05.2013
comment
Буду признателен за любую подобную информацию! т.е. пожалуйста, ответьте на свой вопрос со ссылкой на Linux, и я проголосую за вас :) (или отправьте мне сообщение [email protected])   -  person Sam Watkins    schedule 03.05.2013
comment
Я уже добавил соответствующую информацию в вопрос много лет назад. Я использовал системные вызовы для перемещения указателя на экране и установки данных, связанных с изображением, для отображения в виде курсора. Я реализовал это в драйвере курсора моей среды, которая в то время была Qt для встраиваемых Linux-систем. Я не думаю, что есть что еще сказать, это было очень просто.   -  person Luca Carlon    schedule 03.05.2013


Ответы (3)


Аппаратный курсор означает, что GPU обеспечивает отрисовку (небольшого) наложенного изображения поверх кадрового буфера экрана, положение которого можно изменить двумя регистрами (или около того) на GPU. Таким образом, перемещение вокруг указателя не требует перерисовки частей буфера кадра, которые ранее были заблокированы.

Отношение к OpenGL: Нет!

person datenwolf    schedule 05.08.2011
comment
Отсутствие связи с OpenGL означает, что не важно, что пишется в фреймбуфер, я могу использовать OpenGL, X11 или что-то еще, и указатель будет располагаться так же в конце цепочки. Это правильно? Спасибо за Ваш ответ! - person Luca Carlon; 06.08.2011
comment
@ Лука: Действительно. OpenGL — это всего лишь один из способов отрисовки в экранном фреймбуфере. Но в любом случае аппаратный курсор работает независимо от этого. - person datenwolf; 06.08.2011
comment
Вы бы сказали, что это лучший способ предоставить курсор устройствам, которым нужна высокопроизводительная графика? А может лучше просто рендеринг курсора с ускоренной реализацией OpenGL? Спасибо! - person Luca Carlon; 06.08.2011
comment
@Luca: Очевидно, что курсор с аппаратным ускорением - лучшее решение. Аппаратное ускорение или нет, изменение одного бита в сцене OpenGL требует повторного рендеринга всего этого (или работы с текстурами кеша). Курсоры HW просто работают, и ими легко пользоваться; Просто используйте стандартные функции настройки изображения курсора графической системы (SetCursor в Windows, XCursor в X11, MacOS X, я не знаю, но руководство знает это ;) - с правильно установленными графическими драйверами вы автоматически получите курсоры с аппаратным ускорением. - person datenwolf; 06.08.2011
comment
К сожалению, я не работаю ни с Windows, ни с X11, ни с MacOS X :-) Поэтому подробности этой темы для меня актуальны. Спасибо! - person Luca Carlon; 06.08.2011
comment
Это Linux, созданный с нуля. Для графики я использую комбинацию пользовательской реализации EGL и QWS (система окон Qt). Для реализации аппаратного курсора, я думаю, необходимо знать, есть ли реализующая его библиотека и написать драйвер для его работы с QWS. Это правильно? Я полагаю, именно так это реализовано в классических оконных системах. - person Luca Carlon; 06.08.2011
comment
@Luca: аппаратные курсоры реализуются графическим драйвером. В случае с Xorg это делает драйвер Xorg. EGL и QWS основаны на Mesa, который снова использует DRI/DRM, если есть драйверы с открытым исходным кодом (но не для NVidia). Где-то там должна быть поддержка курсора HW, но не спрашивайте меня, где именно. Однако универсальной библиотеки курсоров HW не существует, поскольку она сильно зависит от аппаратного обеспечения. - person datenwolf; 07.08.2011
comment
Данный аппаратный курсор реализуется аппаратно. Но разве OpenGL (или DirectX) не является вашим окном (дверью, шлюзом, способом связи) с этим оборудованием? я думаю, я спрашиваю: как вы указываете марку видеокарты, установленной в компьютере, чтобы нарисовать курсор здесь? - person Ian Boyd; 11.11.2011
comment
@IanBoyd: Технически вы этого не сделаете (скажите ему что-нибудь нарисовать). На самом деле это просто область памяти и два регистра, и графический процессор будет накладываться на каждый кадр, отправляемый на дисплей (он не рисуется, он накладывается на данные, выходящие на монитор). Таким образом, нет актуального рисования курсора. Помещение изображения курсора в графическую память и установка регистров осуществляется драйвером. Это очень отличается от использования API, такого как OpenGL, который заставляет графический процессор генерировать изображение. - person datenwolf; 11.11.2011
comment
@datenwolf Но как ты разговариваешь с водителем? Конечно, мне не нужно писать код, адаптированный для каждой версии каждого когда-либо созданного оборудования, для каждой версии каждого когда-либо созданного драйвера. Конечно, есть какой-то API (например, OpenGL), который абстрагирует детали аппаратных спрайтов конкретного поставщика. - person Ian Boyd; 12.11.2011
comment
@IanBoyd Я уже объяснил это в другом комментарии, отвечая Луке: графический уровень операционной системы обеспечивает вызовы API среднего уровня. В Windows это SetCursor, в X11 вы используете протокол XCursor, а MacOS X предоставляет класс NSCursor. Затем эти API общаются с водителем. - person datenwolf; 12.11.2011
comment
теперь я понимаю. Аппаратный курсор — это то, что происходит естественным образом, и людям приходится прилагать все усилия, чтобы скрыть обычный курсор, чтобы нарисовать свой собственный. я думал, что аппаратный курсор нужно программировать; на самом деле не аппаратный курсор - это то, что вам нужно запрограммировать. - person Ian Boyd; 12.11.2011
comment
@IanBoyd: Аппаратный курсор относится только к способности графического оборудования перекрывать изображение курсора таким образом, чтобы не требовалось полное обновление перерисовки каждый раз при изменении положения курсора или изображения. Если графическое оборудование не поддерживает аппаратные наложения курсора (что маловероятно в те дни), то графическая система должна реализовать курсор, отрисовывая его непосредственно в экранный фреймбуфер. Это означает, что части, открытые при перемещении курсора, должны быть перерисованы затронутыми программами; если программа не обновила содержимое своего окна в промежутке, вы можете использовать двойное рисование XOR для эффективных обновлений. - person datenwolf; 12.11.2011
comment
@datenwolf Но из Stackoverflow/программиста, программирующего в OpenGL в операционной системе: я ничего не делаю для создания аппаратного курсора. Это делает операционная система. Как программист, единственное, что я мог бы сделать (в современных операционных системах), это прыгать через обручи, чтобы избегать использования аппаратного курсора. Как программист, пишущий программу на основе OpenGL: мне не нужно ничего делать. - person Ian Boyd; 14.11.2011
comment
@IanBoyd: Точно, только курсор HW на самом деле предоставляется аппаратным обеспечением, а не ОС. ОС просто предоставляет единый API для его установки. - person datenwolf; 14.11.2011

Аппаратный курсор не отображается и не поддерживается OpenGL. Какой-то небольшой аппаратный элемент накладывает его на любое изображение, выходящее из разъема дисплея — оно вставляется непосредственно в битовый поток при сканировании каждого кадра. Из-за этого его можно перемещать, изменяя пару аппаратных регистров, содержащих его координаты. Раньше их называли спрайтами, и в разных системах их поддерживало разное количество.

person phkahler    schedule 05.08.2011
comment
Можно ли сказать, что это распространенный или лучший способ отображения курсора для высокопроизводительных графических интерфейсов? Спасибо! - person Luca Carlon; 06.08.2011

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

Однако программные курсоры, визуализируемые вами как спрайт в пространстве экрана во время цикла рендеринга, должны работать со скоростью вашего игрового движка. Таким образом, если ваша игра испытывает отставание или иным образом падает ниже целевого значения fps, задержка курсора ухудшится. Незначительное падение частоты кадров в игре обычно приемлемо, но незначительное снижение задержки курсора очень заметно как «вялый курсор».

Вы можете легко проверить это, отрендерив программный курсор, оставив включенным аппаратный курсор. (К вашему сведению, в Windows API функция hw курсора — ShowCursor). Вы обнаружите, что программный курсор следует за аппаратным курсором.

person Rama Hoetzlein    schedule 18.01.2014