Быстрая отрисовка

Вопросы программирования на Free Pascal, использования компилятора и утилит.

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

Re: Быстрая отрисовка

Сообщение zub » 10.05.2018 21:09:14

>>или использовать компонент OpenGLContext;
нет такого компонента.

Вот небольшой тестик разных способов отрисовки (gdi,gdi+,agg,ogl) мне была интересна простая отрисовка линий, поэтому в тесте только линии.
в Form1.OpenGLPaint можно посмотреть настройку матриц для попиксельного соответствия gl<->canvasas
У вас нет необходимых прав для просмотра вложений в этом сообщении.
zub
долгожитель
 
Сообщения: 2389
Зарегистрирован: 14.11.2005 23:51:26

Re: Быстрая отрисовка

Сообщение Alex2013 » 10.05.2018 23:17:00

zub писал(а):>>или использовать компонент OpenGLContext;
нет такого компонента.

OpenGLContext;- название модуля
OpenGLControl1: TOpenGLControl; класс
Пакет ...
Author: Mattias Gaertner
Description / Abstract: Simple cross-platform OpenGL viewer control
Filename: D:\lazarus\components\opengl\lazopenglcontext.lpk
Current state: installed, RunAndDesignTime

Что непонятного то ? :roll: Не точно название сказал ? Ну извиняюсь ...

Вот небольшой тестик разных способов отрисовки (gdi,gdi+,agg,ogl) мне была интересна простая отрисовка линий, поэтому в тесте только линии.
в Form1.OpenGLPaint можно посмотреть настройку матриц для попиксельного соответствия gl<->canvasas

Вот за это спасибо ! Мне тоже интересно .... :idea:
Зы
Кстати в какой версии Лазаря это чудо собирать ? (в 1.6 что на планшете стоит не собирается )
Последний раз редактировалось Alex2013 10.05.2018 23:55:23, всего редактировалось 1 раз.
Alex2013
энтузиаст
 
Сообщения: 864
Зарегистрирован: 03.04.2013 11:59:44

Re: Быстрая отрисовка

Сообщение zub » 10.05.2018 23:47:14

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

Re: Быстрая отрисовка

Сообщение Alex2013 » 11.05.2018 00:05:02

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


1 Тут согласен ... метафайлы просто мене зависимы от размера рабочего поля( Вначале с такого "горя" пытался сделать "собственную версию метафайла" ) Шут знает почему но вывод с метафайлми идет быстрее .
2 Вообще интересная идея сделать альтернативный режим рисования с OpenGL но есть сомнения получится "совместить" все примитивы, зато как классно можно делать масштабирование всего рабочего поля ! :idea:
Последний раз редактировалось Alex2013 11.05.2018 00:12:59, всего редактировалось 1 раз.
Alex2013
энтузиаст
 
Сообщения: 864
Зарегистрирован: 03.04.2013 11:59:44

Re: Быстрая отрисовка

Сообщение zub » 11.05.2018 00:05:43

>>Кстати в какой версии Лазаря это чудо собирать ? (в 1.6 что на планшете стоит не собирается )
Чудо это когда говоришь что неработает и не говоришь сообщение об ошибке, но зачемто рассказываешь где оно стоит
Собирать надо в актуальной на текущий момент версии. Если нравятся постарше, убери модную строчку "DesignTimePPI = 113" из lfm, и незабудт при этом почистить lib
zub
долгожитель
 
Сообщения: 2389
Зарегистрирован: 14.11.2005 23:51:26

Re: Быстрая отрисовка

Сообщение Alex2013 » 11.05.2018 00:13:54

zub писал(а):>>Кстати в какой версии Лазаря это чудо собирать ? (в 1.6 что на планшете стоит не собирается )
Чудо это когда говоришь что неработает и не говоришь сообщение об ошибке, но зачемто рассказываешь где оно стоит
Собирать надо в актуальной на текущий момент версии. Если нравятся постарше, убери модную строчку "DesignTimePPI = 113" из lfm, и незабудт при этом почистить lib


Ок ! :idea:
Просто на планшете редко что-то программирую вот и завалялось старье ...

