Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.10.15;
Скачать: CL | DM;

Вниз

Анимация перемещения картинки.   Найти похожие ветки 

 
GuAV ©   (2006-03-19 15:39) [0]

Пытаюсь отобразить перемещение рисунка по канве (на TPanel лежит TPaintBox, у TPanel DoubleBuffered = True, рисунок на этом самом TPaintBox). И как-то плохо получается. Когда число промежуточных положений мало, анимация выкглядит слишком резкой, как бы перемещение рывками. Когда делаю много промежуточных положений, не удаётся достичь приемлемой скорости, кроме того подозреваю что тогда скорость будет сильно зависить от конфигурации ПК.
Кроме того, приложение в момент показа анимации отнимает много процессорного времени - и через TTimer, и в цикле с Sleep с и без Application.ProcessMessages.
Есть ли нормальный способ реализовать сабж или следует искать другие пути отображения изменения положения картинки (например, рисовать стрелку между страым и новым положением) ?


 
MBo ©   (2006-03-19 15:44) [1]

Каким способом выводишь картинку и сколько промежуточных положений?


 
GuAV ©   (2006-03-19 15:54) [2]


> Каким способом выводишь картинку

Маленькая 32х32 картинка из TImageList методом Draw (Прозрачные области существуют) выводится вместе с остальным содержимым TPaintBox в OnPaint.


> и сколько промежуточных положений?

Max(Abs(Src.X - Dest.X), Abs(Src.Y - Dest.Y)) {div 4};

Src, Dest - TPoint"ы для старого и нового положения.
C div 4 ещё тормозит, с div 8 уже рывки заметны.

Думаю, часть ответа в том, как узнать правильное число промежуточных положений..


 
Anatoly Podgoretsky ©   (2006-03-19 15:54) [3]

Используй мультимедия таймер, у него разрешение порядка 1 мсек и приоритет повыше


 
GuAV ©   (2006-03-19 16:02) [4]


> Anatoly Podgoretsky ©

Спасибо за вариант с таймером.

Сейчас однако проблема не только в этом - я не успеваю рисовать даже если убрать все Sleep и ProcessMessages и делать Repaint в цикле.


 
GuAV ©   (2006-03-19 16:05) [5]


> и приоритет повыше

Тогда сейчас попробую.
Т.е. он более приоритетный чем обработка сообщений и выше собственного приоритета приложения ?


 
jack128 ©   (2006-03-19 16:05) [6]

GuAV ©   (19.03.06 15:54) [2]
Маленькая 32х32 картинка из TImageList методом Draw (Прозрачные области существуют) выводится вместе с остальным содержимым TPaintBox в OnPaint.

Нарисуй всё изображение на канву в памяти, и при каждой отрисовки копируй это изображение на канву PaintBox"а в нужном месте..


 
jack128 ©   (2006-03-19 16:06) [7]

jack128 ©   (19.03.06 16:05) [6]
Но в этом случаи естественно DoubleBuffered отключить нужно, для большей эффективности..


 
GuAV ©   (2006-03-19 16:17) [8]


> jack128 ©


Спасибо. Уже лучше.
Но при отключении DoubleBuffered - мерцает всё страшно, пришлось оставить.


 
jack128 ©   (2006-03-19 16:22) [9]

GuAV ©   (19.03.06 16:17) [8]
Спасибо. Уже лучше

Ты что, уже реализовал??

GuAV ©   (19.03.06 16:17) [8]
Но при отключении DoubleBuffered - мерцает всё страшно, пришлось оставить.

Хм. А вот это ОЧЕНЬ странно.  Такого быть не должно.


 
jack128 ©   (2006-03-19 16:23) [10]

jack128 ©   (19.03.06 16:22) [9]
собственно то что я предложил, это таже самая двойная буфферезация, но в более оптимальном варианте.  Не понимаю, откуда возникнет мерцание, если при DoubleBuffered его не было..


 
GuAV ©   (2006-03-19 16:27) [11]


> Ты что, уже реализовал??

Проект пустой, кроме экспериментов с анимацией ничего нет.


> Не понимаю, откуда возникнет мерцание

А я понял. Срабатывает стандартный обрабочик рисования и заливает область серым, а потом рисуется картинка. Вот и мерцание.


 
jack128 ©   (2006-03-19 16:31) [12]

GuAV ©   (19.03.06 16:27) [11]
Срабатывает стандартный обрабочик рисования

какой такой стандартный обработчик??  У твоего WinControl"a чтоли??   Не должен от срабатывать


 
Polevi ©   (2006-03-20 12:13) [13]

>GuAV ©   (19.03.06 16:27) [11]
WM_ERASEBKGND


 
GuAV ©   (2006-03-20 13:58) [14]


>>GuAV ©   (19.03.06 16:27) [11]
> WM_ERASEBKGND

Причём тут WM_ERASEBKGND я не понял.

Проблема мерцания при DoubleBuffered = False уже решена - использую наследника TCustomControl вместо TPaintBox.


 
GuAV ©   (2006-03-20 14:25) [15]


> Polevi ©   (20.03.06 12:13) [13]

Хотя нет, нужно таки его обрабатывать. Спасибо.


 
Eraser ©   (2006-03-20 15:45) [16]


> GuAV ©   (20.03.06 13:58) [14]


> Причём тут WM_ERASEBKGND я не понял.

перехватывай это сообщение для нужной TPanel, не вызывая inherited обработчик.



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

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

Наверх




Память: 0.48 MB
Время: 0.043 c
3-1155644577
RomanH
2006-08-15 16:22
2006.10.15
Начальное значение генератора


6-1148051262
kernel
2006-05-19 19:07
2006.10.15
Противная ошибка


2-1159039998
_Ламер_
2006-09-23 23:33
2006.10.15
DEFAULT USER


10-1124468571
APXi
2005-08-19 20:22
2006.10.15
Способ вставки в Excel


3-1155893152
BronOS
2006-08-18 13:25
2006.10.15
Ошибка при конвертации типов данных





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский