Re[5]: Проблема с отрисовкой при resize окна
От: VladFein США  
Дата: 01.08.14 13:39
Оценка: 2 (1)
Здравствуйте, Аноним, Вы писали:

А>Ну да медленно. Фронтбуффер это и есть поверхность окна в оконном режиме или видеопамять если речь о полноэкранном режиме.

А>Вопрос о том как синхронизировать системный ресайз и отрисовку.

Ловите WM_WINDOWPOSCHANGING message, готовьте буффер ДО return;
Re[3]: Проблема с отрисовкой при resize окна
От: c-smile Канада http://terrainformatica.com
Дата: 01.08.14 00:28
Оценка: +1
Здравствуйте, Аноним, Вы писали:

CS>>
CS>>case WM_SIZE:
CS>>     // ... меняю размеры фронтбуффера и бэкбуффера под новый размер окна, перерисовываю бэкбуффер.
CS>>     ::InvalidateRect(hwnd,NULL,FALSE);
CS>>     ::UpdateWindow(hwnd);
CS>>     return 0;
CS>>


А>Никакого эффекта. Не работает.


Значит проблема у тебя где-то еще.

InvalidateRect/UpdateWindow фосирует WM_PAINT (внутри UpdateWindow). Скорее всего или бэкбуффер у тебя медленно перерисоввыется, либо ты что-то напутал с бэкбуффер / front-buffer.
Кстати непонятно вообще зачем тебе два буффера.
Проблема с отрисовкой при resize окна
От: Аноним  
Дата: 29.07.14 12:07
Оценка:
Привет,

Есть окно со стилем WS_POPUPWINDOW & ~WS_VSCROLL & ~WS_HSCROLL & ~WS_CAPTION & ~WS_MAXIMIZEBOX & ~WS_SIZEBOX & ~WS_THICKFRAME
Делаю вручную resize окна с помощью функции MoveWindow c флашком repaint == true
Отрабатываю:
— WM_SIZE: меняю размеры фронтбуффера и бэкбуффера под новый размер окна, перерисовываю бэкбуффер.
— WM_ERASEBKGND: return 1;
— WM_PAINT: ложу бэкбуффер на фронтбуффер;

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

Как исправить? Как сделать чтобы видимый ресайз windows окна происходил одновременно с отрисовкой нового фронтбуфера без лагов или пусть даже ресайз с некоторой задержкой но главное чтобы одновременно?
Re: Проблема с отрисовкой при resize окна
От: saf_e  
Дата: 29.07.14 12:17
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Привет,


А>Есть окно со стилем WS_POPUPWINDOW & ~WS_VSCROLL & ~WS_HSCROLL & ~WS_CAPTION & ~WS_MAXIMIZEBOX & ~WS_SIZEBOX & ~WS_THICKFRAME

А>Делаю вручную resize окна с помощью функции MoveWindow c флашком repaint == true
А>Отрабатываю:
А> — WM_SIZE: меняю размеры фронтбуффера и бэкбуффера под новый размер окна, перерисовываю бэкбуффер.
А> — WM_ERASEBKGND: return 1;
А> — WM_PAINT: ложу бэкбуффер на фронтбуффер;

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


А>Как исправить? Как сделать чтобы видимый ресайз windows окна происходил одновременно с отрисовкой нового фронтбуфера без лагов или пусть даже ресайз с некоторой задержкой но главное чтобы одновременно?


Это в релизе? Обычно в дебаге есть небольшие лаги...

Попробуйте WS_EX_COMPOSITED...
Re[2]: Проблема с отрисовкой при resize окна
От: Аноним  
Дата: 29.07.14 12:32
Оценка:
_>Это в релизе? Обычно в дебаге есть небольшие лаги...

Дебаг. При ресайзе окна из меньшего в большый размер — лага не наблюдается. А вот из большего размера окна в меньший выходит заметно неприятный эффект.

_>Попробуйте WS_EX_COMPOSITED...


Не годится — добавляет к окну системный заголовок и бордеры.
Re[3]: Проблема с отрисовкой при resize окна
От: saf_e  
Дата: 29.07.14 12:49
Оценка:
Здравствуйте, Аноним, Вы писали:

_>>Это в релизе? Обычно в дебаге есть небольшие лаги...


А>Дебаг. При ресайзе окна из меньшего в большый размер — лага не наблюдается. А вот из большего размера окна в меньший выходит заметно неприятный эффект.


