Вниз
Скачать: CL | DM;

Мерцает от перемещения Виндовых окон.   Найти похожие ветки 

← →
@!!ex ©   (2006-07-04 18:20) [0]

Суть проста. OPenGL приложение.
Все красиво, супер и т.д.
Но стоит начать работать с каким нибудь виндовым окном(менять размер. позицию на экране), не сворачивая мой проект, как он начинает мерцать. Неприятно. Как можно попробовать решить эту порблему?


← →
Rial ©   (2006-07-04 18:30) [1]

Так оно это, перерисовывается так.
Наиболее удобный выход - ловить события активации и деактивации формы и
хранить флаг, активна ли сейчас форма. Перерисовывать только активную форму.
А еще лучше - своричивать при деактивации.

Но, надо сказать, такое возможно только на слабом компе или с длительной
процедурой прорисовкой окна.
У тебя двойная буферизация включена ?
Ты на API пишешь, или с формой ?


← →
@!!ex ©   (2006-07-04 18:44) [2]

>>Наиболее удобный выход - ловить события активации и деактивации формы и
хранить флаг, активна ли сейчас форма. Перерисовывать только активную форму.
А еще лучше - своричивать при деактивации.

Не катит. поскольку суть как раз в том, что можно в бэкграунде отслеживать изменения. Тоетсь работаешь в другом приложении, и краем глаза смотришь, что здесь проиходит.

>>Но, надо сказать, такое возможно только на слабом компе или с длительной процедурой прорисовкой окна.

Комп не топовый, но и не отстой.

>>У тебя двойная буферизация включена ?

Да.

>>Ты на API пишешь, или с формой ?
Кстати, да. Открыл Сишный WinAPI проект... Такого нет....
Как можно исправить под дельфей? Очень не хочеться отказывать от формы, хоть компонентов и не использую, переписывание сулит большие проблемы.... А проект завтра желательно показать генеральному и с главным программером детали желательно на работающем проекте обсуждать... :\


← →
Cash ©   (2006-07-04 19:36) [3]

Перерисовка по таймеру происходит?
Или через WM_PAINT (OnPaint событие)?

Если по таймеру, то не по стандартному ли? (т. е. таймер не из System закладки?)
Если да, то его в топку, потом брать какойньть хороший таймер, а еще
лучше - с OnIdle событием Application-а работать.


← →
@!!ex ©   (2006-07-04 19:49) [4]

Через message WM_PAINT. Только очередная перерисовка происходит только после того, как SwapBuffer предыдущий отработает.
ОнИдл не катит, потому что многое висит на событиях. Сеть в частности.
ProcessMessages -  слишком тормозит все.
Сейчас отрисовываеться все и вызываеться InvalidateRect


← →
Cash ©   (2006-07-04 20:00) [5]

А я что то говорил о ProcessMessages???
Глюконафтика у тебя и идет от юзания WM_PAINT сообщения, от него надо
отказываться!
И надо глядеть обоими глазами в сторону OnIdle события, пофигу, что
все остальное тоже на событиях виси, ничего от этого не поменяется!

В OnIdle событии, чтоб оно обновлялось почаще, первой строкой ставь
Done:=false, это скажет, что мы еще не закончили. Но при этом ничего
сверхестественного с остальной средой не случится, ты только отрисовку
туда засунь, ведь в ней весь рамс!


← →
DarkEagle   (2006-07-04 20:15) [6]

А что за событие такое, которое вы здесь описываете? OnIdle?
Ну на API это понятно как реализуеться, а на дельфе как?


← →
Cash ©   (2006-07-04 20:34) [7]

OnIdle, событие объекта Application, срабатывает афигенно часто, если его
об этом попросить! :)
Перед заменой Application.OnIdle рекомендуется сделать бекап адреса
старого события, и вызывать его в своем.
Просят OnIdle быть побыстрее с помощью параметра Done, включаемого в
заголовок события. Коротче, Done:=false; и все.


← →
Vladimir Kladov   (2006-07-04 21:06) [8]

Мне кажется надо всего лишь перехватить WM_ERASEBKGND, сказать, что отработано, и ничего не делать. И пусть перерисовывается - но мелькать не будет.


← →
DarkEagle   (2006-07-04 22:02) [9]

Vladimir Kladov
Спасибо! Реальная тема!


← →
@!!ex ©   (2006-07-04 23:05) [10]

Через Idle придеться много кода переписывать. Ща попробую через EraseBkgnd.... Сразу надо было пробовать... как не догадался?


← →
@!!ex ©   (2006-07-04 23:06) [11]

Получилось! Только теперь мерцает кэпшен. Ну и фиг с ним. Почти не заметно. Спасибо, товарищи!


← →
Cash ©   (2006-07-05 09:39) [12]

@!!ex ©:
Рпади прикола, сделай копию проекта и в ней весь код из WM_PAINT
(или WM_ERASEBKGND) перетащи в OnIdle с вставкой только одной
команды, Done:=false;

Поэксперементируй, над копией, этого же никто не запрещает,
опыт же всегда полезен...


← →
@!!ex ©   (2006-07-05 21:39) [13]

>>опыт же всегда полезен...
Абсолютно согласен!

Попробую!



Страницы: 1 вся ветка

Скачать: CL | DM;



Память: 0.48 MB
Время: 0.034 c
2-1178285357
Ega23
2007-05-04 17:29
2007.05.27
Проблема выхода из приложения


9-1151032634
$'Talker
2006-06-23 07:17
2007.05.27
Equivalent Of Death


2-1178622434
npu3pak
2007-05-08 15:07
2007.05.27
Блокировка клавиатуры, мышки и их комбинаций


15-1177676806
I-New
2007-04-27 16:26
2007.05.27
Есть GDI+ в Висте?


4-1166789398
AMS
2006-12-22 15:09
2007.05.27
функия GetModuleUsage




   Наверх