Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.05.27;
Скачать: 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 вся ветка

Текущий архив: 2007.05.27;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.048 c
15-1177753386
McSimm_
2007-04-28 13:43
2007.05.27
Приглашаются желающие помочь


8-1158065921
NeyroSpace
2006-09-12 16:58
2007.05.27
Помогите разобраться с ф-цией ICCompress()


1-1174929830
Express
2007-03-26 21:23
2007.05.27
Как программно закрыть 1С:Предприятие?


3-1173464588
databaser
2007-03-09 21:23
2007.05.27
Многокритериальный поиск


15-1177441862
koha
2007-04-24 23:11
2007.05.27
Реально, занимается ли кто фотографиями?