Как ускорить прорисовку векторной графики ?

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

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

Re: Как ускорить прорисовку векторной графики ?

Сообщение Лекс Айрин » 22.10.2016 09:19:26

Alex2013 писал(а):Верно, но как прорисовать одну вертикальную или горизонтальную полосу при скроллнге ?


Все придумано за нас. Если буфер будет чуть больше итогового изображения, то достаточно просто сдвинуть картинку относительно него. Но чуть! Пикселей на 10-20.

Alex2013 писал(а): То есть сохранить растровые "спрайты" с низкой детализацией и выводить их быстро, а потом в фоновом режиме незаметно строить все детально !


Боюсь, это будут очередные тормоза заметные пользователю. И, кстати, очень раздражающие.
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

Re: Как ускорить прорисовку векторной графики ?

Сообщение zub » 22.10.2016 16:08:14

>>Код прорисовки теперь такой...
Код: Выделить всё
Timer1Timer(Sender);//тут  сетку грида  рисует ...

Ты это, завязывай))

В онПаинт не должно быть подобного
Код: Выделить всё
   Buf_BMP:=TBitmap.Create;
   Buf_BMP.SetSize(PaintBox1.Width,PaintBox1.Height);

В онпаинт надо просто отрисовать то что требуется.
Развели тут теоретический флейм... Alex2013, без замеров производительности разговаривать бесполезно - ты просто не видишь что у тебя реально тормозит
zub
долгожитель
 
Сообщения: 2886
Зарегистрирован: 14.11.2005 23:51:26

Re: Как ускорить прорисовку векторной графики ?

Сообщение Alex2013 » 23.10.2016 00:58:04

zub писал(а):>>Код прорисовки теперь такой...
Код: Выделить всё
Timer1Timer(Sender);//тут  сетку грида  рисует ...

Ты это, завязывай))

Так я уже писал в чем дело... шут знает почему грид не прорисовывается при старте .
Сделал отложенный старт прорисовки через таймер.
А писать отдельную процедуру DrawGrid ради еще пары вызов было банально лень . :oops:
Впрочем уже действительно пара чистить код от подобных недоразумений . ..
В онПаинт не должно быть подобного
Код: Выделить всё
   Buf_BMP:=TBitmap.Create;
   Buf_BMP.SetSize(PaintBox1.Width,PaintBox1.Height);

В онпаинт надо просто отрисовать то что требуется.
Согласен ... Учту !
Развели тут теоретический флейм... Alex2013, без замеров производительности разговаривать бесполезно - ты
просто не видишь что у тебя реально тормозит

А вот тут не согласен ! В этой теме все очень даже практическое ...
Благодаря обсуждению уже сделал довольно неплохое ускорение перерисовки (Причем в разы, что видно невооруженным глазом. А после мозгового штурма попробовав несколько вариантов ускорил и скроллинг (Пусть не идеально но тоже в разы )
...и есть еще пара тройка идей как можно сделать еще быстрее ..
Так что спасибо ! Кроме шуток "Ваше мнение очень важно для нас " (с) какой-то старый сериал ... :roll:
Alex2013
долгожитель
 
Сообщения: 2943
Зарегистрирован: 03.04.2013 11:59:44

Re: Как ускорить прорисовку векторной графики ?

Сообщение zub » 23.10.2016 01:18:42

шут знает почему грид не прорисовывается при старте .
Сделал отложенный старт прорисовки через таймер.

Я бы на твоем месте подобные вещи никому не рассказывал))

Добавлено спустя 9 минут 52 секунды:
В этой теме все очень даже практическое ...

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

Ненадо идей. Вывод графики и оптимизация сего процесса это рутина - алгоритмы давно обкатаны, придумывать тут можно только головняки себе.
zub
долгожитель
 
Сообщения: 2886
Зарегистрирован: 14.11.2005 23:51:26

Re: Как ускорить прорисовку векторной графики ?

Сообщение Alex2013 » 23.10.2016 02:22:28

Феерично ... :wink: Тонкие намеки умело игнорируют ...
Так что скажу прямо: стиль "директивных советов" на форуме где "колхоз дело добровольное " смотрится ... гм мягко говоря достаточно странно . :idea:

1 Для меня свет клином на этом редакторе явно не сошелся . это вспомогательная часть другого проекта ( да сейчас я постараюсь его чуток "оживить" (просто для удобства его использования ) но повторяю даже для конкретно этого редактора гораздо важнее расширить набор элементов и тут мне пока едва-ли кто поможет (как минимум на этом форуме точно, потому что разговор об HTML (и рядом) тут злостный оффтоп )

+ Есть смутные перспективы вернутся к нему как к части проекта МидАсм .

2 Идеи очень хорошая вещь особенно когда они не плохо работают ... :idea: Но рутина это действительно еще лучше! Это означает, что в запасах личных навыков и отлаженных библиотеках уже есть все необходимое для реализации почти любых проектов . Но у меня такой полезной рутиной пока почти и не пахнет . Вот и приходится полагаться на идеи . И дело не в том что я "не слушаю советов амиго" , а в том, что они для меня все равно именно ИДЕИ, а не отбработанные навыки и готовый, адаптированный именно под мои нужды и стиль программирования, код .
Alex2013
долгожитель
 
Сообщения: 2943
Зарегистрирован: 03.04.2013 11:59:44

Re: Как ускорить прорисовку векторной графики ?

Сообщение zub » 23.10.2016 18:53:39

Так что скажу прямо: стиль "директивных советов" на форуме где "колхоз дело добровольное " смотрится ... гм мягко говоря достаточно странно . :idea:

Каких директивных советов? Использование баундинг боксов? Ну ты даешь))
Это в "коротких штанишках" получается не "мыслить глобально"((
zub
долгожитель
 
Сообщения: 2886
Зарегистрирован: 14.11.2005 23:51:26

Re: Как ускорить прорисовку векторной графики ?

Сообщение alexey38 » 24.10.2016 10:26:20

zub писал(а):>>Общую картину из метафайла сохраняли в файл emf/wmf, и импортировали в различные профессиональные векторыне редакторы типа Corel Draw и ему подобные. У нас все работало намного быстрее, чем в этих системах, причем довольно существенно.
Это не совсем честное сравнение emf/wmf - всё хранит в самых элементарных примитивах. соответственно "и ему подобные" имеют большую кучу элементарщины, вы же имеете эту элементащину скомпонованую в "блоки" более высокого уровня - что позволяет например отбросить всё внутренюю элементарщину проверив только видимость "блока". Набор "иерархичных" данных всегда предпочтительнее "одноуровнего"


Сравнение было вполне честным, потому что состояло из двух частей. А я описал только одну из них.

Другая часть - это собственно сравнение с той же самой схемой, нарисованной в этих самых Corel Draw. Чтобы нарисовать в нашей системе нам давались первоисточники в тех самых редакторах общего назначения. Мы перерисовывали это в нашей системе (там не импорт, а именно перерисовка, т.к. нужны были функциональные элементы для прикладных производственных задач) и сравнивали скорость работы графической подсистемы.

А кроме того, так как у нас все внутреннее рисование шло через TMetafile, то сохранить его в физический файл на диск было совсем не сложно. Соответственно легко было осуществить сравнение через импорт в тот же самый Corel Draw.

И тот и другой вариант тестирования показал на реальных примерах, что у нас работало все очень и очень быстро. Технологию я кратко описал в предыдущем сообщении, там как раз и была реализована схема однократного вывода изображения элемента в свой TMetafile, который потом отображался на общую схему (если попадал в зону видимости). Работа со схемами их тысяч элементов (десятки тысяч примитивов) была вполне комфортна даже компьютерах типа Pentium II/III/IV.
alexey38
долгожитель
 
Сообщения: 1627
Зарегистрирован: 27.04.2011 19:42:31

Re: Как ускорить прорисовку векторной графики ?

Сообщение zub » 24.10.2016 15:30:50

>>Работа со схемами их тысяч элементов (десятки тысяч примитивов) была вполне комфортна даже компьютерах типа Pentium II/III/IV.
Я про то и говорю - "идеи" враг Alex2013. Всё давным давно проидумано уже
zub
долгожитель
 
Сообщения: 2886
Зарегистрирован: 14.11.2005 23:51:26

Re: Как ускорить прорисовку векторной графики ?

Сообщение Linus » 05.11.2016 01:30:32

Здравствуйте! Вопрос интересует такой: можно ли как-то минуя Tbitmap рисовать на канве через массив. Т.е. связать канву и массив (возможно указателями), получив быстрый доступ к пикселям "напрямую"?

Примерно так:
Код: Выделить всё
var
...
p:Ponter;
...
begin
setlength(ColorArray,width,height);
p:=@ColorArray;

.....
ColorArray[x,y]:=$00FFFFFF;
...
end;
Linus
новенький
 
Сообщения: 47
Зарегистрирован: 11.01.2013 22:01:28

Re: Как ускорить прорисовку векторной графики ?

Сообщение Лекс Айрин » 05.11.2016 10:20:02

Linus, а смысл? TBitmap это и есть массив точек.
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

Re: Как ускорить прорисовку векторной графики ?

Сообщение Linus » 05.11.2016 13:55:09

Лекс Айрин писал(а):Linus, а смысл? TBitmap это и есть массив точек.


Задание есть задание, оно не обсуждается)
Linus
новенький
 
Сообщения: 47
Зарегистрирован: 11.01.2013 22:01:28

Re: Как ускорить прорисовку векторной графики ?

Сообщение Лекс Айрин » 05.11.2016 17:16:13

Linus, тогда низзя. особенность отрисовки компонент.
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

Re: Как ускорить прорисовку векторной графики ?

Сообщение Linus » 05.11.2016 18:40:00

Лекс Айрин писал(а):Linus, тогда низзя. особенность отрисовки компонент.



нет такого слова... если канва предоставляет доступ к пикселям как к массиву, есть память отведенная под это, то почему нельзя получить прямой доступ к этой области памяти?
Linus
новенький
 
Сообщения: 47
Зарегистрирован: 11.01.2013 22:01:28

Re: Как ускорить прорисовку векторной графики ?

Сообщение zub » 06.11.2016 21:21:26

>>если канва предоставляет доступ к пикселям как к массиву, есть память отведенная под это,
На основе чего такие утверждения?
>>то почему нельзя получить прямой доступ к этой области памяти?
Нету такой области памяти и нету прямого доступа к ней. Поздравляю с разморозкой из времен дос.

Считай какбудьто твой ColorArray это "прямой доступ к этой области памяти" - "рисуй" в него, а когда понадобится вывести на экран - создаш соответствующую тему))

