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

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

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

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

Сообщение Mirage » 02.03.2014 18:12:49

zub писал(а):Но и не так просто. И имхо острой нужды нет.


Нет острой нужды в быстрой, качественной и кроссплатформенной отрисовке графического интерфейса, а также всего остального?
Ну, нет так нет.
:?

MiniQ писал(а):Давайте, с удовольствием соединю полезное с приятным.
Все реализации интерфейсов лежат тут \lazarus\lcl\interfaces\, можно подглядеть.


Я планирую всерьез взяться за OGL ES, да и просто OGL изрядно подзабыл. Так что тоже полезное с приятным и полезным.
Только надо определить фронт работ, кто еще участвует, кто что делает и т.д.
Ну и надо ли это вообще, а то вот выше пишут, что и так все отлично.
Mirage
энтузиаст
 
Сообщения: 881
Зарегистрирован: 06.05.2005 20:29:07
Откуда: Russia

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

Сообщение MiniQ » 02.03.2014 18:22:57

некая простенькая реализация интерфейса, через библиотеку ZenGL есть тут:
http://zengl.org/forum/index.php/topic,358.0.html
правда живущая сама по себе, без привязки к LCL

зы. если высшим не надо, сделаем для себя и себе подобным )

Добавлено спустя 4 минуты 23 секунды:
Опять же по OpenGL можно проконсультироваться с автором ZenGL
http://zengl.org/forum/index.php/topic,563.new.html
MiniQ
новенький
 
Сообщения: 81
Зарегистрирован: 28.01.2013 16:31:55

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

Сообщение zub » 02.03.2014 18:41:36

>>Нет острой нужды в быстрой, качественной и кроссплатформенной отрисовке графического интерфейса, а также всего остального?
Одно дело написать упрощенную реализацию окошек и контролов, другое полноценную, чтоб любое LCL приложение работало. qt, gtk, winapi бакэнды уже сколько пишутся и не в одну голову, а багов полнымполно))
Такчто нужно реально оценивать свои силы.
Имхо реализовать qt5 гораздо проще и перспективней.

Добавлено спустя 1 час 37 минут 29 секунд:
MiniQ
Вроде как имеется альфа биндинга qtpas для qt5 - http://users.telenet.be/Jan.Van.hijfte/ ... pcqt4.html
Вы ее пробовали?
zub
долгожитель
 
Сообщения: 2887
Зарегистрирован: 14.11.2005 23:51:26

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

Сообщение Mirage » 02.03.2014 20:19:13

У меня тоже есть библиотечка контролов с как раз 3D бакендом к ней.
Ей от бакенда требуется только умение рисовать примитивы типа геом. фигур и текст.
По идее, в случае с LCL, дела обстоят приблизительно так же.
Вот с тесктом, пожалуй, сложнее всего.
Там рендеринг TTF и оптимизация этого дела наверное.
В ZenGL можно за кроссплатформенность глянуть.;)
Если есть заинтересованные, то может свою тему откроем?

Добавлено спустя 15 минут 44 секунды:
Посмотрел в lcl/interfaces. Печалька. Бакенд там занимается, похоже, всем чем можно. И сообщения и стандартные контролы и т.д. Выделенного отрисовочного бакенда, похоже, нет.
Не разбираясь во всех хитросплетениях и не подлезешь.
В общем, странная архитектура. Не удивительно, что "уже сколько пишутся и не в одну голову, а багов полнымполно".
Последний раз редактировалось Mirage 02.03.2014 20:35:49, всего редактировалось 1 раз.
Mirage
энтузиаст
 
Сообщения: 881
Зарегистрирован: 06.05.2005 20:29:07
Откуда: Russia

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

Сообщение zub » 02.03.2014 20:35:45

Mirage
lazfreetype читает ttf и выдает контура глифов, далее их можно рисовать как текстурой, так и как вектором.
Я его юзаю для векторного рисования ttf, но пришлось чуток попатчить - нехватало данных для форматирования текста, он не всё что есть в ttf хидере выдает наружу

>>Посмотрел в lcl/interfaces. Печалька. Бакенд там занимается, похоже, всем чем можно. И сообщения и стандартные контролы и т.д. Выделенного отрисовочного бакенда, похоже, нет.
я и говорю - это прослойка между тулкитом и LCL, а не просто рисовалка, при отсутствии тулкита (вернее при отсутствии в GL сообщений, контролов и т.п.) - всё придется сделать самостоятельно.
Глядите fpGUI, MSE - они "проще" - там всё свое и бакенд (если они там предусмотрены) будет заниматься только отрисовкой

>>В общем, странная архитектура. Не удивительно, что "уже сколько пишутся и не в одну голову, а багов полнымполно".
Нормальная архитектура расчитанная на системные контролы, а не на рисование всего самомтоятельно.
zub
долгожитель
 
Сообщения: 2887
Зарегистрирован: 14.11.2005 23:51:26

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

