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

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

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

Sheleh
новенький
Сообщения: 24
Зарегистрирован: 12.11.2010 17:31:07

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

Сообщение Sheleh »

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

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 этод метод изрядно притормаживает. Какие можно использовать альтернативы?
Mr.Smart
долгожитель
Сообщения: 1796
Зарегистрирован: 29.03.2008 00:01:11
Откуда: из леса!

Сообщение Mr.Smart »

[*] Использовать WipAPI для прорисовки;
[*] Использовать OpenGL.
Climber
постоялец
Сообщения: 415
Зарегистрирован: 03.06.2007 20:09:57
Откуда: Москва

Сообщение Climber »

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

DoubleBuffered:=true;

Мне помогало сделать более плавную отрисовку.
Sheleh
новенький
Сообщения: 24
Зарегистрирован: 12.11.2010 17:31:07

Сообщение Sheleh »

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

DoubleBuffered:=true;

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

Не помогло.

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

а можно чуть подробнее. Шарюсь в инете, но пока ничего не нашел
Аватара пользователя
Nik
энтузиаст
Сообщения: 573
Зарегистрирован: 03.02.2006 23:08:09
Откуда: Киров
Контактная информация:

Сообщение Nik »

Может быть стоит попробовать Graphics32? Они рисуют быстро (делал на их базе систему масштабируемых скинов - правда, дело было в Delphi, но у GR32 свой код отрисовки, так что от IDE не должна скорость сильно зависеть).
Odyssey
энтузиаст
Сообщения: 580
Зарегистрирован: 29.11.2007 16:32:24

Сообщение Odyssey »

Было бы здорово создать маленький тестовый пример с тормозами и выложить в багтрекер (или на крайняк сюда). Тогда хотя бы будет надежда на улучшение ситуации в будущем. Ещё можно попробовать попереключать виджетсеты, например проверить под Qt, правда это уже не для WinCE :(
zub
долгожитель
Сообщения: 2889
Зарегистрирован: 14.11.2005 22:51:26
Контактная информация:

Сообщение zub »

попробуй в onMouseMove только запоминать координаты, а двигать картинку в onIdle, если было движение мышью
Sheleh
новенький
Сообщения: 24
Зарегистрирован: 12.11.2010 17:31:07

Сообщение Sheleh »

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

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

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

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

З.Ы. Уже как то не охота останавливаться. Я реализовал картографический двиг на делфи работающий по принципу Google Map, он даже картинки качает в несколько потоков и работает быстрее SasPlanet.
Аватара пользователя
FedeX
постоялец
Сообщения: 422
Зарегистрирован: 27.03.2006 09:25:34
Откуда: украина, житомир

Сообщение FedeX »

Попробуй OpenGL для максимального перформенса (под WinCE софтовая реализация есть) - в подарок получиш готовые возможности быстрого вращения/масштабирования изображений. А если не охота много нового изучать, то надобы попробовать почти как говорил zub в onMouseMove только запоминать координаты и делать Invalidate канве формы (или на чем ты там рисуеш) а уже в OnPaint этого компонента отрисовывать то что тебе надо. Причем лучше сначала отрисовывать в битмап нужного размера, а затем уже этот битмап разом выводить на канву компонента. А еще лучше унаследоваться от какого-то оконного контрола и переписав ему пеинт реализовать свой класс с необходимым функционалом. А еще лучше отрисовывать в этом компоненте все на OpenGL. Потому что то как сделано сейчас (двигание мышкой TImage по форме) это, извиняюсь, индусо-стиль и приведет такой стиль только к куче головной боли и подобных вопросов в будущем. :wink:
Sheleh
новенький
Сообщения: 24
Зарегистрирован: 12.11.2010 17:31:07

Сообщение Sheleh »

Потому что то как сделано сейчас (двигание мышкой TImage по форме) это, извиняюсь, индусо-стиль и приведет такой стиль только к куче головной боли и подобных вопросов в будущем.
На самом деле Тimage двигается только для видимости (в Delphi - самый быстрый для глаза вариант), в OnMouseDown я запоминаю начальные координаты, а окончательная прорисовка происходит в OnMouseUp, а Timage возвращается на свое место.
Аватара пользователя
FedeX
постоялец
Сообщения: 422
Зарегистрирован: 27.03.2006 09:25:34
Откуда: украина, житомир

Сообщение FedeX »

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

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

...к тому же это не красиво выглядит - когда пользователь перемещает мышкой изображение, там откуда картинку убрали, что - просто пустое место? Мы делали когда-то как в гугломапсах, там на лету подгружаються кусочки, даже пока пользователь еще не отпустил мышку.
Timid
постоялец
Сообщения: 290
Зарегистрирован: 21.11.2007 20:33:15

Сообщение Timid »

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

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

Для Linux - не знаю.
Аватара пользователя
FedeX
постоялец
Сообщения: 422
Зарегистрирован: 27.03.2006 09:25:34
Откуда: украина, житомир

Сообщение FedeX »

Timid, ты бы хоть почитал сперва о чем речь прежде чем писать "Все вышесказанное неверно/неудобно" :D
Sheleh
новенький
Сообщения: 24
Зарегистрирован: 12.11.2010 17:31:07

Сообщение Sheleh »

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

О какой именно софтовой реализации для WinCE идет речь?
Аватара пользователя
FedeX
постоялец
Сообщения: 422
Зарегистрирован: 27.03.2006 09:25:34
Откуда: украина, житомир

Сообщение FedeX »

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