Мда ! :idea:
Код: Выделить всё
Draw 10000 random lines
OpenGL  :.....15 msec
Canvas  :....161 msec
...AGG  :...3672 msec
GDIPlus :...5168 msec

Canvas: 161 msec - "серебряный призер" однако :lol:

Ps
Надо будет добавить "битовую графику" и ОpenCV (есть мысль что он "всех порвет" )
Последний раз редактировалось Alex2013 11.05.2018 01:55:42, всего редактировалось 6 раз(а).
Alex2013
энтузиаст
 
Сообщения: 864
Зарегистрирован: 03.04.2013 11:59:44

Re: Быстрая отрисовка

Сообщение zub » 11.05.2018 00:35:15

у агг линии там чуток антиалиаснутые, поэтому его результат необъективен. Но всеравно ускоренные на гпу варианты (canvas, dx, ogl...) всегда превзойдут "ускоренные" процом

Добавлено спустя 2 минуты 39 секунд:
добавь вместо агг свой вариант. но только чтобы это было чесное рисование в памяти, а не gdi через канвас

Добавлено спустя 56 секунд:
>> и ОpenCV (есть мысль что он "всех порвет" )
сомневаюсь. он совсем непроэто
zub
долгожитель
 
Сообщения: 2389
Зарегистрирован: 14.11.2005 23:51:26

Re: Быстрая отрисовка

Сообщение Alex2013 » 11.05.2018 01:10:19

"Битовый" вариант на "скорую руку" 1184 msec Бронза ! :lol:
(Ожидаемо бо рисование линий "никакое")
Код: Выделить всё
  procedure DrawLine(Var BB:TBitmap;x1,y1, x2,y2: Integer);
  var b,dx,dy,y,x,i:integer;
  begin
    dx:=abs(x2-x1);
    dy:=abs(y2-y1);

    if dx >= dy then
    begin
      if (x1<x2) then
        for i := x1 to x2 do
        begin
          y:=Round(((y2-y1)/(x2-x1))*i + (y1-x1*((y2-y1)/(x2-x1))));
          SetPix(BB,i,y,$FF);
        end;

      if (x2<x1) then
        for i := x2 to x1 do
        begin
          y:=Round(((y2-y1)/(x2-x1))*i + (y1-x1*((y2-y1)/(x2-x1))));
          SetPix(BB,i,y,$FF);
        end;
    end;

    if dx<dy then
    begin
      if (y1<y2) then
        for i := y1 to y2 do
        begin
          x:=Round(((x2-x1)/(y2-y1))*i + (x1-y1*((x2-x1)/(y2-y1))));
          SetPix(BB,x,i,$FF);
        end;

      if (y2<y1) then
        for i := y2 to y1 do
        begin
          x:=Round(((x2-x1)/(y2-y1))*i + (x1-y1*((x2-x1)/(y2-y1))));
          SetPix(BB,x,i,$FF);
        end;
    end;



OpenCV про быструю обработку видео потока ... странно если там линии рисовались бы сильно медленно ... Хотя все может быть !

Ps
Чуть "оптимизировал" и получил 882 msec ! Ура мне ! :lol: :lol: :lol:
Текущий рекорд
Draw 10000 random lines
OpenGL: 15 msec
Bayte...: 878 msec
..AGG...: 3721msec
GDIPlus : 5414 msec
Честно включил TPanel(Sender).Canvas.Draw(0,0,bb); в учет времени...
Alex2013
энтузиаст
 
Сообщения: 864
Зарегистрирован: 03.04.2013 11:59:44

Re: Быстрая отрисовка

Сообщение zub » 11.05.2018 11:20:49

написав брезенхема, заменив SetPix на манипуляции непосредственно с указателем на пиксел, распаралелив отрезки по потокам - может ты и обойдешь канвас на своем планшете. на нормальной видеокарте - наврятли. Только зачем оно надо?

Добавлено спустя 3 минуты 28 секунд:
OpenGL driver info: NVIDIA Corporation GeForce GTX 680/PCIe/SSE2 4.6.0 NVIDIA 397.31
Draw 10000 random lines
Canvas: 12msec
GDIPlus: 458msec
AGG: 714msec
OpenGL: 2msec

