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

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

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

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

Сообщение Alex2013 » 18.10.2016 16:57:23

zub писал(а):>>Поиск пока смысла не имеет разве, что водить вычисление видимости на экране
Ну если ничего не имеет смысла, то что у тебя тормозит?
zub писал(а):Ты бы хоть определился сколько и чего ты планируешь рисовать. сколько ресурсов ты тратишь на это сейчас и сколько хотелось бы. Иначе все разговоры DirectDrawы, Опенгли - это демагогия.


Вывод увеличивающихся объемов обычной "линейной" графики и текста . То есть например нужно "интерактивно" подвинуть (пока это можно делать стрелками , а будущем можно будет и мышкой) некий элемент в середине списка на две сотни элементов (особенно если там есть картинки JPG читаемые из файла )то вместо плавной "анимации" получаются очень не красивые рывки .

Кстати, пришла идея ! Думаю можно при выборе элемента нарисовать изображение в два(точнее в три ) приема . До и после текущего элемента и отдельно сам элемент ... Дальше понятно есть "бекграунд" есть "фасад" а "в окне крадется гад" ... :mrgreen:
Последний раз редактировалось Alex2013 20.10.2016 02:02:22, всего редактировалось 2 раз(а).
Alex2013
долгожитель
 
Сообщения: 2923
Зарегистрирован: 03.04.2013 11:59:44

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

Сообщение zub » 18.10.2016 17:06:15

Двигай без полной перерисовки. получи "картинку" как твоя сцена выглядит без этого элемента и елозь элементом по "картинке" не перерисовывая всё и вся.
В дальнейшем - перед созданием подобных тем потрудись
Ты бы хоть определился сколько и чего ты планируешь рисовать. сколько ресурсов ты тратишь на это сейчас и сколько хотелось бы. Иначе все разговоры DirectDrawы, Опенгли - это демагогия.

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

Добавлено спустя 7 минут 20 секунд:
>>Кстати, пришла идея !
Это не идея. Идея будет когда дойдет что нужно юзать математику
zub
долгожитель
 
Сообщения: 2884
Зарегистрирован: 14.11.2005 23:51:26

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

Сообщение Alex2013 » 18.10.2016 17:21:52

zub писал(а):Двигай без полной перерисовки. получи "картинку" как твоя сцена выглядит без этого элемента и елозь элементом по "картинке" не перерисовывая всё и вся.


Тоже интересно ! :idea:
В дальнейшем - перед созданием подобных тем потрудись
Ты бы хоть определился сколько и чего ты планируешь рисовать. сколько ресурсов ты тратишь на это сейчас и сколько хотелось бы. Иначе все разговоры DirectDrawы, Опенгли - это демагогия.

и приводи конкретные циферки пжст.
[/quote]
"все разговоры DirectDrawы, Опенгли " не я начал ...
А вообще есть у меня несколько библиотек к КОЛ для DirectDrawа реально СИЛЬНО ускоряющих графику (разные спец эффекты,спрайты,"плазмы") так что в принципе это реально возможно .
и приводи конкретные циферки пжст.

Зачем если в соседней теме живьем лежит "проблемная" софтина ?
Прямую ссылку кинуть ? Это разумеется все упростит ...
(Кинул в шапку темы)
:idea: (На всякий пожарный в помощь тестерам ) "Закрепление" фигуры у меня сделано не тригером а правой кнопкой мыши ...
Последний раз редактировалось Alex2013 18.10.2016 17:35:52, всего редактировалось 1 раз.
Alex2013
долгожитель
 
Сообщения: 2923
Зарегистрирован: 03.04.2013 11:59:44

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

Сообщение zub » 18.10.2016 17:31:55

>>Зачем если в соседней теме живьем лежит
Ты думаешь комсуто это интересно и ктото быдет чтото рисовать и чтото бвигать? Спасение утопающих...
Если ссылка то там должно быть уже все нарисовано и присутствовать подробное описание что как и куда двигать
А делать это затем что
zub писал(а):Может пока будешь замерять за одно найдешь "узкое" место - оно у тебя на в выводе векторной графики совсем - или в скриптах или в руках))


