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

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

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

Аватара пользователя
coyot.rush
постоялец
Сообщения: 309
Зарегистрирован: 14.08.2009 08:59:48

Сообщение coyot.rush »

Двойная буферизация http://ru.wikipedia.org/wiki/%D0%94%D0%B2%D0%BE%D0%B9%D0%BD%D0%B0%D1%8F_%D0%B1%D1%83%D1%84%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F
Двойная буферизация или Анимация без мерцания http://delphiblog.ru/2007/double-buffering-delphi/

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

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

Такое в принципе невозможно или быстро или качественно :!:
.wOvAN
постоялец
Сообщения: 118
Зарегистрирован: 16.04.2010 06:36:12
Контактная информация:

Сообщение .wOvAN »

Не вижу в чем проблема, накатал примерчик реализующий задачу 3-мя способами, кому интересно. Но не дело это графику рисовать стандартными путями, лучше directx или open GL.

http://savebit.ru/skmba0kibhe2.html
Sheleh
новенький
Сообщения: 24
Зарегистрирован: 12.11.2010 17:31:07

Сообщение Sheleh »

.wOvAN
Огромное спасибо за примерчик. Разбираюсь.

В идеале мне просто нужна функция, позволяющая отображать img по четырем его вершинам. Типа свободного трансформирования или StretchDraw() по четырем координатам.

Добавлено спустя 4 часа 53 минуты 9 секунд:
Огромное всем спасибо. Проблема была до ужаса банальна. TImage, на котором я рисовал мерцал из-за того, что располагался на TPanel. На чистой форме все работает очень гладко безо всяких OpenGL даже на стареньком ноуте (800мгц слерон со смешной видюхой). При том, что одновременно вырисовывается до 20 изображений 256*256.

Изображения рисуются в Application.OnIdle весьма банально:
MainLayer.Canvas.Draw(MapDim[I,J,2],MapDim[I,J,3],CacheImage[i].Picture.Bitmap);


Вот только на коммуникаторе это не так производительно, как на PC. Ищу в чем причина.
Sheleh
новенький
Сообщения: 24
Зарегистрирован: 12.11.2010 17:31:07

Сообщение Sheleh »

FedeX писал(а):...к тому же это не красиво выглядит - когда пользователь перемещает мышкой изображение, там откуда картинку убрали, что - просто пустое место? Мы делали когда-то как в гугломапсах, там на лету подгружаються кусочки, даже пока пользователь еще не отпустил мышку.

Координально переписал программу.
Теперь я двигаю не картинку, а на движение мыши просчитываю новые координаты тайлов. Плюс реализовал двойное кэширование картинок: в BMP (шт 30, иначе памяти много ест) для мгновенной прорисовки, и в PNG (штук 200 в виде TMemoryStream, а не TPortableNetworkGraphic, который занимает в памяти места больше чем TBitmap) что бы лишний раз не обращаться к диску.
Прорисовка происходит в Application.OnIdle

Итого: потребление памяти в моем варианте 20-26 мб в отличие от Sasplanet - 80мб
И в отличие от того же Sasplanet осутствуют "пустые места" при движении карты. Все подгружается до того, как пользователь отпускает мышь.
Ответить