мои цифры
zub
долгожитель
 
Сообщения: 2389
Зарегистрирован: 14.11.2005 23:51:26

Re: Быстрая отрисовка

Сообщение Alex2013 » 11.05.2018 12:27:25

Порядок чисел совершенно то-же самый ...
От "образца"(OpenGL) что канвас что мой кривой "бинарный метод" ( SetPix - как раз "работает напрямую с указателем" ) на порядок отличается, а все прочие на два . Особенно проседает GDIPlus что предсказуемо ... (Кстати странно что у тебя он быстрее )

Зы
Планшет так себе: Проц Intel Atom X5-Z8300 (Intel Cherry Trail)(Чистота Максимум 1.84 ГГц рабочая 1.44 ГГц ) / RAM 2 ГБ :cry:
OpenGL driver info: Intel Intel(R) HD Graphics 4.4.0 - Build 20.19.15.4474Д
Драйвер на планшете нуждается обновлении но сильно сомневаюсь что эта операция сделает его быстрее .
Alex2013
энтузиаст
 
Сообщения: 864
Зарегистрирован: 03.04.2013 11:59:44

Re: Быстрая отрисовка

Сообщение zub » 11.05.2018 13:10:37

>>SetPix - как раз "работает напрямую с указателем"
В каком месте это он работает напрямую?
Выкладывай свой вариант, вспомню спектрумовское детство, сделаю:
Canvas:
Alex byte:
zub byte:
OpenGL:
Зря ты канвас выкинул, это какраз ориентир. агг и гди+ - никуда негодно
zub
долгожитель
 
Сообщения: 2389
Зарегистрирован: 14.11.2005 23:51:26

Re: Быстрая отрисовка

Сообщение Alex2013 » 11.05.2018 13:31:34

zub писал(а):>>SetPix - как раз "работает напрямую с указателем"
В каком месте это он работает напрямую?
Выкладывай свой вариант, вспомню спектрумовское детство, сделаю:
Canvas:
Alex byte:
zub byte:
OpenGL:
Зря ты канвас выкинул, это какраз ориентир. агг и гди+ - никуда негодно

Да на предыдущей странице ты же сам его забраковал (и я почти согласился: так делать не стоит по множеству причин ).
Но даже так получается быстрее чем GDI и Аgg
Код: Выделить всё
Procedure SetPix(Var BB:TBitmap;X,Y,C:Integer);
Type
TA=Array[0..1] of byte;
var
PA:^TA;
n:integer;
begin
if bb = NIL then exit;
if not InR(x,0,bb.Width-1) then exit;
if not InR(y,0,bb.Height-1) then exit;

//Bb.BeginUpdate; ;
pa:=Pointer(BB.RawImage.Data);
N:=Y*(BB.Width*3)+X*3;
pa^[n]  :=Blue(C);
pa^[n+1]:=Green(C);
pa^[n+2]:=red(C);
//Bb.EndUpdate;
end;                 
Последний раз редактировалось Alex2013 11.05.2018 13:36:54, всего редактировалось 1 раз.
Alex2013
энтузиаст
 
Сообщения: 864
Зарегистрирован: 03.04.2013 11:59:44

Re: Быстрая отрисовка

Сообщение zub » 11.05.2018 13:36:50

выложи свой вариант gditest. в мозаику из кусочков я не играю
zub
долгожитель
 
Сообщения: 2389
Зарегистрирован: 14.11.2005 23:51:26

Re: Быстрая отрисовка

Сообщение Pavia » 11.05.2018 13:38:25

Alex2013
Чёто у вас медленно.
Вот у меня линии рисуются на ровне с GDI в Delphi чутка быстрее в лазарусе медленнее.
16-20 мс
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Аватара пользователя
Pavia
постоялец
 
Сообщения: 210
Зарегистрирован: 07.01.2011 12:46:51

Re: Быстрая отрисовка

Сообщение Alex2013 » 11.05.2018 13:42:43

Код: Выделить всё
//бывший GDI (сделано вчера за десять минут по этому совсем не фонтан )
procedure TForm1.GDIPaint(Sender: TObject);
var
  i:integer;
  w,h:integer;
  LPTime:Tdatetime;
  tv1,tv2:GDBVertex;
  Function InR(AA,B,C:Longint):Boolean;
