Мне нужно нарисовать линию, перемещаясь с курсором, но я хочу избежать перерисовки всего окна каждые 100 мс - PullRequest
1 голос
/ 20 декабря 2011

У меня есть программа, которая отображает линейку на экране, и с помощью Xlib она опрашивает позицию курсора каждые 100 мс и обновляет отображение.Дисплей состоит из цифр / строк и т. Д., В частности, строки, указывающей положение курсора (именно поэтому он обновляется).

Проблема заключается в том, что старую строку необходимо стереть, а содержимое под ней восстановить,поэтому я должен перерисовать все окно, чтобы отразить изменение в положении.Выполнение этого 10 раз в секунду приводит к очень мерцающей программе.

I может перерисовать линейку только после того, как я подтвердил, что курсор находится в положении для изменения линии индикатора (т.е. в пределахграницы линейки), но он все равно мерцает довольно плохо, когда он обновляется .

Вроде как нуб для GTK и Xlib, и все, любой совет будет оценен.

Код в https://github.com/zjmichen/zRuler

1 Ответ

2 голосов
/ 21 декабря 2011

Ну, вы столкнулись с одной из самых ранних проблем, с которыми столкнулись при внедрении курсоров !!Изменения курсора настолько часты, что перерисовывать полное окно каждый раз просто бессмысленно!Приходя к вашей проблеме, посмотрите, что нужно и что именно вы делаете.Нужно ли обновлять полное окно при перемещении курсора?Нет. Вам нужно обновить только часть окна, поэтому не обновляйте все окно.Вдобавок ко всему, я могу придумать 2 способа уменьшения мерцания:
1. Простой способ - использовать GdkCursor.Создайте новый курсор из растрового изображения (образец предоставлен на странице разработчика) с нужной вам формой - линия в вашем случае. Свяжите курсор с GdkWindow главного окна вашего приложения.Таким образом, вам не нужно отслеживать курсор и рисовать линию.Сам курсор будет отображаться в виде линии (так что вам не стоит беспокоиться об очистке и перерисовке).Теперь в обратном вызове таймера, где вы перерисовываете полное окно, перерисовываете только тот компонент, который должен быть обновлен при изменении позиции курсора.Надеемся, что это должно уменьшить мерцание, поскольку вы рисуете не все компоненты.
2. Если вы не хотите использовать GdkCursor, вы можете создать отдельное прозрачное окно поверх приложения.окно, предназначенное для курсора.При таком подходе вы можете обновить только окно курсора и компонент в окне приложения, которое должно обновляться при изменении позиции курсора.Таким образом, другие компоненты в окне приложения не перерисовываются каждый раз, и, надеюсь, это также должно уменьшить мерцание.
Надеюсь, это поможет!

...