Добавлено спустя 6 минут 24 секунды:
Тему Как ускорить прорисовку векторной графики ? я понимаю так - ты рисуешь 10е6 какихто штук и у тебя получается 61.9fps, а надо 60.
В итоге оказывается что ты рисуешь 3 линии и у тебя чтото гдето моргает... при чем тут вообще векторная графика?
zub
долгожитель
 
Сообщения: 2884
Зарегистрирован: 14.11.2005 23:51:26

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

Сообщение Alex2013 » 18.10.2016 17:50:20

zub писал(а):>>Зачем если в соседней теме живьем лежит
Ты думаешь комсуто это интересно и ктото быдет чтото рисовать и чтото бвигать? Спасение утопающих...
Если ссылка то там должно быть уже все нарисовано и присутствовать подробное описание что как и куда двигать
А делать это затем что
zub писал(а):Может пока будешь замерять за одно найдешь "узкое" место - оно у тебя на в выводе векторной графики совсем - или в скриптах или в руках))

Разумеется, несколько не сомневаюсь, что главный тормоз у меня в "слабо заточенной бритве Окама " ... :wink:
Просто я думаю что пару раз самому кликнуть мышкой проще чем понять "физический смыл " неких абстрактных цифр .
Дабы не вникать в особенности .. Ага "национального редактора" ... :D Загружаешь самую "продвинутую" тестовую картинку 43_5.lst там все "неотвратимо надвигающиеся тормоза" прекрасно видно ...

Ладно пойду я дальше "сказку делать былью" ... а то "завис" я тут что-то .
Alex2013
долгожитель
 
Сообщения: 2923
Зарегистрирован: 03.04.2013 11:59:44

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

Сообщение zub » 18.10.2016 18:08:58

>>неотвратимо надвигающиеся тормоза
Тормоза пришли уже при присутствии ~50ти простейших "элементов". Поздравляю, верной дорогой идете товарищи))
С такими "объемами" про деревья я загнул конечно. Перепиши что есть по человечески и всё будет летать
zub
долгожитель
 
Сообщения: 2884
Зарегистрирован: 14.11.2005 23:51:26

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

Сообщение serbod » 19.10.2016 11:23:18

Почитайте основы геймдева, там эта тема раскрыта вдоль и поперек.

Если кратко, то рисовать нужно не на TCanvas экранных контролов (даже DoubleBuffered), а в невидимых TCanvas или просто в буфере памяти. А в контрол копировать картинку целиком в OnDraw().

Есть много готовых библиотек для рисования: http://wiki.freepascal.org/Graphics_libraries
Колонка Vectors означает возможность манипуляции векторными примитивами в виде объектов, а просто отрисовка векторных элементов есть во всех библиотеках.
Сейчас хорошо развивается http://wiki.freepascal.org/BGRABitmap
Аватара пользователя
serbod
постоялец
 
Сообщения: 449
Зарегистрирован: 16.09.2016 11:03:02
Откуда: Минск

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

Сообщение DYUMON » 19.10.2016 20:05:41

А чего ссылка мертвая ?
Аватара пользователя
DYUMON
постоялец
 
Сообщения: 234
Зарегистрирован: 11.03.2009 13:32:54

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

Сообщение zub » 20.10.2016 00:15:28

Если кратко, то рисовать нужно не на TCanvas экранных контролов (даже DoubleBuffered), а в невидимых TCanvas или просто в буфере памяти. А в контрол копировать картинку целиком в OnDraw().

Это не относится к рисованию векторной графики. это восстановление изображение без "трудоемкой" перерисовки. Грамотно это сделать только штатными средствами LCL не получится - придется лезть на уровень пониже.
Грамотно = иметь возможность дорисовать чтонибудь перед восстановлением и не гонять постоянно данные между процом и видюхой (программой и видеосистемой).
Сейчас хорошо развивается http://wiki.freepascal.org/BGRABitmap

Емнип это софтварная рисовалка = медленно
Колонка Vectors означает возможность манипуляции векторными примитивами в виде объектов

Что имеется ввиду под манипуляциями? просто наличие графических примитивов? или функцмм векторного редактора? если последнее, то нет, вы чтото путаете
zub
долгожитель
 
Сообщения: 2884
Зарегистрирован: 14.11.2005 23:51:26

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

Сообщение Alex2013 » 20.10.2016 00:25:59

