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

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

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

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

Сообщение Mirage » 02.03.2014 10:47:11

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


Если рисовать линию по точкам, то не удивительно, что тормозит.
Во-первых надо рисовать сетку более оптимально, об этом ниже.
Во-вторых перерисовываться при прокрутке содержимое контрола, который внутри скроллбокса, не должно. Лучше пусть он запоминает во внутреннем буфере и выводит из него при прокрутке. Не сложно для этого написать свой контрол, но думаю что такой уже есть.
Если размер изображения очень большой, то буферизация не катит, но можно рисовать только то, что видно в данный момент.

Сетку, конечно, рисуют линиями. Канвас должен поддерживать пунктирные линии.
Но, в принципе её можно рисовать как угодно и запоминать в буфере. Потом этот буфер просто и быстро копировать куда нужно. Сетка ведь редко меняется.

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


Под двойной буферизацией обычно понимается то, что рисуем сперва в буфер, а потом этот буфер сразу показываем. Это позволяет избавиться от дерганий и мельканий, но не от тормозов. Тормозов может даже добавить.
Другое дело, что если есть буферизация отрисовки, то можно использовать этот буфер чтобы не перерисовывать все при прокрутке.
Не спец по контролам LCL, но BGRABitmap часто рекомендуют для быстрой отрисовки. Возможно он буферизирует и правильно реагирует на прокрутку.
Mirage
энтузиаст
 
Сообщения: 881
Зарегистрирован: 06.05.2005 20:29:07
Откуда: Russia

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

Сообщение MiniQ » 02.03.2014 11:33:53

Ух какая активная дискуссия развернулась.
Но по порядку.
1. Справка о железе
The SoC is a Broadcom BCM2835. This contains an ARM1176JZFS, with floating point, running at 700Mhz; and a Videocore 4 GPU@ 250 MHz. The GPU is capable of BluRay quality playback, using H.264 at 40MBits/s. It has a fast 3D core accessed using the supplied OpenGL ES 2.0 (24 GFLOPS) and OpenVG libraries.

2.
zub писал(а):даже утюг сейчас наверно трудно купить чтоб 2д акселерацию не поддерживал

Поддерживать акселерацию и ее использовать - совсем не одно и то же. Железка акселерацию предоставляет через конкретную библиотеку, LCL ее использовать не умеет.
)) у MiniQ явно дровишки какиенибудь непоставлены

дровишки водятся у вас в виндах
3.
zub писал(а):обработчики onЧетоТам 100500 наформошлепаных контролов, но никак не тормоза отрисовки самих контролов.

Отрисовка контроллов средствами CPU сопровождается 100% загрузкой оного
4. Отрисовка достаточно сложных сцен и демок на Qt5(который по умолчанию использует OpenGL) идет с частотой от 60 до 1700 FPS. И есстественно, выглядит очень привлекательно.

Отсюда и стремление заюзать все эти аппаратные возможности для LCL.
MiniQ
новенький
 
Сообщения: 81
Зарегистрирован: 28.01.2013 16:31:55

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

Сообщение zub » 02.03.2014 11:36:40

>>Сетку, конечно, рисуют линиями. Канвас должен поддерживать пунктирные линии.
Пунктирные линии предоставляемые канвасом очень плохо контролируются. Хорошо если сетка в дисплейных координатах, тогда наверно можно их использовать, если в "модельных" которые масштабируются, сдвигаются, возможно проецируются перед попаданием в систему координат въюпорта - это плохой вариант. ИМХО правильно это делать точками для точечной сетки и обычными линиями для "милиметровки". Точек и линий обычно не так много, при условии если выполнены все отсечения и рисуется только то что попадает в въюпорт.

>>Во-вторых перерисовываться при прокрутке содержимое контрола, который внутри скроллбокса, не должно.
Тоже спорно. зависит от характера рисуемых данных - после отсева невидимых примитивов и всяких LODов обычно остается не так много примитивов для отрисовки, поэтому гребля с скролингом и стыковкой кусков в случае очень больших изображений (если пользователю доступен зум - очень большой может стать любая картинка) не всегда оправдывается
zub
долгожитель
 
Сообщения: 2887
Зарегистрирован: 14.11.2005 23:51:26

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

Сообщение debi12345 » 02.03.2014 11:38:18

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

Если имадж и канвас LCL это и прочие важные рисовальные трюки не предоставляет "из коробки", то грош им цена.

Отрисовка достаточно сложных сцен и демок на Qt5(который по умолчанию использует OpenGL) идет с частотой от 60 до 1700 FPS

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

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

Сообщение MiniQ » 02.03.2014 11:48:22

debi12345 писал(а):Переключение LCL на Qt-бэкэнд не помогает ?

Сейчас в LCL реализована поддержка Qt4, который не поддерживает отрисовку через OpenGL. По этому и говорю про Qt5.
MiniQ
новенький
 
Сообщения: 81
Зарегистрирован: 28.01.2013 16:31:55

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

Сообщение zub » 02.03.2014 11:52:57

MiniQ
>>Поддерживать акселерацию и ее использовать - совсем не одно и то же. Железка акселерацию предоставляет через конкретную библиотеку, LCL ее использовать не умеет.
LCL ее и не должна использовать, т.к. сама в обычном применении ничего не рисует)) грубо говоря у вас связка LCL->qt(gtk)->"конкретная библиотека". Проблемы на участке qt(gtk)->"конкретная библиотека", хз почему, версии не те, чтото не настроено... Вам виднее))

>>дровишки водятся у вас в виндах
Как ни странно в линуксах у нас тоже дровишки водятся, только называются и распространяются по другому, но также как и в винде пъют кровь обладателей всякой экзотики))

>>Отрисовка контроллов средствами CPU сопровождается 100% загрузкой оного
>>4. Отрисовка достаточно сложных сцен и демок на Qt5(который по умолчанию использует OpenGL) идет с частотой от 60 до 1700 FPS. И есстественно, выглядит очень привлекательно.
сравниваем несравнимое, давайте сравнивать либо контролы через LCL и контролы через Qt, либо OpenGL сцену через LCL и OpenGL сцену через Qt
zub
долгожитель
 
Сообщения: 2887
Зарегистрирован: 14.11.2005 23:51:26

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

Сообщение debi12345 » 02.03.2014 11:55:39

реализована поддержка Qt4

QT5 никак не зацепляется ? Например если подправить названия импортируемых DLL-к?
Аватара пользователя
debi12345
долгожитель
 
Сообщения: 5761
Зарегистрирован: 10.05.2006 23:41:15
Откуда: Ташкент (Узбекистан)

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

Сообщение zub » 02.03.2014 12:04:20

MiniQ
>>Сейчас в LCL реализована поддержка Qt4, который не поддерживает отрисовку через OpenGL. По этому и говорю про Qt5.
Спорить небуду, но помоему в моей кубунте всегда была настройка что использовать в качестве бакэнда для Qt (xrender, OpenGL). Или это не про то?

debi12345
>>QT5 никак не зацепляется ? Например если подправить названия импортируемых DLL-к?
Наверно это сделать несложно, но придется подправить и пересобрать Qt4pas, он не входит в состав лазаря

>>Если имадж и канвас LCL это и прочие важные рисовальные трюки не предоставляет "из коробки", то грош им цена.
Поделитесь канвасом не LCL который может без тормозов рисовать тонну векторных данных, избавляя програмиста от всяких "хитростей"))
zub
долгожитель
 
Сообщения: 2887
Зарегистрирован: 14.11.2005 23:51:26

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

Сообщение MiniQ » 02.03.2014 12:10:25

debi12345 писал(а):QT5 никак не зацепляется ? Например если подправить названия импортируемых DLL-к?

Веду работу по портированию связки LCL-Qt на 5 версию, но поменялась архитектура библиотеки, перечень функций, их аргументы. Короче в лоб не получилось.
придется подправить и пересобрать Qt4pas

и это в том числе несомненно

Добавлено спустя 7 минут 28 секунд:
zub писал(а):Поделитесь канвасом не LCL который может без тормозов рисовать тонну векторных данных, избавляя програмиста от всяких "хитростей"))

К слову, Qt5 дает такую возможность, именно тонну и именно векторных.
Да ладно, чего это я агитирую за "белых"...
Просто хочется, что бы и на нашей улице был праздник.
MiniQ
новенький
 
Сообщения: 81
Зарегистрирован: 28.01.2013 16:31:55

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

Сообщение zub » 02.03.2014 12:24:55

>>Веду работу по портированию связки LCL-Qt на 5 версию, но поменялась архитектура библиотеки, перечень функций, их аргументы. Короче в лоб не получилось.
Связь с командой лазаря поддерживаете? Zeljan давно собирается это делать, да никак не приступит)) (а может потихому и делает). Во избежание двойной работы свяжитесь с Zeljan Rikalo (автор LCL-Qt бакэнда) и Den Jean (автор Qt4pas) в списке рассылки

Добавлено спустя 3 минуты 50 секунд:
>>К слову, Qt5 дает такую возможность, именно тонну и именно векторных.
Поверте, на поверку всё не так хорошо как заявляется. т.к. универсального канваса для всего быть не может))
zub
долгожитель
 
Сообщения: 2887
Зарегистрирован: 14.11.2005 23:51:26

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

Сообщение vitaly_l » 02.03.2014 13:46:20

MiniQ писал(а):Просто хочется, что бы и на нашей улице был праздник.

Сделать заготовки, постоянно перерисовывающихся, но одинаковых частей
и потом их вставлять, а не создавать каждый раз заново, по 100 изображений в секунду.
И ещё было замечено, что - не все элементы рисуют одинаково быстро...


.
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

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

Сообщение debi12345 » 02.03.2014 14:48:35

Хмм, MSE заводится на АРМ-е если потанцевать с бубном :
http://article.gmane.org/gmane.comp.ide.mseide.user/8928/
http://thread.gmane.org/gmane.comp.ide.mseide.user/8846
Вот картинка :
Изображение
Правда на тот момент без openGL.
Аватара пользователя
debi12345
долгожитель
 
Сообщения: 5761
Зарегистрирован: 10.05.2006 23:41:15
Откуда: Ташкент (Узбекистан)

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

Сообщение Mirage » 02.03.2014 15:48:14

Может сделаем OpenGL/OpenGL ES бакенд для LCL?
В конце концов, это не так уж сложно.
Кто знает какой интерфейс у бакенда?
Mirage
энтузиаст
 
Сообщения: 881
Зарегистрирован: 06.05.2005 20:29:07
Откуда: Russia

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

Сообщение zub » 02.03.2014 17:35:24

>>В конце концов, это не так уж сложно.
Но и не так просто. И имхо острой нужды нет. В порядке развлечения?

>>Кто знает какой интерфейс у бакенда?
На вики попадалась статья о порядке создания qt бакэнда, должна немного помочь
zub
долгожитель
 
Сообщения: 2887
Зарегистрирован: 14.11.2005 23:51:26

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

Сообщение MiniQ » 02.03.2014 18:08:21

Mirage писал(а):Может сделаем OpenGL/OpenGL ES бакенд для LCL

Давайте, с удовольствием соединю полезное с приятным.
Все реализации интерфейсов лежат тут \lazarus\lcl\interfaces\, можно подглядеть.
MiniQ
новенький
 
Сообщения: 81
Зарегистрирован: 28.01.2013 16:31:55

Пред.След.

Вернуться в Lazarus

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

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

Рейтинг@Mail.ru