LINUX.ORG.RU

Как правильно работать с векторами в GTK

 , , ,


0

1

Делается просмоторщик специфического векторного формата на Python + GTK. Все рисуется средствами cairo на DrawingArea.

Нужен почти бесконечное масштабирование и навигация по картинке.

Как правильно делать отрисовку чтобы не тормозило? Я вижу варианты: 1. Рисовать прямо на экран, выкидывая объекты, которые не видны. 2. Отрисовка всего в большой заэкранный буффер и перенос содержимого на экран. При масштабировании перерисовывать все заново. Проблема - размер картинки при крупном увеличении может быть большим. 3. Как 2, но отрисовывать видимую часть + еще немного по краям.

Сейчас все просто рисуется в expose_event() и в зависимотри от увеличения отрисовка занимает 0.05 - 0.1 сек, что не критично для демо, но для работы медленно.

Как это сделать правильно? Как это делают всякие CAD-ы?

★★★★

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

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

Ещё было бы неплохо с помощью чего-нибудь типа http://en.wikipedia.org/wiki/R-tree проиндексировать рисунок, чтобы при отрисовке отбрасывать то, что заведомо не попадает в видимую область. И не дёргать лишний раз cairo.

Неплохо бы посмотреть, где именно тратится основное время, может быть отрисовка не самая затратная часть.

Можно подумать об использовании тайлов, аналогично google maps. Создать менеджер тайлов, который хранит ранее отрисованные тайлы в виде растров. Тогда картинку чуть в сторону подвинул — основная часть взялась из кэша.

i-rinat ★★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.