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

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

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

Ответить
xterro
постоялец
Сообщения: 148
Зарегистрирован: 23.02.2014 13:49:33

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

Сообщение xterro »

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

P.S. Наткнулся тут ещё на такую штуку: BGRABitmap, как думаете, можно ей заменить стандартный canvas, у неё вроде и сглаживание есть и наверняка двойная буферизация.
У вас нет необходимых прав для просмотра вложений в этом сообщении.
zub
долгожитель
Сообщения: 2890
Зарегистрирован: 14.11.2005 22:51:26
Контактная информация:

Сообщение zub »

Наверно лучше OpenGL
Аватара пользователя
debi12345
долгожитель
Сообщения: 5761
Зарегистрирован: 10.05.2006 23:41:15
Откуда: Ташкент (Узбекистан)

Сообщение debi12345 »

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

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

Именно так (заменяя соседние точки-пикселы на сегменты линий) делают практически все графические редакторы.
xterro
постоялец
Сообщения: 148
Зарегистрирован: 23.02.2014 13:49:33

Сообщение xterro »

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

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

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

Это я оставлю на последок, если ничего другого не поможет )
zub
долгожитель
Сообщения: 2890
Зарегистрирован: 14.11.2005 22:51:26
Контактная информация:

Сообщение zub »

Для сетки даш будет всяко не пригоден
xterro
постоялец
Сообщения: 148
Зарегистрирован: 23.02.2014 13:49:33

Сообщение xterro »

Попробую поиграться с OpenGLContext, хотя по сути, методы рисования, вывод сетки там будет такой же... надеюсь не будет тормозить )
zub
долгожитель
Сообщения: 2890
Зарегистрирован: 14.11.2005 22:51:26
Контактная информация:

Сообщение zub »

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

Сообщение xterro »

OpenGLContext - была бы по нему ещё документация, как его завести? Кинул на форму, а дальше как с ним работать? Либо подключать какой-то Пд* модуль и дальше вызывать gl* функции... но как? :(
zub
долгожитель
Сообщения: 2890
Зарегистрирован: 14.11.2005 22:51:26
Контактная информация:

Сообщение zub »

Посмотри примеры в samples и в components
Аватара пользователя
Sharfik
энтузиаст
Сообщения: 840
Зарегистрирован: 20.07.2013 01:04:30

Сообщение Sharfik »

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

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



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

Сообщение xterro »

Попробовал, теперь вроде понятней стало, только после того, как погонял проекты, он мне при запуске какие-то предупреждения выдаёт, никак не отцепится от этих тестов. Зачем он что-то пытается удалить, как сделать так чтобы он отстал? :(
У вас нет необходимых прав для просмотра вложений в этом сообщении.
zub
долгожитель
Сообщения: 2890
Зарегистрирован: 14.11.2005 22:51:26
Контактная информация:

Сообщение zub »

Нет прав на запись в usr\lib\lazarus. выдай их или копируй пректы в хомяка
xterro
постоялец
Сообщения: 148
Зарегистрирован: 23.02.2014 13:49:33

Сообщение xterro »

Это я понимаю, странно что он вообще туда постоянно лезет, какие-то бэкапы хочет создать видимо. Ну загрузил пример и загрузил, Lazarus же позволяет отключить создание бэкапов?
zub
долгожитель
Сообщения: 2890
Зарегистрирован: 14.11.2005 22:51:26
Контактная информация:

Сообщение zub »

Эначит эти файлы открыты в иде, или открыт этот проект. Закрой файлы или открой другой проект
Vadim
долгожитель
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Сообщение Vadim »

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