![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Анимация [D6, WinXP]
Аним © (2004-07-27 19:09:00)Вопрос общего плана:
Как можно сделать анимацию наиболее плавно?
Чтоб при передвижении объекта не было мельканий (при стирании и рисовки заново)?
Но с учетом того, что задний фон динамически меняется..
нужно любое:
алгоритм на словах.. основные функции.. в общем, любые мысли..
кто то ведь с этим уже сталкивался..
спасибо.
parovoZZ (2004-07-30 11:29:00) [1]Короче, надо на форму изображение переносить за один приём. Тогда мерцаний не будет.
MegaVolt (2004-07-30 09:58:00) [2]Вот решил выложить пример отрисовки с мерцание и без. Простенько рисую на канве. Без мерцания исспользую двойную буферизацию :) http://webfile.ru/34572
Аним (2004-07-30 00:16:00) [3]
> независимо как, независимо на чём, без буфера мелькания
> были, есть и будут. Вывод: надо делать буфер.
Какой же буфер при работе с регионами?! Если ты о двойном, то он, понятно, нужен за тем, чтоб не было мельканий при анимации с конкретным фоном..
А тут.. ведь регион подрезает окно по границам изображения, после чего все что нужно - тупо наложить поверх свою графику..
Фон автоматически отпадает - о нем заботиться не надо..
а в буфер что загонять?! ну еси тока эту "однослойную" графику..
или не так?
p.s. код joffa не смотрел, но там точно ети регионы. Да он и всегда поверх остальных окон..
В овцах - точно нет (не регионы).
там как раз работа с дискриптором рабочего стола (это сложнее)..
берут кусочек его перед тем как себя нарисовать.. и используют как фон..
обновляют только когда поверх их окна проходит чужое или при получении фокуса своего..
при этом обновлении жуткое мерцание: себя скрывают, берут фон и опять себя рисуют..
это я так.. )
при работе с регионами - ну ессественно мельканий (заметных) нет..
без всяких там буферов.. ))
Огромное Кулясищще (2004-07-29 23:34:00) [4]> Докладываю: в ходе испытаний было выяснено, что действительно, независимо как, независимо на чём, без буфера мелькания были, есть и будут. Вывод: надо делать буфер.
Либо выкладывай код, либо читай начало поста Огромное Кулясищще © (29.07.04 20:47) [33].
parovoZZ (2004-07-29 23:17:00) [5]
> но разве в паузу между изменением региона окна и выводом
> на измененный регион графики не произойдет мелькания?..
>
> Или просто при изменении региона...
> Тут никакая буферизация не поможет...
Если отлавливать необходимые сообщения, то мельканий можно избежать, что я и сделал. Но я ненавижу VCL. Причин много, но не об этом речь.
> Огромное Кулясищще © (29.07.04 22:32) [35]
> >А подробнее можно? Сейчас попробую. О результатах доложу.
>
> Меняй, например, в OnPaint.
Уже сказал.
> Аним (29.07.04 20:44) [32]
> Блиин.. а что, DelphiX тока для пятых делфей?
> Выше нет негде?
Есть, у меня для 6-ой стоит на 7-ой делфе. Но не советую использовать из-за примитивности. Я себе поставил только лишь чтобы сорцы чужие изучать.
> о результатах доложу
Докладываю: в ходе испытаний было выяснено, что действительно, независимо как, независимо на чём, без буфера мелькания были, есть и будут. Вывод: надо делать буфер.
Но я не понял: почему же Joffa мелькает, а мой скринмэйт нет? Хотя оба они используют регионы.
//Своего скринмэйта пока не выкладываю, доделываю интерфейс и физику надо подправить.
Аним (2004-07-29 22:52:00) [6]Я менял по таймеру и использовал компонент TDIBFormShaper...
(для получения HRGN с исключением нужного цвета из битмапа)
мельканий не заметил...
p.s.
я предпологал, что когда у формы изменится регион, а новая картинка еще не наложится, этот момент будет заметен..
ан, нет.. ))
хотя может от загрузки ЦП это немного зависит..
Огромное Кулясищще (2004-07-29 22:32:00) [7]> А подробнее можно? Сейчас попробую. О результатах доложу.
Меняй, например, в OnPaint.
parovoZZ (2004-07-29 22:05:00) [8]> Если менять реагион тогда, когда надо - никакие мелькания не возникнут.
А подробнее можно? Сейчас попробую. О результатах доложу.
Огромное Кулясищще (2004-07-29 20:47:00) [9]Косячки курить - это плохо. Так вот, по делу. Если менять реагион тогда, когда надо - никакие мелькания не возникнут.
Аним (2004-07-29 20:44:00) [10]Блиин.. а что, DelphiX тока для пятых делфей?
Выше нет негде?
Аним (2004-07-29 20:36:00) [11]
> могу лишь только посоветовать освоить DirectDraw;
все впереди.. я тока начал разбираться.. )
> но всё-таки я не понял, что ты хочешь делать: рисовать в
> своём окне или рисовать в чужом?
сам заметил, что сильно отклонился от сабжа.. в конце уже говорил о чужом окне..
> BitBlt с флагом SRCCOPY просто накладывает новое изображение
> на старое, причём старое безвозвратно теряется.
Да, с этим все давно ясно..
> И что значит информация устарела? Это то, что при воспроизведении
> из буфера она будет накладываться на обновившуюся картинку?
> Так кто мешает запомнить картинку в этом же самом буфере
> и потом воспроизвести на экран?
Сейчас, разберусь со всем.. что-то уже сам запутался.. ))
А все потому, что уже не решаю конкретную задачу, а просто пробую.. т.с. изучаю..
Аним (2004-07-29 19:24:00) [12]
> Через регионы.
Сомнительно..
Это самое простое, что можно подумать при попытке реализовать простейший screenmate..
но разве в паузу между изменением региона окна и выводом на измененный регион графики не произойдет мелькания?..
Или просто при изменении региона...
Тут никакая буферизация не поможет...
У них мелькания нет..
Правда и вывод не плавный.. с большим шагом..
Хотя надо попробовать..
> http://www.efg2.com/Lab/Library/Delphi/Graphics/Algorithms.htm
> листай вниз до antialiasing
спасибо, смотрим..
parovoZZ (2004-07-29 19:11:00) [13]Извините, сижу в опере, потому на все вопросы ответы в кучу...
По скринмэйту: обрезаю форму регионом (можно сделать хоть дырку в окне).
Скринмэйт лежит где-то здесь, игрушка называется Joffa http://delphigfx.mastak.ru/game3.htm
to Аним:
могу лишь только посоветовать освоить DirectDraw; но всё-таки я не понял, что ты хочешь делать: рисовать в своём окне или рисовать в чужом? И что значит информация устарела? Это то, что при воспроизведении из буфера она будет накладываться на обновившуюся картинку? Так кто мешает запомнить картинку в этом же самом буфере и потом воспроизвести на экран?
BitBlt с флагом SRCCOPY просто накладывает новое изображение на старое, причём старое безвозвратно теряется.
Огромное Кулясищще (2004-07-29 18:43:00) [14]> Требую.. ))
http://www.efg2.com/Lab/Library/Delphi/Graphics/Algorithms.htm
листай вниз до antialiasing
> Ды?
Именно.
Огромное Кулясищще (2004-07-29 18:41:00) [15]> Но как тогда решена проблема с фоном?.. на котором его выводят.. он же постоянно меняется..
Через регионы.
Аним (2004-07-29 18:12:00) [16]Кстати говоря,
http://www.delphimaster.ru/cgi-bin/forum.pl/forum.pl/?id=1090418922&n=7
> Огромное Кулясищще © (21.07.04 20:29) [8]
> > Как можно рисовать быстрее GDI?
>
> www.g32.org см. Graphic32
>
> > с помощью чего рисовать-то
>
> Вывод пикселя через прямоугольник 1х1. Попиксельно рисуй
> примитивы.
Ды?
Аним (2004-07-29 18:08:00) [17]
> Ссылок кинуть могу, но только по требованию.
Требую.. ))
Аним (2004-07-29 18:06:00) [18]что-то я ударился в screenmates.. ))
Вот:
http://grin.bip.ru/Progr/scmpoo.zip
барашек, кот. бегает по экрану..
качественный китайский screenmate..
его действительно рисуют в отдельним своем окне, а не выводят на чужой dc..
Но как тогда решена проблема с фоном?.. на котором его выводят.. он же постоянно меняется..
не важно двойной буферизацией или как-то еще..
с выводом спрайта вопросов нет..
а откуда они берут фон для использования пусть той же двойной буферизации на дискрипторе своего окна?.. это же фон экрана..
Огромное Кулясищще (2004-07-29 18:00:00) [19]> antialiase? и что это? а ссылок, что почитать по этому нет?..
хоть какие-нить keywords чтоб в хелпе глянуть..
Ссылок кинуть могу, но только по требованию. Можешь попробовать поработать с Graphic32 - там это всё реализовано, собственно, оттуда и пример.
Аним (2004-07-29 17:52:00) [20]
> А кто мешает перед перерисовкой формы скинуть её содержимое
> в какой-нибудь буфер?
Так я на ее dc свою графику вывожу. Да, могу ее запомнить перед своим выводом, но после мне как затереть то, что я поверх нарисовал?! Поставить поверх то, что запомнил?! не-е.. это - устарелая инфа.. ее тоже надо обновить..
Ну и что же, не вызывать же инвалидейт?..
Вот и будет:
> без буфера VCL делает то, что ты ему задаёшь делать, а именно:
> нарисовать на окне, обновить окно, нарисовать на окне, обновить окно.
> А скринмэйт (экранный помошник) это всего-лишь окно, которое
> движется по экрану, а перерисовка окон, находящегося под
> ним, это забота вынды. По крайней мере, я ей так приказал
> делать.
Т.е. что, ты на канве своего окна рисуешь етого помошника, да?
спрайтового персоонажа..
Но оформлено это у тя как? в своем окне ты убрал границы и заместо фона окна ставишь тот фон, что под ним?! или как..
Как ты добился эффекта прозрачности, того, как-будто спрайт движется по столу?..
> Ты мне скажи, что ты делаешь, чтобы у тебя мерцало. Не допираю
> никак.
)) Так нет, мерцания нет (при статичном backgroung-е)..
Теперь остались только лишь скачки с пикселя на следующий....
Как я понял, от этого можно избывиться своеобразной размытостью границ спрайта на 1px?..
> Нужно применить сглаживание к пикселю (antialiase). Грубо
> говоря, чем больше площадь лежит на одном из четырёх занимаемых пикселей, тем непрозрачней цвет.
antialiase? и что это? а ссылок, что почитать по этому нет?..
хоть какие-нить keywords чтоб в хелпе глянуть..
> На этом сайте лежит скринмэйт
Интересно, где же.. кладовка почему-то закрыта..
В каком разделе?..