LINUX.ORG.RU

Доступ к буферу окна в XServer

 


0

2

Рисую на окне через XPutImage. Если вызывать повесившись на OnDraw - мерцает, так как форма сначала показывает свою текстуру потом только дает на себе рисовать. Можно как-то получить доступ к буферу формы или вообще запретить ей рисовать свой буфер?

sudo su -c «cast Zubok»

Нашел вот это: https://tronche.com/gui/x/xlib/window/XSetWindowBackgroundPixmap.html

Не уверен, что это то что мне надо.



Последнее исправление: Edible (всего исправлений: 1)

А я тебе вроде на почту ответил. Разве не пришел ответ? Посмотри в спаме.

Что такое OnDraw? Попытка рисовать при помощи xlib поверх тулкита?

Zubok ★★★★★
()
Ответ на: комментарий от i-rinat

Backing Store вряд ли. К тому же, его наличие вообще не гарантируется иксами. Я предполагаю, что автор внутри какого-то тулкита, у которого своя буферизация для отрисовки присутствует, пытается рисовать при помощи xlib. Практически любой современный тулкит использует теневые pixmap и только потом из них рисует на экран, а XPutImage сразу из XImage с клиента рисует на экране. Иначе что такое за событие OnDraw? В xlib только Expose есть.

Zubok ★★★★★
()
Последнее исправление: Zubok (всего исправлений: 1)
Ответ на: комментарий от Zubok

Да, действительно, «OnDraw» — это очень странно.

Но backing store всё равно можно использовать как детектор. В тулкитах до настроек backing store не так-то просто добраться, если вообще возможно.

i-rinat ★★★★★
()
Ответ на: комментарий от Zubok

Пардон, под Ondraw я имел в виду Expose. Все время забываю, как оно именуется в иксах.

Если BackingStore не вариант - то что вариант?

Edible
() автор топика
Ответ на: комментарий от Zubok

Приложение - голые иксы, дело под xfwm.

Edible
() автор топика
Ответ на: комментарий от Edible

Пардон, под Ondraw я имел в виду Expose. Все время забываю, как оно именуется в иксах.

Тогда что же он перерисовывает под твоим XImage? Что под ним находится и кто это все нарисовал? Вот на этот вопрос ответь.

И вот мой ответ в письме, если оно не пришло:

Не знаю, как именно все сделано сейчас, но лучше сделать свою double buffering. То есть сначала свое изображение XImage класть на серверный pixmap при помощи XPutImage, а потом уже давать команду на копирование XCopyArea из pixmap на window. Сейчас так и делается или XPutImage сразу в окно?

Причем можно копировать только ту область, которая пришла в Expose, а не все окно. И еще почитай по поводу Expose event compression где-нибудь, чтобы не пересказывать.

Backing store (если выставишь при создании окна) лишь только сократит количество событий Expose.

Zubok ★★★★★
()
Ответ на: комментарий от Zubok

Вообще нет предположений, кто рисует - фон просматривается белый. Также его видно если я ничего не нарисовал на форме и вообще не трогал ее пиксмап.

Письмо не пришло.

Сейчас так - подписан на Expose, по срабатыванию кладу свой текстурированный «фон» на окно с помощью XPutImage.

Edible
() автор топика
Ответ на: комментарий от Zubok

Я понял, что происходит - сам же этот белый и выставил:

    window.data.wdg.ext.win.window = XCreateSimpleWindow(
        warehouse.screen.display, warehouse.elem[root].data.wdg.ext.win.window,
        geometry.position.x, geometry.position.y,
        geometry.size.x,     geometry.size.y,
        borderwidth,
        XBlackPixel(warehouse.screen.display, warehouse.screen.activescreen),
        XWhitePixel(warehouse.screen.display, warehouse.screen.activescreen));
Есть возможность что-то с этим поделать? чтобы оно не рисовало свой фон, а использовало только то, что я попрошу?

Edible
() автор топика
Ответ на: комментарий от Zubok

И еще почитай по поводу Expose event compression где-нибудь, чтобы не пересказывать.

По поводу этого читал http://www.rahul.net/kenton/perf.html#ExposeHandling , всвязи с чем вставил такую вещь (первые две строки):

void mainExpose(XEvent event)
{
    /* Filter unnecessary expose events */
    if (event.xexpose.count > 0) return;

    SmlEventStruct data;
    SML_NULL(data);
    SML_CHECK(SmlWhsWindowFind(event.xany.window, &data.window));

    data.artificial = event.xexpose.send_event;
    data.index      = event.xexpose.count;

    mainProcessEvent(SML_EVENT_WINDOWREDRAW, data);
}

Количество отрисовочных эвентов снизилось раз в десять при ресайзе окна. Но все равно есть мерцание белого фона за моей текстурой.

Edible
() автор топика
Ответ на: комментарий от Edible

Есть возможность что-то с этим поделать? чтобы оно не рисовало свой фон, а использовало только то, что я попрошу?

Ни рисовать фон. background_pixmap в None, атрибут background_pixel не объявлять. Фона просто не будет. Да и надо понимать, что XPutImage относительно медленная операция. Буферизации же никакой нет - картинка из сети (сокета) прямо во фреймбуфер идет. Пока ты сам буферизацию не сделаешь.

По поводу этого читал http://www.rahul.net/kenton/perf.html#ExposeHandling , всвязи с чем вставил такую вещь (первые две строки):

Последний абзац как раз про это, что я в письме и сказал и выше процитировал.

Zubok ★★★★★
()
Последнее исправление: Zubok (всего исправлений: 2)
Ответ на: комментарий от Zubok

атрибут background_pixel не объявлять. Фона просто не будет.

Но параметр ведь в функции обязательный. Да и что-то вроде XNoPixel как-то не видится. Пробовал ставить None, результат как если бы я поставил XBlackPixel - мерцает с черным фоном.

По поводу скорости XPutImage - на моем слабеньком процессоре (равно как и на еще более старом ноутбуке 2000го года выпуска хватает кадров на 30-50 в секунду на 800х600, большего мне пока не надо, прижмет - добавлю логику с пиксмапами. Мерцает же не из-за этого?

Edible
() автор топика
Ответ на: комментарий от Edible

Мерцает же не из-за этого?

Ну, почему не из-за этого? Если ты будешь делать вот так прямолинейно, то у тебя всегда будет видно, как рисуется фон, потом твоя картинка. А если ты фон нарисуешь в пиксмап, а потом поверх картинку (можно умно придумать и не полноразмерный пиксмап аллокейтить), и копировать из теневого пиксмапа только ту область, которую прислало событие Expose (там есть параметр в событии с регионом), то все будет норм. Ты видел подобное мигание в GTK или Qt?

https://developer.gnome.org/gtk3/stable/chap-drawing-model.html#double-buffering

Zubok ★★★★★
()
Последнее исправление: Zubok (всего исправлений: 1)
Ответ на: комментарий от Zubok

Спасибо! Так не мерцает мерзким фоном. Правда теперь видно как кое-что другое мерцает, но я думаю это поправить другим методом. Большое Вам спасибо.

P.S. Интересно, все-таки, почему Ваше письмо не пришло. Вроде ж mail.ru -> gmail.com не должно быть проблем.

Edible
() автор топика
Ответ на: комментарий от Edible

P.S. Интересно, все-таки, почему Ваше письмо не пришло. Вроде ж mail.ru -> gmail.com не должно быть проблем.

Я отвечал с другого домена. Вот и не пришло. Хотя странно, так как я пишу часто на gmail - вседоходит. Может, фильтры по-разному настроены у всех? Вот и забанил. В спаме тоже нет?

Zubok ★★★★★
()
Ответ на: комментарий от Edible

Насколько я помню, ты пишешь тулкит какой-то. Вроде он у тебя принципиально все делает на стороне клиента. По сути он у тебя только готовые картинки передает с виджетами. Так вроде? Но все равно XPutImage медленная операция. На локальной машине рекомендую проверять наличие MIT-SHM и кидать не через сокет, а через shared memory, если расширение есть. И XCopyArea гораздо быстрее скопирует область, чем XPutImage. Пока картинка будет бежать по сокету, кое что уже успеет нарисоваться - не факт, что заметишь одноразово, но если все быстро меняться будет на экране, то уже можно будет заметить. Через MIT-SHM можно кинуть и на pixmap, и в окно на экране.

Zubok ★★★★★
()
Последнее исправление: Zubok (всего исправлений: 1)
Ответ на: комментарий от Zubok

Я, если честно, так и не нашел нормальное руководство, как включить MIT-SHM. Только пара строк там, что оно есть, пара строк тут, что оно хорошо. И все.

Да, таки в спаме: «Почему это письмо попало в папку „Спам“? Оно похоже на сообщения, которые фильтры ранее распознавали как нежелательные.»

Edible
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.