begin
InR:=((AA>=B) And (AA<=C));
End;

// Только 24 Бита !
Procedure SetPix(Var BB:TBitmap;X,Y,C:Integer);
Type
TA=Array[0..1] of byte;
var
PA:^TA;
n:integer;
begin
if bb = NIL then exit;
if not InR(x,0,bb.Width-1) then exit;
if not InR(y,0,bb.Height-1) then exit;

//Bb.BeginUpdate; ;
pa:=Pointer(BB.RawImage.Data);
N:=Y*(BB.Width*3)+X*3;
pa^[n]  :=Blue(C);
pa^[n+1]:=Green(C);
pa^[n+2]:=red(C);
//Bb.EndUpdate;
end;

  procedure DrawLine(Var BB:TBitmap;x1,y1, x2,y2: Integer);
  var b,dx,dy,y,x,i:integer;
  begin
    dx:=abs(x2-x1);
    dy:=abs(y2-y1);

    if dx >= dy then
    begin
      if (x1<x2) then
        for i := x1 to x2 do
        begin
          y:=Round(((y2-y1)/(x2-x1))*i + (y1-x1*((y2-y1)/(x2-x1))));
          SetPix(BB,i,y,$FF);
        end;

      if (x2<x1) then
        for i := x2 to x1 do
        begin
          y:=Round(((y2-y1)/(x2-x1))*i + (y1-x1*((y2-y1)/(x2-x1))));
          SetPix(BB,i,y,$FF);
        end;
    end;

    if dx<dy then
    begin
      if (y1<y2) then
        for i := y1 to y2 do
        begin
          x:=Round(((x2-x1)/(y2-y1))*i + (x1-y1*((x2-x1)/(y2-y1))));
          SetPix(BB,x,i,$FF);
        end;

      if (y2<y1) then
        for i := y2 to y1 do
        begin
          x:=Round(((x2-x1)/(y2-y1))*i + (x1-y1*((x2-x1)/(y2-y1))));
          SetPix(BB,x,i,$FF);
        end;
    end;

   // Form1.Image1.Picture.Bitmap.Assign(bmp);
  end;
Const BB:TBitmap=nil;
  begin


     w:=TPanel(Sender).Width;
     h:=TPanel(Sender).Height;
     needtransform:=CheckBox1.Checked;
//     If bb=nil then begin
      BB:=TBitmap.Create;
      bb.PixelFormat:=pf24bit;
      bb.SetSize(w,h);

  //   end;
Bb.BeginUpdate; ;
     LPTime:=now();
     for i:=1 to SpinEdit1.Value do
     begin
          tv1:=GetRandomVertex(w,h,w);
          tv2:=GetRandomVertex(w,h,w);
      DrawLine(BB,round(tv1.x),round(tv1.y),round(tv2.x),round(tv2.y));

         // TPanel(Sender).canvas.Line(round(tv1.x),round(tv1.y),round(tv2.x),round(tv2.y));
     end;
  Bb.EndUpdate;
       TPanel(Sender).Canvas.Draw(0,0,bb);
     lptime:=now()-LPTime;


     bb.Free;
     Label1.Caption:=' Byte : '+inttostr(round(lptime*10e7))+'msec';
     processresult;
end;


Кстати забавная реакция на изменение масштаба: в "полноэкранном режиме" OpenGl работает даже быстрее
Зы
Где-то сидит ошибка (линии сдвигаются ) но для теста скорости это без разницы...

Добавлено спустя 33 минуты 14 секунд:
Pavia писал(а):Alex2013
Чёто у вас медленно.
Вот у меня линии рисуются на ровне с GDI в Delphi чутка быстрее в лазарусе медленнее.
16-20 мс


Ну так линии боле умно сделаны + маленький чит : окошко меньше. :wink:
Alex2013
энтузиаст
 
Сообщения: 864
Зарегистрирован: 03.04.2013 11:59:44

Пред.След.

Вернуться в Free Pascal Compiler

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

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

Рейтинг@Mail.ru