Вообщем как обещал "сказка стала былью" .. :)
Ускорение с "буферными" метафайлами даже сделанное в первом приближении работает на удивление наглядно .
Что особенно приятно ничего глобального в коде менять не пришлось .
Недостаток один высокая чувствительность к размеру окна (особенно по горизонтали ) .
Код: Выделить всё
//705********************************
// Прорисовка списка фигур
//********************************

{META2}
procedure TRF1.PaintBox1Paint(Sender: TObject);
var I,cc,cb:Integer;
    Buf_BMP:TBitmap;
    R:Trect;
    MC:TMetafileCanvas;
    MyMetafile: TMetafile;
    Const
      FMD:Boolean=True;
      FADD:Boolean=True;
begin
//Установить текущий  Canvas
   Buf_BMP:=TBitmap.Create;
   Buf_BMP.SetSize(PaintBox1.Width,PaintBox1.Height);
   CurCanvas:=Buf_BMP.Canvas;
   CurCanvas.Clear;
   CurCanvas.Pen.Color:= 0;
   CurCanvas.Brush.Color:=  RedColor0;
   CurCanvas.Clear;
//Timer1Timer(Sender);
R:=RECT(0,0,PaintBox1.Width-1,PaintBox1.Height-1);

if DrawList<>NIL then
  if DrawList.Count >0 then begin

  If MetaDrawList = Nil Then MetaDrawList:=Tlist.Create ;//Список мета файлов .
  If ShadowDrawList  = Nil Then
                                 Begin
                                      ShadowDrawList:=TStringlist.Create ;//"Теневой " список команд файлов .
                                      ShadowDrawList.Text:=DrawList.Text;
                                end;
//Если  в списке бльше одной фигуры ...
if DrawList.Count>1 then
For I:=0 TO DrawList.Count-2 DO
Begin
.// Признаю проверка условий сделана "оригинально" но мне показалось что так нагляднее   
FADD :=FmD Or  (I > ShadowDrawList.Count-1);
FADD := FADD Or  (I > MetaDrawList.Count-1);
FADD := FADD Or  (ShadowDrawList[I] <> DrawList[I]);
FADD := FADD Or  (TMetafile(MetaDrawList[i]).Width<>PaintBox1.Width);
FADD := FADD Or  (TMetafile(MetaDrawList[i]).Height<>PaintBox1.Height);

If FADD Then
  begin

  // Инициализирую метафайл ...
   MyMetafile := TMetafile.Create;
   MyMetafile.Width:=PaintBox1.Width;
   MyMetafile.Height:=PaintBox1.Height;
   MC:= TMetafileCanvas.CreateWithComment(MyMetafile, Buf_BMP.Canvas.handle,
   'Author', 'Made This');
   CurCanvas:=MC;//Перенаправляю Canvas

     DrawFig(-1,DrawList[i]);// Рисую фигуру можно сказать вызываю скриптовый "рендер" :idea:

   MC.Free; //! Обязательно очищать MetafileCanvas  перед "клонированием" ...
// Конец работы метафайла ...

//Размещение  метафайла в списке .
If FmD then MetaDrawList.Add(MyMetafile) else
               if I<=MetaDrawList.Count-1 then begin
                                       TMetafile(MetaDrawList[i]).Free;
                                       MetaDrawList[i]:=MyMetafile;
                                       end else
                                        if  I=MetaDrawList.Count  then
                                                      MetaDrawList.Add(MyMetafile);
// Рисую раз
CurCanvas:=Buf_BMP.Canvas;
CurCanvas.Draw(0,0,TMetafile(MetaDrawList[i])); //draw normal
  end else
begin
// Рисую два (Тут только из списка метафайлов  )
  CurCanvas:=Buf_BMP.Canvas;
  CurCanvas.Draw(0,0,TMetafile(MetaDrawList[i])); //fast draw
  end
end ;

FMD:=False ;
FADD:=True ;
ShadowDrawList.Text:=DrawList.Text;

//SaveBuf;
  BufBMP.Canvas.CopyRect( R , CurCanvas,  R );//!!
  DrawFig(-1, DrawList[DrawList.Count-1]);
  Listbox1.Items.Text:=DrawList.Text;
end;
// Копирую буфер на экран
PaintBox1.Canvas.CopyRect(  R , Buf_BMP.Canvas,  R );