На так, а в релизе что? Если нет бага, не вижу причин для страданий
Re[4]: Проблема с отрисовкой при resize окна
От: Аноним  
Дата: 29.07.14 12:56
Оценка:
_>На так, а в релизе что? Если нет бага, не вижу причин для страданий
Тоже самое только менее заметно. Я думал может я что то накосячил или есть выбор как вести себе окну при ресайзе — мне предпочтительнее ресайз с задержкой но чтобы видеть сразу то что нужно.
Re: Проблема с отрисовкой при resize окна
От: kero Россия  
Дата: 29.07.14 16:11
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Есть окно со стилем WS_POPUPWINDOW & ~WS_VSCROLL & ~WS_HSCROLL & ~WS_CAPTION & ~WS_MAXIMIZEBOX & ~WS_SIZEBOX & ~WS_THICKFRAME


WS_SIZEBOX и WS_THICKFRAME — одно и то же
По всему, пашиным хозяевам позарез нужна война в Европе
(уверены — к ним не залетит, в предыдущих двух не залетало жеж)
Автор: kero
Дата: 21.07.14
Re: Проблема с отрисовкой при resize окна
От: VladFein США  
Дата: 29.07.14 19:14
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Есть окно со стилем WS_POPUPWINDOW & ~WS_VSCROLL & ~WS_HSCROLL & ~WS_CAPTION & ~WS_MAXIMIZEBOX & ~WS_SIZEBOX & ~WS_THICKFRAME

А>Делаю вручную resize окна с помощью функции MoveWindow c флашком repaint == true
А>Отрабатываю:
А> — WM_SIZE: меняю размеры фронтбуффера и бэкбуффера под новый размер окна, перерисовываю бэкбуффер.
А> — WM_ERASEBKGND: return 1;
А> — WM_PAINT: ложу бэкбуффер на фронтбуффер;

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


А>Как исправить? Как сделать чтобы видимый ресайз windows окна происходил одновременно с отрисовкой нового фронтбуфера без лагов или пусть даже ресайз с некоторой задержкой но главное чтобы одновременно?


WM_SIZE приходит довольно редко.
Если нужна моментальная реакция — смотрите на WM_SIZING
Re[2]: Проблема с отрисовкой при resize окна
От: Аноним  
Дата: 29.07.14 19:34
Оценка:
VF>WM_SIZE приходит довольно редко.
Как оно может приходить чаще, чем количество вызов MoveWindow?
VF>Если нужна моментальная реакция — смотрите на WM_SIZING

MoveWindow sends the WM_WINDOWPOSCHANGING, WM_WINDOWPOSCHANGED, WM_MOVE, WM_SIZE, and WM_NCCALCSIZE messages to the window.

WM_SIZING не шлется вообще потому как нет смысла его слать.
Re[3]: Проблема с отрисовкой при resize окна
От: VladFein США  
Дата: 29.07.14 20:48
Оценка:
Здравствуйте, Аноним, Вы писали:

А>WM_SIZING не шлется вообще потому как нет смысла его слать.


Прошу прощения, прозевал "Делаю вручную resize окна с помощью функции MoveWindow".

Тогда похоже, что задержка вызвана длительной отрисовкой второго буфера? Значит, надо отрисовать его ДО MoveWindow, поскольку размер известен заранее.
Re: Проблема с отрисовкой при resize окна
От: CEMb  
Дата: 30.07.14 10:08
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Делаю вручную resize окна с помощью функции MoveWindow c флашком repaint == true


Лучше использовать SetWindowPos
Re: Проблема с отрисовкой при resize окна
От: Pavel Dvorkin Россия  
Дата: 30.07.14 12:06
Оценка:
Здравствуйте, Аноним, Вы писали:

А> — WM_PAINT: ложу бэкбуффер на фронтбуффер;


Имеется в виду, что WM_PAINT придет автоматически ? Попробуй его вызывать принудительно, то есть UpdateWindow на WM_SIZE, естественно, после переделки backbuffer. Не уверен, что поможет.
With best regards
Pavel Dvorkin
Re[4]: Проблема с отрисовкой при resize окна
От: Аноним  
Дата: 30.07.14 13:18
Оценка:
VF>Тогда похоже, что задержка вызвана длительной отрисовкой второго буфера? Значит, надо отрисовать его ДО MoveWindow, поскольку размер известен заранее.

Не универсальный метод потому как еще есть MAXIMIZE, RESTORE, MINIMIZE там я не контролирую размеры окна вместо операционной системы но в самом крайнем случае попробую взять на себя такую ответственность.
Re[2]: Проблема с отрисовкой при resize окна
От: Аноним  
Дата: 30.07.14 13:24
Оценка:
CEM>Лучше использовать SetWindowPos
Чем лучше?
Re[2]: Проблема с отрисовкой при resize окна
От: Аноним  
Дата: 30.07.14 13:37
Оценка:
PD>Имеется в виду, что WM_PAINT придет автоматически ?
Да.

PD>Попробуй его вызывать принудительно, то есть UpdateWindow на WM_SIZE, естественно, после переделки backbuffer. Не уверен, что поможет.

Не помогло.
Re[3]: Проблема с отрисовкой при resize окна
От: CEMb  
Дата: 30.07.14 16:18
Оценка:
Здравствуйте, Аноним, Вы писали:

CEM>>Лучше использовать SetWindowPos

А>Чем лучше?
Глюков с отрисовкой не бывает
Re[4]: Проблема с отрисовкой при resize окна
От: VladFein США  
Дата: 30.07.14 16:30
Оценка:
Здравствуйте, CEMb, Вы писали:

CEM>>>Лучше использовать SetWindowPos

А>>Чем лучше?
CEM>Глюков с отрисовкой не бывает

Дело, похоже, не в глюках. Просто Windows быстро перерисовывает "свою" часть, а клиент — долго.
Не понятно, что нужно перерисовывать при уменьшении размера. Масштабировать? Тогда можно на WM_ERASEBKGND не просто возвращать 1, а перерисовать прошлый буфер в нужном размере, например StretchBlt(). А потом, когда будет время, перерисовать правильно.
Re: Проблема с отрисовкой при resize окна
От: c-smile Канада http://terrainformatica.com
Дата: 30.07.14 22:03
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Привет,


А> — WM_SIZE: меняю размеры фронтбуффера и бэкбуффера под новый размер окна, перерисовываю бэкбуффер.

А> — WM_ERASEBKGND: return 1;
А> — WM_PAINT: ложу бэкбуффер на фронтбуффер;


case WM_SIZE:
     // ... меняю размеры фронтбуффера и бэкбуффера под новый размер окна, перерисовываю бэкбуффер.
     ::InvalidateRect(hwnd,NULL,FALSE);
     ::UpdateWindow(hwnd);
     return 0;
Re[5]: Проблема с отрисовкой при resize окна
От: CEMb  
Дата: 31.07.14 02:51
Оценка:
Здравствуйте, VladFein, Вы писали:

CEM>>>>Лучше использовать SetWindowPos

А>>>Чем лучше?
CEM>>Глюков с отрисовкой не бывает

VF>Дело, похоже, не в глюках. Просто Windows быстро перерисовывает "свою" часть, а клиент — долго.

VF>Не понятно, что нужно перерисовывать при уменьшении размера. Масштабировать? Тогда можно на WM_ERASEBKGND не просто возвращать 1, а перерисовать прошлый буфер в нужном размере, например StretchBlt(). А потом, когда будет время, перерисовать правильно.

Ничё не понял но у нас были проблемы с перерисовкой, с MoveWindow, с уменьшением окна, со следами под окном. Решилось просто заменой на SetWindowPos.
Re[2]: Проблема с отрисовкой при resize окна
От: Аноним  
Дата: 31.07.14 10:43
Оценка:
CS>
CS>case WM_SIZE:
CS>     // ... меняю размеры фронтбуффера и бэкбуффера под новый размер окна, перерисовываю бэкбуффер.
CS>     ::InvalidateRect(hwnd,NULL,FALSE);
CS>     ::UpdateWindow(hwnd);
CS>     return 0;
CS>


Никакого эффекта. Не работает.
Re[4]: Проблема с отрисовкой при resize окна
От: Аноним  
Дата: 31.07.14 10:49
Оценка:
CEM>Глюков с отрисовкой не бывает

Заменил MoveWindow на SetWindowPos таким вот образом:
::SetWindowPos(get_hwnd(), NULL, get_desktop_left(), get_desktop_top(), get_width(), get_height(), SWP_NOZORDER);

Не помогло. Глюк с отрисовкой остался.
Re[5]: Проблема с отрисовкой при resize окна
От: Аноним  
Дата: 31.07.14 10:55
Оценка:
VF>Дело, похоже, не в глюках. Просто Windows быстро перерисовывает "свою" часть, а клиент — долго.
VF>Не понятно, что нужно перерисовывать при уменьшении размера. Масштабировать? Тогда можно на WM_ERASEBKGND не просто возвращать 1, а перерисовать прошлый буфер в нужном размере, например StretchBlt(). А потом, когда будет время, перерисовать правильно.

Мысль интересная, надо будет попробовать — возможно это наименьшее зло в данном случае.
Re[4]: Проблема с отрисовкой при resize окна
От: Pavel Dvorkin Россия  
Дата: 31.07.14 12:08
Оценка:
Здравствуйте, VladFein, Вы писали:

VF>Тогда похоже, что задержка вызвана длительной отрисовкой второго буфера?


Это можно легко проверить, заменив настоящую отрисовку фиктивной, работающей максимально быстро
With best regards
Pavel Dvorkin
Re[3]: Проблема с отрисовкой при resize окна
От: Pavel Dvorkin Россия  
Дата: 31.07.14 14:35
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Не помогло.


Покажи обработчик WM_PAINT
With best regards
Pavel Dvorkin
Re[5]: Проблема с отрисовкой при resize окна
От: CEMb  
Дата: 01.08.14 06:17
Оценка:
Здравствуйте, Аноним, Вы писали:

CEM>>Глюков с отрисовкой не бывает


А>Заменил MoveWindow на SetWindowPos таким вот образом:

А>
А>::SetWindowPos(get_hwnd(), NULL, get_desktop_left(), get_desktop_top(), get_width(), get_height(), SWP_NOZORDER);
А>

А>Не помогло. Глюк с отрисовкой остался.

А можно код, чтоб у себя посмотреть?
Re[4]: Проблема с отрисовкой при resize окна
От: Аноним  
Дата: 01.08.14 11:10
Оценка:
CS>InvalidateRect/UpdateWindow фосирует WM_PAINT (внутри UpdateWindow). Скорее всего или бэкбуффер у тебя медленно перерисоввыется, либо ты что-то напутал с бэкбуффер / front-buffer.
CS>Кстати непонятно вообще зачем тебе два буффера.

Ну да медленно. Фронтбуффер это и есть поверхность окна в оконном режиме или видеопамять если речь о полноэкранном режиме.
Вопрос о том как синхронизировать системный ресайз и отрисовку.
Re[4]: Проблема с отрисовкой при resize окна
От: Аноним  
Дата: 01.08.14 11:16
Оценка:
PD>Покажи обработчик WM_PAINT
BeginPaint(get_hwnd(), &paint_struct);        
video->present(); //в недрах библиотек это Blt бэкбуффера на фронтбуффер.
EndPaint(get_hwnd(), &paint_struct);
Re[6]: Проблема с отрисовкой при resize окна
От: Аноним  
Дата: 01.08.14 11:21
Оценка:
CEM>А можно код, чтоб у себя посмотреть?
Нет конечно, проект до 500Mb под NDA
Re[5]: Проблема с отрисовкой при resize окна
От: Pavel Dvorkin Россия  
Дата: 01.08.14 11:52
Оценка:
Здравствуйте, Аноним, Вы писали:

А>[ccode]

А>BeginPaint(get_hwnd(), &paint_struct);
А>video->present(); //в недрах библиотек это Blt бэкбуффера на фронтбуффер.
А>EndPaint(get_hwnd(), &paint_struct);

Что понимается здесь под фронтбуффером ? Здесь должен быть BitBlt с бэкбуфера на hdc от BeginPaint, это так ? И ничего больше быть не должно.
With best regards
Pavel Dvorkin
Re[6]: Проблема с отрисовкой при resize окна
От: Аноним  
Дата: 01.08.14 12:24
Оценка:
PD>Что понимается здесь под фронтбуффером ? Здесь должен быть BitBlt с бэкбуфера на hdc от BeginPaint, это так ? И ничего больше быть не должно.
По сути так и есть. фронтбуффер это и есть поверхность окна в оконном режиме.
Re[7]: Проблема с отрисовкой при resize окна
От: Pavel Dvorkin Россия  
Дата: 01.08.14 12:42
Оценка:
Здравствуйте, Аноним, Вы писали:

PD>>Что понимается здесь под фронтбуффером ? Здесь должен быть BitBlt с бэкбуфера на hdc от BeginPaint, это так ? И ничего больше быть не должно.

А>По сути так и есть. фронтбуффер это и есть поверхность окна в оконном режиме.

Замени video->present() на нечто простое. Например, Rectangle(hdc_от_hWnd, весь размер) с рандомным цветом заливки прямоугольника. Эффект останется ?
With best regards
Pavel Dvorkin
Re: Вопрос закрыт
От: Аноним  
Дата: 01.08.14 13:43
Оценка:
Здравствуйте, Аноним, Вы писали:

Повесил на WM_ERASEBKGND: StretchBlt в итоге не обрезает изображение но теперь присутствует эффект дергания так как меняется масштаб видимых объектов вместо угла видимого обзора. Но все же это терпимее чем тупое обрезание.
Заморозить видимость системного ресайза окна до момента полной перерисовки окна я так понял нереально.
Re[2]: UPD: Вопрос закрыт
От: Аноним  
Дата: 01.08.14 17:23
Оценка:
А>Заморозить видимость системного ресайза окна до момента полной перерисовки окна я так понял нереально.
Благодаря совету здесь
Автор: VladFein
Дата: 01.08.14
это реализовать удалось!
Re[3]: UPD: Вопрос закрыт
От: VladFein США  
Дата: 11.08.14 13:45
Оценка:
Здравствуйте, Аноним, Вы писали:

А>>Заморозить видимость системного ресайза окна до момента полной перерисовки окна я так понял нереально.

А>Благодаря совету здесь
Автор: VladFein
Дата: 01.08.14
это реализовать удалось!



Теперь надо оптимизировать саму отрисовку, т.к. этим способом Вы задерживаете ВСЮ очередь!
Покажете?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.