Перемещение рисунка по форме без мерцаний.

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Перемещение рисунка по форме без мерцаний.

Сообщение Sheleh » 22.11.2010 08:10:29

В общем нужно двигать картинку (картографический двиг) по форме без тормозов. На делфи следующий метод работал идеально:

procedure TForm1.ImageLayerMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
begin
ImageLayer.Left:=ImageLayer.Left+X-CurPosX; //где CurPos - начальные координаты.
ImageLayer.Top:=ImageLayer.Top+Y-CurPosY;
end;


На лазарусе, особенно при компиляции в Win CE этод метод изрядно притормаживает. Какие можно использовать альтернативы?
Sheleh
новенький
 
Сообщения: 24
Зарегистрирован: 12.11.2010 18:31:07

Re: Перемещение рисунка по форме без мерцаний.

Сообщение Mr.Smart » 22.11.2010 09:20:31

[*] Использовать WipAPI для прорисовки;
[*] Использовать OpenGL.
Mr.Smart
долгожитель
 
Сообщения: 1796
Зарегистрирован: 29.03.2008 01:01:11
Откуда: из леса!

Re: Перемещение рисунка по форме без мерцаний.

Сообщение Climber » 22.11.2010 09:38:47

В OnCreate формы написать

DoubleBuffered:=true;

Мне помогало сделать более плавную отрисовку.
Climber
постоялец
 
Сообщения: 415
Зарегистрирован: 03.06.2007 20:09:57
Откуда: Москва

Re: Перемещение рисунка по форме без мерцаний.

Сообщение Sheleh » 22.11.2010 17:13:52

В OnCreate формы написать

DoubleBuffered:=true;

Мне помогало сделать более плавную отрисовку.

Не помогло.

[*] Использовать WipAPI для прорисовки;

а можно чуть подробнее. Шарюсь в инете, но пока ничего не нашел
Sheleh
новенький
 
Сообщения: 24
Зарегистрирован: 12.11.2010 18:31:07

Re: Перемещение рисунка по форме без мерцаний.

Сообщение Nik » 22.11.2010 20:48:00

Может быть стоит попробовать Graphics32? Они рисуют быстро (делал на их базе систему масштабируемых скинов - правда, дело было в Delphi, но у GR32 свой код отрисовки, так что от IDE не должна скорость сильно зависеть).
Аватара пользователя
Nik
энтузиаст
 
Сообщения: 573
Зарегистрирован: 04.02.2006 00:08:09
Откуда: Киров

Re: Перемещение рисунка по форме без мерцаний.

Сообщение Odyssey » 22.11.2010 22:25:10