CurCanvas:=PaintBox1.Canvas;  // Востанавливаю текущий канвас
Buf_BMP.Free; // Очистка буфера
end;
Последний раз редактировалось Alex2013 20.10.2016 00:41:04, всего редактировалось 1 раз.
Alex2013
долгожитель
 
Сообщения: 2923
Зарегистрирован: 03.04.2013 11:59:44

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

Сообщение zub » 20.10.2016 00:39:57

Переназови тему например "Как избавиться от тормозов связаных с паскальскриптом" Я надеюсь ты его не компилируешь каждый раз?
Код: Выделить всё
procedure TRF1.PaintBox1Paint(Sender: TObject);

Всякие отмазки про концепт и сырость принимаются. но вообще рукалицо))
zub
долгожитель
 
Сообщения: 2884
Зарегистрирован: 14.11.2005 23:51:26

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

Сообщение Alex2013 » 20.10.2016 00:48:58

zub писал(а):Переназови тему например "Как избавиться от тормозов связаных с паскальскриптом" Я надеюсь ты его не компилируешь каждый раз?
Код: Выделить всё
procedure TRF1.PaintBox1Paint(Sender: TObject);

))


но вообще рукалицо)
Верю ! :wink:
Но работает ( причем почти с первого запуска )! Вот что главное !
А компилируется или нет скрипт на удивление разницы не видно (процентов 10% и то не всегда )... Сам много раз удивлялся ....
Узкое место первое чтение с диска + собственно работа скрипта .
Последний раз редактировалось Alex2013 20.10.2016 00:54:25, всего редактировалось 1 раз.
Alex2013
долгожитель
 
Сообщения: 2923
Зарегистрирован: 03.04.2013 11:59:44

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

Сообщение zub » 20.10.2016 00:54:11

Работает ( причем почти с первого запуска )! Вот что главное !

Добавь на форму второй "контрол" с другим "рисунком".
Главное это легкость поддержки. А работает - это чудо, а не главное))
zub
долгожитель
 
Сообщения: 2884
Зарегистрирован: 14.11.2005 23:51:26

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

Сообщение Alex2013 » 20.10.2016 01:03:41

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

Добавь на форму второй "контрол" с другим "рисунком".
Главное это легкость поддержки. А работает - это чудо, а не главное))


Для юзергов скрипты предусмотрены ... А вообще в самом деле из за метофайлов получился очень громоздкий фрагмент .
Хуже его только MouseDown и MouseMove . (Так сказать "исторически сложившийся код" :wink: )
А тут хоть понятно что куда прятать .
ЗЫ
Сейчас выложу бинарник можно будет сравнить со старой версией ..
Но могу сказать сразу идея 100% работает .
... Вот уже выложил ... :arrow: viewtopic.php?p=102244#p102244
Alex2013
долгожитель
 
Сообщения: 2923
Зарегистрирован: 03.04.2013 11:59:44

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

Сообщение serbod » 20.10.2016 10:55:15

DYUMON писал(а):А чего ссылка мертвая ?

Вероятно, Россвязьнадзор заблокировал. Попробуйте через прокси.

zub писал(а):Это не относится к рисованию векторной графики. это восстановление изображение без "трудоемкой" перерисовки. Грамотно это сделать только штатными средствами LCL не получится - придется лезть на уровень пониже.

Векторная графика проецируется на обычный битмап, причем желательно с межпиксельным сглаживанием. Стандартный TCanvas на визуальных контролах постоянно дергает блокировку контекста GUI, провоцирует перерисовку и многие другие гадости. А на невизуальных все происходит гораздо быстрее.

zub писал(а):BGRABitmap Емнип это софтварная рисовалка = медленно

Пусть название вас не смущает, это уже давно не простой Bitmap.

zub писал(а):Что имеется ввиду под манипуляциями? просто наличие графических примитивов? или функцмм векторного редактора? если последнее, то нет, вы чтото путаете

Это значит, что можно создавать "сцену" из векторных объектов (как в Corel), манипулировать ими по отдельности, делать импорт/экспорт в векторные форматы файлов.
Аватара пользователя
serbod
постоялец
 
Сообщения: 449
Зарегистрирован: 16.09.2016 11:03:02
Откуда: Минск

Пред.След.

Вернуться в Lazarus

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

Сейчас этот форум просматривают: Google [Bot], Yandex [Bot] и гости: 24

Рейтинг@Mail.ru