Текущий архив: 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.042 c