Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Мультимедия, OpenGL/DirectX > в Windows 7 изменилась стратегия отрисовки окон


Автор: igoootm 31.10.2013, 11:51
это можно назвать вертикальной синхронизацией... но пока даже не понятно где инфу нарыть...
на ixbt в одной теме обмолвились, что это такая особенная технология у майкрософтов теперь - общий видео буфер для десктопа, который формируется по особенной стратегии.
для аэро это да, это понятно, но почему-то и классический интерфейс стал гораздо менее ровным для отрисовки с заданой частотой. терпимо, но тож не приятно, оно ж было в порядке...

проблема возникает с контролем fps, с плавностью отрисовки. при использовании обычного bitblit - инга.
он теперь происходит неровно, начиная примерно с 30-ти кадров в секунду. 
это конечно затрагивает только софтварные рендеры и т.п. 

OpenGL и DirectX - там все нормально. это естественно.

вот тест: http://www.nemehanika.ru/cg/download/test.exe
на XP идет сверх плавно, внутри программы никаких неучтенных потерей времени нет. слева отрисовывается время расчетов, справа время простоя. ну это не важно... главное: что-то испортилось с новой версией винды и пока не понятно, что с этим делать?

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

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

Автор: Alexeis 1.11.2013, 10:06
  Насколько я помню, чтобы правильно рисовать GDI графику нужно это делать только при получении сообщения WM_PAINT, а простимулировать появление этого сообщения можно вызовом InvalidateRect (например по таймеру) с указанием области, которую нужно перерисовать. Если рисовать в любое другое время, то можно столкнуться с тем, что свое рисование пересечется с виндовым и в некоторый момент времени будет частично отрисована своя картинка, частично фон. Кроме того, если окно не владеет контектстом, то он может стать невалидным и рисование прервется. По идее, если вы будете рисовать в WM_PAINT, то поведение будет одинаковым на всех системах при условии, что окно создается везде с одинаковыми стилями. 

Автор: igoootm 1.11.2013, 11:51
это проверил уже, да. эффект тот же самый, увы...

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

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

Автор: Alexeis 1.11.2013, 15:09
Цитата(igoootm @  31.10.2013,  12:51 Найти цитируемый пост)
т.е. формально блитинг происходит, а фактически задерживается и на солидный промежуток времени. словно у десктопа есть своя частота обновления.  но как это сратстается с тем, что у окон тоже свои могут быть частоты обновления?

  Ну при включенном Аеро, насколько я понимаю, каждое окно имеет свой буфер, поскольку окна накладываются с прозрачностью, то винда должна отрисовывать окна слоями. Теперь нельзя отрисовать свой только свое окно, чтобы не перерисовывались другие окна.
  В случае если аеро выключен, то необходимость в полной перерисовке также может возникнуть. Например в ситуации, когда есть несколько стоящих друг поверх друга слоистых окон (окна с прозрачностью) . Вероятно такая ситуация плохо работала на ХР и ее поправили.

Автор: igoootm 1.11.2013, 18:52
ага, это называется поправили)))...

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

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

Может дело и не в аэро, а некой промежуточной надстройке над классическим режимом. нифига инфы пока не нашлось...  

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)