Сообщение MiniQ » 02.03.2014 20:47:37

zub писал(а):Вроде как имеется альфа биндинга qtpas для qt5 - http://users.telenet.be/Jan.Van.hijfte/ ... pcqt4.htmlВы ее пробовали?

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

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

Сообщение zub » 02.03.2014 20:51:31

>>но есть проблемы с выводом некоторых элементов интерфейса LCL
Можно подробнее? В одинокого или в сотрудничестве с разрабами лазаря?
Проблемы скорости отрисовки решились?
zub
долгожитель
 
Сообщения: 2887
Зарегистрирован: 14.11.2005 23:51:26

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

Сообщение MiniQ » 02.03.2014 21:17:37

zub писал(а):В одинокого или в сотрудничестве с разрабами лазаря?

сам
zub писал(а):Проблемы скорости отрисовки решились?

поскольку решение не рабочее (в боевом применении), на целевой системе не смотрел,
а прежде чем углубляться и доводить до ума - изучаю возможные варианты
MiniQ
новенький
 
Сообщения: 81
Зарегистрирован: 28.01.2013 16:31:55

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

Сообщение Mirage » 02.03.2014 21:57:25

zub писал(а):lazfreetype читает ttf и выдает контура глифов, далее их можно рисовать как текстурой, так и как вектором.


Ну, свой конвертер шрифтов в контуры я и не планировал, но оптимизированная отрисовка всего этого не так проста. Особенно когда текста много надо рисовать.

zub писал(а):я и говорю - это прослойка между тулкитом и LCL, а не просто рисовалка, при отсутствии тулкита (вернее при отсутствии в GL сообщений, контролов и т.п.) - всё придется сделать самостоятельно.
Глядите fpGUI, MSE - они "проще" - там всё свое и бакенд (если они там предусмотрены) будет заниматься только отрисовкой


Я понимаю, что прослойка. Но это ведь никак не отменяет слоя, занимающегося отрисовкой, особенно если есть бакенды, где все своё.
И каждый раз городить заново все эти сообщения, контролы и т.д. незачем.
fpGUI и смотрю. Не вижу там выделенного слоя отрисовки. Код, работающий с WinAPI зато вижу. :shock:

zub писал(а):Нормальная архитектура расчитанная на системные контролы, а не на рисование всего самомтоятельно.


Нормальная архитектура четко разделяет и изолирует функциональность.
Т.е. отдельно верхний слой, который все "врапит" - LCL.
Ниже слои-обертки.
Один из этих слоёв-обёрток, реализует самостоятельно логику GUI.
А еще ниже находится отрисовка, ввод и т.д. Отдельными модулями, разумеется.
И каждый из этих слоёв можно реализовывать отдельно, не вникая в тонкости остальных. Достаточно лишь реализовать интерфейс.
Вот это нормальная архитектура.
А тут своя логика, отрисовка и прочее, похоже, вместе склеены.
Mirage
энтузиаст
 
Сообщения: 881
Зарегистрирован: 06.05.2005 20:29:07
Откуда: Russia

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

Сообщение debi12345 » 02.03.2014 22:08:06

Не вижу там выделенного слоя отрисовки. Код, работающий с WinAPI зато вижу

Можно как в MSE использовать переключаемые (в зависмости от бэкэнда) указатели на функции отрисовки примитивов, см. аттач.

Добавлено спустя 3 минуты 31 секунду:
Нормальная архитектура четко разделяет и изолирует функциональность.

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

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

Сообщение zub » 02.03.2014 22:13:22

MiniQ
>>сам
Зря, по кпайней мере тему на англоязычеом форуме создать стоит, глядишь разработчики шевельнутся
>>поскольку решение не рабочее (в боевом применении), на целевой системе не смотрел,
Хитро, если прироста нет - всё теряет смысл
>>а прежде чем углубляться и доводить до ума - изучаю возможные варианты
ИМХО это самый доступный вариант.

Mirage
>>Я понимаю, что прослойка. Но это ведь никак не отменяет слоя, занимающегося отрисовкой, особенно если есть бакенды, где все своё.
>>И каждый раз городить заново все эти сообщения, контролы и т.д. незачем.
Нету слоя отрисовки)) рисуют тулкиты. И приходится городить - уж очень по разному реализуются все эти сообщения, контролы и т.д. в целевых тулкитах.
Я понимаю про что вы гворите, наличие например LCL-X11 бакенда сильно упростило бы жизнь при написании OpenGL бакенда - действительно, переписали бы только отрисовку. Но что есть, то есть((

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

Ну и в общем - даже написание "простейшего" TMemo который быстро распарсит по строкам и отрисует "гигабайтик" текста, а потом его поскролит и позволит отредактировать - очень нетривиальная задача((

Добавлено спустя 22 минуты 58 секунд:
debi12345
>>Выделение каждого нового "слоя" порождает маршаллинг = падение производителности.
Ну не все так плохо - был "инлайн" код какойнибудь канвас отрисовки, стал виртуальным методом канвас\опенгл - не настолко и падение, темболее для ГУЯ мы же не для z80 пишем))
Последний раз редактировалось zub 02.03.2014 22:39:47, всего редактировалось 1 раз.
zub
долгожитель
 
Сообщения: 2887
Зарегистрирован: 14.11.2005 23:51:26

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

Сообщение Mirage » 02.03.2014 22:37:26

debi12345 писал(а):Можно как в MSE использовать переключаемые (в зависмости от бэкэнда) указатели на функции отрисовки примитивов, см. аттач.


Зачем такие извращения? ООП отменили? Это же практически неподдерживаемо.

debi12345 писал(а):Выделение каждого нового "слоя" порождает маршаллинг = падение производителности.


Формально верно, но на практике все эти маршалинги занимают пренебрежимо мало времени по сравнению даже с одним внешним вызовом. Того же OpenGL, например.
Если конечно маршалинг не сделан через парсинг чего-нибудь+RTTI. Мало ли.

zub писал(а):Нету слоя отрисовки)) рисуют тулкиты. И приходится городить - уж очень по разному реализуются все эти сообщения, контролы и т.д. в целевых тулкитах.


Слой отрисовки есть, просто реализуется тулкитом.
Есть же свои реализации виджетов - fpGUI. Вот его можно было бы спроектировать нормально.
Нету же ресурсов, чтобы все заново писать по двадцать раз. Надо делать переиспользуемые модули.

zub писал(а):Ну и в общем - даже написание "простейшего" TMemo который быстро распарсит по строкам и отрисует "гигабайтик" текста, а потом его поскролит и позволит отредактировать - очень нетривиальная задача((


Зато интересная. Да и не надо там "гигабайтика". Хотя интереснее с "гигабайтиком" как раз.:)
Тут, кстати, тоже несколько слабосвязанных модулей должно быть. Как минимум:
1. структура данных, хранящая текст в удобном для работы виде
2. парсер
3. слой логики работы с текстом
4. собственно контрол, который сам не рисует, кстати, а дергает слой отрисовки ;)
И все переиспользуемо в других контролах.
Последний раз редактировалось Mirage 02.03.2014 22:57:55, всего редактировалось 1 раз.
Mirage
энтузиаст
 
Сообщения: 881
Зарегистрирован: 06.05.2005 20:29:07
Откуда: Russia

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

Сообщение debi12345 » 02.03.2014 22:55:14

Формально верно, но на практике все эти маршалинги занимают пренебрежимо мало времени по сравнению даже с одним внешним вызовом

Не скажите :) А закрутка/раскрутка стека при вызове функции в каждом слое, которая может занять в разы больше инструкций, чем вызов самой API-функции ?

стал виртуальным методом канвас\опенгл - не настолко и падение

?! Виртуалка = поиск и связывание в рантайме при КАЖДОМ вызове, самый тормозной вавариант.

темболее для ГУЯ мы же не для z80 пишем))

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

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

Сообщение Mirage » 02.03.2014 23:04:25

debi12345 писал(а):Не скажите :) А закрутка/раскрутка стека при вызове функции в каждом слое, которая может занять в разы больше инструкций, чем вызов самой API-функции ?
debi12345 писал(а):
Большинство промежуточных методов тривиальны и не требует стека. JVM так их вообще заинлайнить может, несмотря на виртуальность методов.
А вызов API-функций это работа с оборудованием. Вероятна смена контекста (ядро/пользовательский), а это тысячи тактов.
Да что там контекст, банальный кэш-промах дороже всех маршалингов будет.

Данная тема всплыла как раз для случая "Z80".


А актуальна для Z80. Для RPI с его 700 MHz + GPU, против ~4MHz у Z80, не актуальна.
Mirage
энтузиаст
 
Сообщения: 881
Зарегистрирован: 06.05.2005 20:29:07
Откуда: Russia

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

Сообщение zub » 02.03.2014 23:10:53

>>?! Виртуалка = поиск и связывание в рантайме при КАЖДОМ вызове, самый тормозной вавариант.
Поиск это определение контрола под мышкой)) а вызов виртуаального метода это всеголишь взятие адреса метода по известному смещению через 2 указателя - не бог весть какие затраты...
>>при КАЖДОМ вызове
Вызовы в гуе не такие частые. Мы в 21 веке живем - надо думать о удобстве поддержки, а не о 10ти "потеряных" тактах))
>>Данная тема всплыла как раз для случая "Z80".
Да ладно, тормозит у него совсем не по этому, а потому что рисовать надо привлекая GPU, а не ворочить байтики на CPU
zub
долгожитель
 
Сообщения: 2887
Зарегистрирован: 14.11.2005 23:51:26

Пред.След.

Вернуться в Lazarus

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

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

Рейтинг@Mail.ru