![]() |
Модераторы: gambit, Partizan |
![]() ![]() ![]() |
|
CyraxZ |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 251 Регистрация: 10.12.2006 Репутация: нет Всего: нет |
Создаётся форма. На ней (или на панели) что-то рисуем. Затем перетаскиваем форму за пределы экрана, затем выдвигаем обратно. При этом скрытая часть формы/панели очищается. Требуется перерисовка. В обработчике OnPaint перерисовываем рисунок на форме/панели. Но при этом появляются страшные тормоза.
Как организовать перерисовку формы/панели без тормозов ? Т.е. необходимо плавное выдвижение формы из-за экрана и т.п. Необходимо сделать так, как это происходит в Windows. Сохранение части экрана в памяти ? Двойная буферизация ? или что-то другое... |
|||
|
||||
stab |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 1839 Регистрация: 1.1.2003 Репутация: 1 Всего: 48 |
-------------------- 6, 6, 6 - the number of the beast. |
|||
|
||||
CyraxZ |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 251 Регистрация: 10.12.2006 Репутация: нет Всего: нет |
Разве на это как-то повлияет двойная буферизация ? Собственно, на тормоза (при перерисовке в процессе выдвижения формы из-за границы экрана) двойная буферизация никак не повлияла... Как по мне, тут нужна не двойная буферизация, а сохранение в памяти скрываемой за экраном части формы (bitmap)... Как это реализовано в виндовых формах ? |
|||
|
||||
CyraxZ |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 251 Регистрация: 10.12.2006 Репутация: нет Всего: нет |
Как в стандартных формах реализована отрисовка части изображения, оказавшейся за пределами экрана, при выдвижении формы из-за экрана ?
Явно не перерисовка всех элементов формы. Как-то через сохранение bitmap'а... |
|||
|
||||
tdebugger |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 117 Регистрация: 20.1.2007 Репутация: 2 Всего: 4 |
Ну верно, рисуешь на битмапе и по мере необходимости сбрасываешь на экран.
Подмечен интересный факт: если в дотнете первой версии для безмерцательного вывода изображения лучше всего битмап с оным присваивать свойству BackgroundImage контрола, то во второй версии подойдет более логически понятный DrawImage графикса. --------------------
ТЕХНОЛОГИЯ "JAVA" НЕ ПРЕДНАЗНАЧЕНА ДЛЯ УПРАВЛЕНИЯ ЯДЕРНЫМИ УСТАНОВКАМИWindows98 License.txt |
|||
|
||||
CyraxZ |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 251 Регистрация: 10.12.2006 Репутация: нет Всего: нет |
Можно ли пустой битмап получить сразу из объекта Graphics, чтобы не вычислять размеры ?
|
|||
|
||||
Naum |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 743 Регистрация: 7.9.2005 Где: Саратов, ул. Поса дского, 298 Репутация: 1 Всего: 15 |
Нет, Graphics, в принципе, кроме хандла объекта больше ничего об объекте не знает. -------------------- У нас всего два праздника Новый год и ТЯПница. |
|||
|
||||
tdebugger |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 117 Регистрация: 20.1.2007 Репутация: 2 Всего: 4 |
Может опять чего не допонял - обычно Graphics получают из битмапа, да и размеры вычислить не долго:
--------------------
ТЕХНОЛОГИЯ "JAVA" НЕ ПРЕДНАЗНАЧЕНА ДЛЯ УПРАВЛЕНИЯ ЯДЕРНЫМИ УСТАНОВКАМИWindows98 License.txt |
|||
|
||||
Idsa |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2086 Регистрация: 5.12.2006 Где: Томск Репутация: 4 Всего: 62 |
||||
|
||||
tdebugger |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 117 Регистрация: 20.1.2007 Репутация: 2 Всего: 4 |
Так о том и речь - рисуешь на битмапе, а в OnPainte сбрасываешь его на контрол.И ни каких мерцаний и тормозов. Рисовать в памяти наверно быстрее, чем на устройстве?
--------------------
ТЕХНОЛОГИЯ "JAVA" НЕ ПРЕДНАЗНАЧЕНА ДЛЯ УПРАВЛЕНИЯ ЯДЕРНЫМИ УСТАНОВКАМИWindows98 License.txt |
|||
|
||||
Idsa |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2086 Регистрация: 5.12.2006 Где: Томск Репутация: 4 Всего: 62 |
![]() |
|||
|
||||
tdebugger |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 117 Регистрация: 20.1.2007 Репутация: 2 Всего: 4 |
...вот они последствия ООП ... вот что такое абстракция ... люди уже не различают разницы между контекстом устройства и памятью...
--------------------
ТЕХНОЛОГИЯ "JAVA" НЕ ПРЕДНАЗНАЧЕНА ДЛЯ УПРАВЛЕНИЯ ЯДЕРНЫМИ УСТАНОВКАМИWindows98 License.txt |
|||
|
||||
Alek86 |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1299 Регистрация: 30.1.2007 Где: Киев Репутация: нет Всего: 25 |
||||
|
||||
tdebugger |
|
||||||
Шустрый ![]() Профиль Группа: Участник Сообщений: 117 Регистрация: 20.1.2007 Репутация: 2 Всего: 4 |
Если .NET второй , то примерно вот так:
Не рекомендую делать это где бы то не было еще( во всяких там конструкторах-деструкторах), контекст устройства -ресурс ограниченный, его беречь надо. А рисовать соответственно так:
Так то панель. Но вся штука в том , что когда мы рисуем через Graphics какого-либо контрола, мы, по сути дела, рисуем в памяти видекарты - то что я назвал "устройством". --------------------
ТЕХНОЛОГИЯ "JAVA" НЕ ПРЕДНАЗНАЧЕНА ДЛЯ УПРАВЛЕНИЯ ЯДЕРНЫМИ УСТАНОВКАМИWindows98 License.txt |
||||||
|
|||||||
Alek86 |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1299 Регистрация: 30.1.2007 Где: Киев Репутация: нет Всего: 25 |
спасибо
Добавлено через 12 минут и 10 секунд кстати, используя этот метод, избавиться от сильного моргания не получилось. (вроде для того и рисовали). А зато, когда поставил
у своего контрола, то мерцания исчезли и без этих ухищрений. |
|||
|
||||
tdebugger |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 117 Регистрация: 20.1.2007 Репутация: 2 Всего: 4 |
Ну не обессудьте, я делюсь из жизненного опыта, а что не так, так то нюансы.
--------------------
ТЕХНОЛОГИЯ "JAVA" НЕ ПРЕДНАЗНАЧЕНА ДЛЯ УПРАВЛЕНИЯ ЯДЕРНЫМИ УСТАНОВКАМИWindows98 License.txt |
|||
|
||||
CyraxZ |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 251 Регистрация: 10.12.2006 Репутация: нет Всего: нет |
А что за мерцания у тебя были ? Когда происходили ? Кстати, двойная буферизация как работает ? Там есть какой-то промежуток времени, через который буфера свопятся или другой алгоритм ? |
|||
|
||||
Alek86 |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1299 Регистрация: 30.1.2007 Где: Киев Репутация: нет Всего: 25 |
при прорисовке поля игры при щелчке мышкой на нем (на поле добавлялась точка) я вызывал invalidate и update (позже перешел на refresh, ибо первый способ не всегда работал). вот тогда все и мерцало. Ну, и при ресайзе тоже.
наверное, все рисуется в памяти, а потом сразу свопится. |
|||
|
||||
CyraxZ |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 251 Регистрация: 10.12.2006 Репутация: нет Всего: нет |
А вызывал ты Invalidate без параметров ? И где ты рисовал - на Graphics или на bitmap'е ?
Ничего не понял. Здесь у тебя создаётся bitmap и его Graphics. Далее рисуем эллипс на Graphics, то бишь на bitmap'е, и перерисовываем... Вопрос: что здесь перерисовывается ? Graphics и bitmap никак не связаны с контролом panel1. И вообще я не совсем понял, что должен перерисовывать Invalidate. Рисую-то я сам - на Graphics'е, полученном из контрола, либо на bitmap'е, который я потом сам должен скидывать на контрол через его graphics. Т.е. сейчас я в обработчике OnPaint скидываю bitmap на панель - это в UI-потоке. В то же время в потоке таймера периодически требуется обновить какую-либо область панели. Вот здесь не совсем понятно, что делать. До настоящего момента я вручную перерисовывал эту область через Graphics панели (перерисовка происходила через Invoke в UI-потоке). Теперь, если использовать bitmap, нужно на нём перерисовать изменённую область и скинуть этот битмэп на контрол. Но это делать нужно в UI-потоке во избежание одновременного доступа к контролу, т.е. опять использовать Invoke... |
||||
|
|||||
Alek86 |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1299 Регистрация: 30.1.2007 Где: Киев Репутация: нет Всего: 25 |
рисовать на битмапе нужно в методе OnPaint
и вообще, рисуй на панели в OnPaint, но поставь у нее (панели) DoubleBuffered = true ![]() |
|||
|
||||
Experimenter |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 430 Регистрация: 8.5.2007 Где: Уфа Репутация: 1 Всего: 17 |
А вот интересный момент: раньше советовали для устранения мерцаний в конструкторе объявлять:
Недавно пришлось свой контрол рисовать, вставил вышеупомянутую строчку, так его вообще на форме не видно. Если закомментировать строку, то все нормально. -------------------- public Zlo FromTwoEvilsChooseSmaller(Zlo zlo1, Zlo zlo2){ if(zlo1 < zlo2) return zlo1; else if(zlo1 > zlo2) return zlo2; else throw new Exception("Kill yourself by the wall"); } |
|||
|
||||
CyraxZ |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 251 Регистрация: 10.12.2006 Репутация: нет Всего: нет |
И тут же скидывать bitmap на панель ? Тогда толку от bitmap'а ? У меня следующая ситуация. На панели происходит перерисовка в следующих двух случаях: 1. Когда изменяется состояние (для дискретных сигналов) или значение (для аналоговых сигналов) элемента, я его (и только его, не всю схему) тут же перерисовываю на панели. Перерисовка происходит посредством Invoke(), посему выполняется в UI-потоке. Здесь у меня никаких проблем с тормозами нет. 2. Когда окно перемещается за пределы экрана, а затем выдвигается из-за него, то много раз вызывается обработчик Paint панели. В этом обработчике у меня происходит перерисовка всейсхемы. Перерисовываю я сам - поэлементно (естественно, DoubleBuffered здесь не поможет). Посему наблюдаются сильные тормоза... Как мне избавиться от тормозов во втором случае ? Судя по всему, нужно хранить уже отрисованный bitmap (например, в классе панели), а в обработчике Paint панели всего лишь скидывать этот bitmap на панель. Так ? Что касается первого случая, то там нужно при изменении элемента перерисовать на bitmap'е этот элемент, затем посредством Invoke вызвать метод Invalidate(с параметрами, где указывается область перерисоки). Но тогда проще будет через Invoke вызвать свой метод, который рисует непосредственно на Graphics панели (т.е. фактически аналог вызова Invalidate())... Как всё это лучше организовать ? |
|||
|
||||
Alek86 |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1299 Регистрация: 30.1.2007 Где: Киев Репутация: нет Всего: 25 |
толк, как я понимаю, в том, что все "прорисовывается" в памяти, а не во время рисования формы, то есть очень быстро. а все-же, попробуй поставь DoubleBuffered, ибо, если я тебя правильно понял, он-то тут как раз и нужен |
|||
|
||||
CyraxZ |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 251 Регистрация: 10.12.2006 Репутация: нет Всего: нет |
DoubleBuffered у меня стоит. Но это свойство у формы. Я же рисую на панели. Впрочем, свойство, возможно, распространяется на прорисоку и всех его контролов. DoubleBuffered не поможет, когда я сам все элементы по очереди отрисовываю на панели. У меня как раз такой случай. Я должен сам делать двойную буферизацию - собственно, через промежуточный image и есть такая буферизация (рисую на image и скидываю махом на панель). Насколько я понял, метод Invalidate элементарно вызывает обработчик Paint... |
|||
|
||||
tdebugger |
|
||||||||||||
Шустрый ![]() Профиль Группа: Участник Сообщений: 117 Регистрация: 20.1.2007 Репутация: 2 Всего: 4 |
SetStyle(ControlStyles.OptimizedDoubleBuffer, true); - то же самое, что DoubleBuffer=true; Кроме этого могут быть полезны следующие установки:
--------------------
ТЕХНОЛОГИЯ "JAVA" НЕ ПРЕДНАЗНАЧЕНА ДЛЯ УПРАВЛЕНИЯ ЯДЕРНЫМИ УСТАНОВКАМИWindows98 License.txt |
||||||||||||
|
|||||||||||||
CyraxZ |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 251 Регистрация: 10.12.2006 Репутация: нет Всего: нет |
Изображение, которое я рисую на форме (на панели) будет перерисовываться вместе с самой формой при выдвигании формы из-за экрана или из-за другой формы ? Если да, то никакие битмапы мне не понадобятся, поскольку только из-за этого я и ввёл битмапы... |
|||
|
||||
tdebugger |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 117 Регистрация: 20.1.2007 Репутация: 2 Всего: 4 |
Каждый контрол сам по себе перерисовывается...
--------------------
ТЕХНОЛОГИЯ "JAVA" НЕ ПРЕДНАЗНАЧЕНА ДЛЯ УПРАВЛЕНИЯ ЯДЕРНЫМИ УСТАНОВКАМИWindows98 License.txt |
|||
|
||||
CyraxZ |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 251 Регистрация: 10.12.2006 Репутация: нет Всего: нет |
У меня форма/панель при выдвигании из-за экрана или из-за другой формы не перерисовывается - остаётся белое пространство... |
|||
|
||||
tdebugger |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 117 Регистрация: 20.1.2007 Репутация: 2 Всего: 4 |
Тяжелый случай. После чего это произошло?
Да и на счет контрола повторюсь, даже если кода минимум, все равно удобно... --------------------
ТЕХНОЛОГИЯ "JAVA" НЕ ПРЕДНАЗНАЧЕНА ДЛЯ УПРАВЛЕНИЯ ЯДЕРНЫМИ УСТАНОВКАМИWindows98 License.txt |
|||
|
||||
CyraxZ |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 251 Регистрация: 10.12.2006 Репутация: нет Всего: нет |
А всегда так было - от самого начала и до самого конца. При выдвигании сама форма-то перерисовывается, а то, что я сам до задвигания формы за экран рисовал, - не перерисовывается. Приходится самому... в OnPaint'е... Ну так SetStyle(ControlStyles.UserPaint, true); не решит эту проблему ?
Именно. Но сейчас уже поздно. Вот если бы сразу такую мысль... Это сообщение отредактировал(а) CyraxZ - 31.8.2007, 17:49 |
||||
|
|||||
tdebugger |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 117 Регистрация: 20.1.2007 Репутация: 2 Всего: 4 |
Вот зря я с тобой мучился...про контексты рассказывал...
Все, что нарисовано в окне (форме, контроле), есть содержимое памяти видеоадаптера (чуть не сказал монитора- вот бы дал повода для смеха...), то есть, если мы задвинули окно за пределы монитора, то его изображение теряется из-за отсутствия памяти ТАМ, а когда перекрыли другим окном - соответственно преписали память содержимым ТОГО окна. К счастью нам не нужно беспокоиться о перемещении участков памяти при передвигании окна, это работа системы, а вот восстановление потерянного изображения - уже наша забота. Скинуть заранее приготовленный битмап или нарисовать все заново - это зависит от требований оптимизации, но без обработчика сообщения WM_PAINT не обойтись никак... SetStyle(ControlStyles.UserPaint, true); - устраняет прорисовку фона(перекрывает WM_ERASEBKGND). Ну это уже в конце подбирается, когда все готово, помогло - хорошо, нет - обратно закомментировать, потому как оптимизация графики, вещь сугубо индивидуальная и 100%-го рецепта на эту тему нет... --------------------
ТЕХНОЛОГИЯ "JAVA" НЕ ПРЕДНАЗНАЧЕНА ДЛЯ УПРАВЛЕНИЯ ЯДЕРНЫМИ УСТАНОВКАМИWindows98 License.txt |
|||
|
||||
CyraxZ |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 251 Регистрация: 10.12.2006 Репутация: нет Всего: нет |
Ну так ОС же сама перерисовывает изображение под курсором мыши. Почему бы ей не перерисовывать его для случая другого окна. Какая разница - курсор мыши или другое окно - всё равно перерисовывать нужно. В случае с курсором перерисовывает, а в случае с другим окном - нет. Не совсем логично... |
|||
|
||||
mr.DUDA |
|
|||
![]() 3D-маньяк ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 8244 Регистрация: 27.7.2003 Где: город-герой Минск Репутация: 24 Всего: 232 |
Курсор - отдельная песня, у него размер более-менее небольшой и к тому же вроде как обычная видеокарта имеет аппаратную поддержку отрисовки курсора "поверх" всего. Что касается окон - каждое окно имеет область в памяти, где хранится текущее содержимое. Сохранять и восстанавливать это содержимое на каждый чих было бы заметной тратой ресурсов CPU. -------------------- ![]() |
|||
|
||||
![]() ![]() ![]() |
Прежде чем создать тему, посмотрите сюда: | |
|
Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов. Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :) Так же не забывайте отмечать свой вопрос решенным, если он таковым является :) Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Разработка Windows Forms | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |