Курсоры

Assembler programming questions
  • Пробовал, только так и не добился, чтобы вообще хоть какой-то курсор показался :) http://mikedld.com/f/nvidia_driver.7z (исходники где-то есть, как и для ATI драйвера когда-то писавшегося)
  • Ещё можно немного оффтоповский вопрос.

    Во время работы програм, особенно это видно в играх и 3-д демках, окно перерисовывается полностью и потому курсор магает. Иногда очень сильно.

    Можно ли сделать чтоб перерисовывалась только клиентская облать окна (без заголовка)?
  • Leency
    Это будет играть роль лишь, если перерисовываемая область существенно меньше, чем само окно, в противном случае разница будет заметна лишь на очень слабых компьютерах.
  • В этом случае, при наведении курсора на заголовок, он, возможно, не будет исчезать, а теперь же закрывать активно рисующие программы приходится почти на ощупь - курсор появляется на тысячные доли секунды...
  • Heavyiron уловил мою мысль.
  • Leency wrote:Можно ли сделать чтоб перерисовывалась только клиентская облать окна (без заголовка)?
    Хм, программе самой решать, перерисовывать всё окно или только клиентскую часть. На это влияют используемые системные вызовы. Например, функция 0 должна (в идеале) использоваться только когда программе приходит сообщение о перерисовке (#1). Именно при вызове функции 0 и перерисовываются заголовок и рамка окна. В противном случае, если эту функцию лишний раз не вызывать, рамка и заголовок *никем более* перерисовываться не могут, кроме опять же самой программы.
    Вобщем, проблема именно программы. Ядро не при чём. Оно не посылает сообщения #1, покуда в этом действительно не возникнет необходимости (перемещение окна, изменение его видимой области).

    Вторая проблема, с тем, что исчезает курсор, связана действительно с ядром, и насколько я помню, курсор над заголовком моргает потому, что при рисовании примитивов проверяется не пересечение примитива и курсора, а пересечение окна и курсора. Таким образом, неважно, где рисуется точка - прямо под курсором или в 30-ти пикселах от него - курсор будет скрыт и вновь показан после окончания рисования примитива, если он находится в области окна, совершающего отрисовку.
  • Сегодня поэксперементировал с курсором. Проблема несколько в другом... Размер курсора - 32х32, активная точка - 0,0. При этом рисунок курсора занимает не все 32 пиксела. Но перерисовка всего курсора происходит, если отрисовка примитива происходит даже в районе незадействованных пикселов. Поэтому курсор исчезает, когда его рисунок на заголовке, а незадействованные пикселы попадают уже в клиентскую область окна, где происходит активное рисование чего-нибудь.
    Попробовал ход конем: сместил рисунок курсора в нижнюю часть, не изменяя положение активной точки. Исчезновения пректатились, но попасть таким курсором куда-нибудь непросто :). Тогда я передвинул активную точку. Курсор опять стал исчезать при наведении на заголовок :(. Такое впечатление, что ядро отсчитывает по 32 пиксела для курсора вниз и вправо, начиная с активной точки...
  • Heavyiron
    Давно требуется переписать алгоритм вывода курсора, и кое-кто обещал это сделать, года этак 3 назад.
    Конечно, воевать на форуме куда приятней, чем заниматься делом. :-(
  • Heavyiron
    Код проверки отсечения курсора не менялся. А активноая точка задаёт смещение рисунка курсора влевво и вверх относительно текущих координат мыши.
  • Самое значительное мерцание вызывается функцией 4 - вывод текста. В начале вывода ставится 'call [disable_mouse]' (и так вродебы во всех примитвах), т.е. курсор исчезает на все время исполнения примитива а не на прорисовке отдельной точки примитива. Если в обработке прерывания от мыши выводится текстовая информация, никакие частичные перерисовки окна не спасут. При отрисовке точки функцией 1, время вывода примитива на порядок меньше, соответственно мерцание малозаметно.
    Напрашивается два вывода для борьбы с мерцанием:
    1 - В примитивах ядра проверять на отсечение курсора каждую выводимую точку а не весь примитив скопом.
    2 - Дополнительно добавить в функции ядра возможность вывода примитивов без отсечения курсора (особенно для функции 4), т.е. позволить программам делать отсечение самостоятельно, в этом случае частичные перерисовки окна окажутся вполне эффективными.
  • Alver
    Вообще-то напрашивается нулевой вариант - переписать GUI-функции так, чтобы они проверяли, не находится ли текущая точка под курсором и если находится, то записывать её не на экран, а в буфер, сохраняющий информацию о пикселах под курсором. Именно так я понимаю слова "Давно требуется переписать алгоритм вывода курсора".
  • Дело в том что, если проверять каждую точку то теряется скорость. отрисовки
    Я думаю, нужно отдать функцию рисования курсора, приложению. Вот пусть он и проверяет отсечение.

    Есть и другой путь. Вывод осуществляется во временную область, а после копировать на экран. Но тут нужно делать только частичную перерисовку.
  • diamond
    Нормальный вариант. :D Кстати я там (в ядре) видел подпрограмму 'checkpixel", которая вызывается при прорисовке точек (соответственно линий и символов), она юзает буфер 'display_data' где определяется принадлежность точки процессу, к сожалению все биты заняты под номер процесса,:(
    что если увеличить размер данных точки до 2 байт и выделить бит на принадлежность точки курсору (для облегчения проверки), или не изменять буфер но для точек курсора использовать фиксированный номер процесса (номер процесса ядра например).:wink:
    Однако я не вьезжаю как осуществляется проверка при выводе рисунков и боксов, используется ли там "display_data", я так понял что там рисуется напрямую последовательностями байтов а не точками, или я ошибся? :roll:
  • Pavia
    Я думаю, нужно отдать функцию рисования курсора, приложению. Вот пусть он и проверяет отсечение.
    В принципе можно былобы использовать для особо специфических приложений со специфицескими курсорами.
    Есть и другой путь. Вывод осуществляется во временную область, а после копировать на экран. Но тут нужно делать только частичную перерисовку.
    А будет ли это быстрее:?: Но памяти сожрет больше точно. А так это вполне реализуемо в приложении, выделить буфер нужного размера, поизвращаться над ним как угодно, а потом выкинуть его 7-й функцией на экран.
  • Who is online

    Users browsing this forum: No registered users and 6 guests