Как увеличить скорость отрисовки на canvas?

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

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

Как увеличить скорость отрисовки на canvas?

Сообщение xterro » 27.02.2014 19:03:11

Приветствую, экспериментирую тут с отрисовкой различных примитивов на PaintBox(линии, прямоугольники и т.д) Нарисовал на canvas-е сетку, и рисую, также реализовал масштабирование . На данный момент рисую только линию. Проблема в том, что как-то оно субъективно, медленно отрисовывается, особенно когда минимальный коэффициент масштабирования и двигаешь полосы прокрутки. Можно ли как-нибудь увеличить производительность? Может можно как-то добавить двойную буферизацию(или она уже есть)? Во вложении добавил архив с проектом. Подскажите, что и где можно оптимизировать, чтобы не подтормаживало. Например, сейчас я сетку рисую во вложенном цикле. Была мысль заменить два цикла на один, но отрисовывать вместо точек dash line с большим расстоянием между точками. Как считаете, это увеличит производительность?

P.S. Наткнулся тут ещё на такую штуку: BGRABitmap, как думаете, можно ей заменить стандартный canvas, у неё вроде и сглаживание есть и наверняка двойная буферизация.
У вас нет необходимых прав для просмотра вложений в этом сообщении.
xterro
постоялец
 
Сообщения: 148
Зарегистрирован: 23.02.2014 13:49:33

Re: Как увеличить скорость отрисовки на canvas?

Сообщение zub » 27.02.2014 20:44:46

Наверно лучше OpenGL
zub
долгожитель
 
Сообщения: 2887
Зарегистрирован: 14.11.2005 23:51:26

Re: Как увеличить скорость отрисовки на canvas?

Сообщение debi12345 » 27.02.2014 20:45:22

Знакомая ситуация :) В MSE сейчас Мартин делает вариант GUI-отрисовки с использованием очень хорошо хардварно оптимизированной библиотеки GraphicsMagick (внешняя С-ая ДЛЛка).

Была мысль заменить два цикла на один, но отрисовывать вместо точек dash line с большим расстоянием между точками.

Именно так (заменяя соседние точки-пикселы на сегменты линий) делают практически все графические редакторы.
Аватара пользователя
debi12345
долгожитель
 
Сообщения: 5761
Зарегистрирован: 10.05.2006 23:41:15
Откуда: Ташкент (Узбекистан)

Re: Как увеличить скорость отрисовки на canvas?

Сообщение xterro » 27.02.2014 20:53:27

Именно так (заменяя соседние точки-пикселы на сегменты линий) делают практически все графические редакторы.

Проблема в том, что canvas не умеет dash line, городить свою функцию типа DrawDashLine(x1, y1, x2, y2, dash[]), наверно даже ещё медленнее будет (

Наверно лучше OpenGL

Это я оставлю на последок, если ничего другого не поможет )
xterro
постоялец
 
Сообщения: 148
Зарегистрирован: 23.02.2014 13:49:33

Re: Как увеличить скорость отрисовки на canvas?

Сообщение zub » 27.02.2014 20:58:31

Для сетки даш будет всяко не пригоден
zub
долгожитель
 
Сообщения: 2887
Зарегистрирован: 14.11.2005 23:51:26

Re: Как увеличить скорость отрисовки на canvas?

Сообщение xterro » 27.02.2014 21:30:41

Попробую поиграться с OpenGLContext, хотя по сути, методы рисования, вывод сетки там будет такой же... надеюсь не будет тормозить )
xterro
постоялец
 
Сообщения: 148
Зарегистрирован: 23.02.2014 13:49:33

Re: Как увеличить скорость отрисовки на canvas?

Сообщение zub » 27.02.2014 21:45:35

С наскока и OpenGL будет тормозить нехуже канваса, чтоб рисовать много и быстро придется всяко выкручиваться))
zub
долгожитель
 
Сообщения: 2887
Зарегистрирован: 14.11.2005 23:51:26

Re: Как увеличить скорость отрисовки на canvas?

Сообщение xterro » 27.02.2014 21:55:22

OpenGLContext - была бы по нему ещё документация, как его завести? Кинул на форму, а дальше как с ним работать? Либо подключать какой-то Пд* модуль и дальше вызывать gl* функции... но как? :(
xterro
постоялец
 
Сообщения: 148
Зарегистрирован: 23.02.2014 13:49:33

Re: Как увеличить скорость отрисовки на canvas?

Сообщение zub » 27.02.2014 22:10:00

Посмотри примеры в samples и в components
zub
долгожитель
 
Сообщения: 2887
Зарегистрирован: 14.11.2005 23:51:26

Re: Как увеличить скорость отрисовки на canvas?

Сообщение Sharfik » 27.02.2014 22:22:36

xterro писал(а):Приветствую, экспериментирую тут с отрисовкой различных примитивов на PaintBox(линии, прямоугольники и т.д) Нарисовал на canvas-е сетку, и рисую, также реализовал масштабирование . На данный момент рисую только линию. Проблема в том, что как-то оно субъективно, медленно отрисовывается, особенно когда минимальный коэффициент масштабирования и двигаешь полосы прокрутки. Можно ли как-нибудь увеличить производительность? Может можно как-то добавить двойную буферизацию(или она уже есть)? Во вложении добавил архив с проектом. Подскажите, что и где можно оптимизировать, чтобы не подтормаживало. Например, сейчас я сетку рисую во вложенном цикле. Была мысль заменить два цикла на один, но отрисовывать вместо точек dash line с большим расстоянием между точками. Как считаете, это увеличит производительность?

P.S. Наткнулся тут ещё на такую штуку: BGRABitmap, как думаете, можно ей заменить стандартный canvas, у неё вроде и сглаживание есть и наверняка двойная буферизация.



Производительность, субьективно даже, не проверишь не загрузив программу на серьезную отрисовку. Во время работы отладчика программа может тормозить больше, чем в рабочем варианте.
Аватара пользователя
Sharfik
энтузиаст
 
Сообщения: 809
Зарегистрирован: 20.07.2013 01:04:30

Re: Как увеличить скорость отрисовки на canvas?

Сообщение xterro » 27.02.2014 22:26:46

Попробовал, теперь вроде понятней стало, только после того, как погонял проекты, он мне при запуске какие-то предупреждения выдаёт, никак не отцепится от этих тестов. Зачем он что-то пытается удалить, как сделать так чтобы он отстал? :(
У вас нет необходимых прав для просмотра вложений в этом сообщении.
xterro
постоялец
 
Сообщения: 148
Зарегистрирован: 23.02.2014 13:49:33

Re: Как увеличить скорость отрисовки на canvas?

Сообщение zub » 27.02.2014 22:47:02

Нет прав на запись в usr\lib\lazarus. выдай их или копируй пректы в хомяка
zub
долгожитель
 
Сообщения: 2887
Зарегистрирован: 14.11.2005 23:51:26

Re: Как увеличить скорость отрисовки на canvas?

Сообщение xterro » 28.02.2014 07:02:17

Это я понимаю, странно что он вообще туда постоянно лезет, какие-то бэкапы хочет создать видимо. Ну загрузил пример и загрузил, Lazarus же позволяет отключить создание бэкапов?
xterro
постоялец
 
Сообщения: 148
Зарегистрирован: 23.02.2014 13:49:33

Re: Как увеличить скорость отрисовки на canvas?

Сообщение zub » 28.02.2014 09:46:13

Эначит эти файлы открыты в иде, или открыт этот проект. Закрой файлы или открой другой проект
zub
долгожитель
 
Сообщения: 2887
Зарегистрирован: 14.11.2005 23:51:26

Re: Как увеличить скорость отрисовки на canvas?

Сообщение Vadim » 28.02.2014 10:42:29

xterro
Как только Вы меняете что-либо на форме или в программном модуле, или в окружении самого Lazarus, Lazarus сохраняет старые значения в bak-файл. Ничего тут странного нет, Delphi делает то же самое.
Отключить бэкапы можно в меню "Сервис -> Параметры -> Окружение -> Резервные копии", но это будет неразумно с Вашей стороны.
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

След.

Вернуться в Lazarus

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

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 247

Рейтинг@Mail.ru