Добавлено спустя 2 минуты 12 секунд:
>>(возможно указателями)
Почему указатели в неокрепших умах так боготворятся? это источник багов, а не волшебный инструмент
zub
долгожитель
 
Сообщения: 2886
Зарегистрирован: 14.11.2005 23:51:26

Re: Как ускорить прорисовку векторной графики ?

Сообщение Alex2013 » 07.11.2016 00:09:30

zub писал(а):>>если канва предоставляет доступ к пикселям как к массиву, есть память отведенная под это,
На основе чего такие утверждения?
>>то почему нельзя получить прямой доступ к этой области памяти?
Нету такой области памяти и нету прямого доступа к ней. Поздравляю с разморозкой из времен дос.

Считай какбудьто твой ColorArray это "прямой доступ к этой области памяти" - "рисуй" в него, а когда понадобится вывести на экран - создаш соответствующую тему))

Добавлено спустя 2 минуты 12 секунд:
>>(возможно указателями)
Почему указатели в неокрепших умах так боготворятся? это источник багов, а не волшебный инструмент

Все чуток сложнее видеопамять разумеется где-то есть и сейчас .. (Это про "Поздравляю с разморозкой из времен дос.")
Но дело не в том, что туда нельзя залезть дело в том, что канвас никак не связан с областью в видеопамяти.
Он но даже вообще может ничего нигде не рисовать в принципе (TMetaFileCanvas отличный пример !)
Но можно заставить нарисовать, что-то на картинке или например форме (причем во втором случае никакой памяти на уровне программы выделятся не будет ) А вот что происходит дальше зависит от механизмов GUI ,GDI и т.д. и т.п .
Зы
Насчет рисования на картинке (битмапе ) в обход доступа к пикселям, то в дельфи был доступ к строкам картинки .
Иногда это работало быстрее ... В LCL есть механизм Bitmap.RawImage но я с ним пока не разобрался ...
http://wiki.freepascal.org/Fast_direct_pixel_access
Alex2013
долгожитель
 
Сообщения: 2943
Зарегистрирован: 03.04.2013 11:59:44

Пред.След.

Вернуться в Lazarus

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

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

Рейтинг@Mail.ru