Было бы здорово создать маленький тестовый пример с тормозами и выложить в багтрекер (или на крайняк сюда). Тогда хотя бы будет надежда на улучшение ситуации в будущем. Ещё можно попробовать попереключать виджетсеты, например проверить под Qt, правда это уже не для WinCE :(
Odyssey
энтузиаст
 
Сообщения: 580
Зарегистрирован: 29.11.2007 17:32:24

Re: Перемещение рисунка по форме без мерцаний.

Сообщение zub » 22.11.2010 23:05:11

попробуй в onMouseMove только запоминать координаты, а двигать картинку в onIdle, если было движение мышью
zub
долгожитель
 
Сообщения: 2886
Зарегистрирован: 14.11.2005 23:51:26

Re: Перемещение рисунка по форме без мерцаний.

Сообщение Sheleh » 30.11.2010 11:07:06

Может быть стоит попробовать Graphics32?
Он не работает в WinCE

попробуй в onMouseMove только запоминать координаты, а двигать картинку в onIdle, если было движение мышью
Так совсем некрасиво получается.

Перепробовал множество методов, в том числе Canavas.Draw, Copy, BitBt, но эффект тот же. Судя по всему проблема в лазарусе. Любая прорисовка изображения сопровождается мерцанием так, что становится видно то, что находится под рисунком. Т.е. перед тем как нарисовать изображение, лазарус сначала рисует то, что находится под ним. Delphi же рисует сразу поверх того, что есть.

Вообще мне надо не просто двигать картинку, но и научится ее без тормозов вращать, а в идеале свободно изменять размеры, для получения эффекта перспективы. И в связи с этим появляются новые вопросы: как быстро попиксельно работать с рисунком (кроссплатформенно), и быстро выводить его на экран. Желательно что бы это было софтварно для работы на любом железе.

З.Ы. Уже как то не охота останавливаться. Я реализовал картографический двиг на делфи работающий по принципу Google Map, он даже картинки качает в несколько потоков и работает быстрее SasPlanet.
Sheleh
новенький
 
Сообщения: 24
Зарегистрирован: 12.11.2010 18:31:07

Re: Перемещение рисунка по форме без мерцаний.

Сообщение FedeX » 30.11.2010 12:08:08

Попробуй OpenGL для максимального перформенса (под WinCE софтовая реализация есть) - в подарок получиш готовые возможности быстрого вращения/масштабирования изображений. А если не охота много нового изучать, то надобы попробовать почти как говорил zub в onMouseMove только запоминать координаты и делать Invalidate канве формы (или на чем ты там рисуеш) а уже в OnPaint этого компонента отрисовывать то что тебе надо. Причем лучше сначала отрисовывать в битмап нужного размера, а затем уже этот битмап разом выводить на канву компонента. А еще лучше унаследоваться от какого-то оконного контрола и переписав ему пеинт реализовать свой класс с необходимым функционалом. А еще лучше отрисовывать в этом компоненте все на OpenGL. Потому что то как сделано сейчас (двигание мышкой TImage по форме) это, извиняюсь, индусо-стиль и приведет такой стиль только к куче головной боли и подобных вопросов в будущем. :wink:
Аватара пользователя
FedeX
постоялец
 
Сообщения: 422
Зарегистрирован: 27.03.2006 09:25:34
Откуда: украина, житомир

Re: Перемещение рисунка по форме без мерцаний.

Сообщение Sheleh » 30.11.2010 12:48:57

Потому что то как сделано сейчас (двигание мышкой TImage по форме) это, извиняюсь, индусо-стиль и приведет такой стиль только к куче головной боли и подобных вопросов в будущем.
На самом деле Тimage двигается только для видимости (в Delphi - самый быстрый для глаза вариант), в OnMouseDown я запоминаю начальные координаты, а окончательная прорисовка происходит в OnMouseUp, а Timage возвращается на свое место.
Sheleh
новенький
 
Сообщения: 24
Зарегистрирован: 12.11.2010 18:31:07

Re: Перемещение рисунка по форме без мерцаний.

Сообщение FedeX » 30.11.2010 12:58:00

(в Delphi - самый быстрый для глаза вариант)

Хоть в делфи, хоть к QtCreator-е, хоть на божественном языке, вместо простого копирования пикселей из одного места видеопамяти в другое место перемещать целый компонент поверх другого - это не самый быстрый вариант, просто так кажеться, пока не надо делать ничего сложнее.

...к тому же это не красиво выглядит - когда пользователь перемещает мышкой изображение, там откуда картинку убрали, что - просто пустое место? Мы делали когда-то как в гугломапсах, там на лету подгружаються кусочки, даже пока пользователь еще не отпустил мышку.
Аватара пользователя
FedeX
постоялец
 
Сообщения: 422
Зарегистрирован: 27.03.2006 09:25:34
Откуда: украина, житомир

Re: Перемещение рисунка по форме без мерцаний.

Сообщение Timid » 30.11.2010 15:53:23

Все вышесказанное неверно/неудобно

Есть такой режим Drag - перетаскивание
Обработчик StartDrag может подключить ImageList с одной картинкой, которая будет отображаться вместо курсора (в Windows) в полупрозрачном виде.
Вот эту картинку и нужно "быстренько сварганить" из вашего Image, предварительно его спрятав (visible:=false)
На DragDrop лист бокс уничтожаем и снова показываем свой Image в новом месте.
Отрисовку таскания будет делать сама Windows.

Для Linux - не знаю.
Timid
постоялец
 
Сообщения: 290
Зарегистрирован: 21.11.2007 21:33:15

Re: Перемещение рисунка по форме без мерцаний.

Сообщение FedeX » 30.11.2010 16:45:21

Timid, ты бы хоть почитал сперва о чем речь прежде чем писать "Все вышесказанное неверно/неудобно" :D
Аватара пользователя
FedeX
постоялец
 
Сообщения: 422
Зарегистрирован: 27.03.2006 09:25:34
Откуда: украина, житомир

Re: Перемещение рисунка по форме без мерцаний.

Сообщение Sheleh » 30.11.2010 16:57:55

Попробуй OpenGL для максимального перформенса (под WinCE софтовая реализация есть)
В лазарусе есть екзампл с вращающимся кубом. Выглядит шикарно, но не компилируется в WinCE: {$ERROR this LCL widgetset/OS is not yet supported}

О какой именно софтовой реализации для WinCE идет речь?
Sheleh
новенький
 
Сообщения: 24
Зарегистрирован: 12.11.2010 18:31:07

Re: Перемещение рисунка по форме без мерцаний.

Сообщение FedeX » 30.11.2010 17:11:31

Об этой: http://www.vincent3d.com/software/software.html Правда это OpenGL ES, но апи почти ничем не отличаеться, если грамотно делать можно писать почти кроссплатформенно. Заголовок я сам когда-то переводил, но возможно для OpenGL ES есть уже в официальных сорцах фрипаскаля.
Тот экзампл, что в лазарусе использует компонент, который не поддерживает ни WinCE , ни OpenGL ES.
Аватара пользователя
FedeX
постоялец
 
Сообщения: 422
Зарегистрирован: 27.03.2006 09:25:34
Откуда: украина, житомир

След.

Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: Yandex [Bot] и гости: 19

Рейтинг@Mail.ru