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

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

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

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

Сообщение Alex2013 » 14.05.2018 19:13:26

Pavia писал(а):Alex2013
Спасибо за бдительность
Alex2013 писал(а):Антивирус ругается .... Trojan:Win32/Spursint.F!cl

https://www.virustotal.com/ru/file/e5d4 ... 526302430/
https://www.virustotal.com/ru/file/c283 ... 526302279/
Думаю ложные срабатывания. У меня антивирус молчит.

:arrow: https://bitbucket.org/Pavia00/gditest/src/master/
:idea: ПС. Осваеваем джит.


Я тоже так думаю ... (Выкачал по файлу через смотрелку Яндекса - антивирус молчит .) но паранойя разыгралась Ага "весеннее обострение " :mrgreen: Брр.. устроил "ручной шмон" 8) обнаружил ни на что ссылающийся запись в авто запуске... :shock:а тут журнал не чистится... и т.д. :wink: Но все хорошо, что хорошо кончается ! Зато АдБолк поставил ! :D
Зы
[OFF_ТОP]
Интересно, а могут вирусы на архив цепляться? На JPG картинки вроде могут ... (Пару раз было что при скачивании с разных шар скачивался вообще левый файл ... возможно "рыбный скрипт" подхваченный на другом сайте меняете ссылку... но это ерунда если архив ничего при просмотре содержимого сделать не может... а вот если там эксплойт для архиватора зашит ... это может быть куда хуже ! )

Добавлено спустя 42 минуты:
Старый тест !
OpenGL driver info: Intel Intel(R) HD Graphics 4.4.0 - Build 20.19.15.4549
Draw 10000 random lines
Alex Byte : 429 msec
Canvas : 133 msec
Zub Byte : 90 msec
OpenCV : 39 msec
OpenGL : 8 msec

Новый тест !

OpenGL driver info: Intel Intel(R) HD Graphics 4.4.0 - Build 20.19.15.4549
Draw 10000 random lines
Alex Byte : 242 msec
Canvas : 137 msec
Lazy : 62 msec
Zub Byte : 52 msec
OpenCV : 25 msec
OpenGL: 10 msec

Планшет тот-же но дрова обновил ...
Alex2013
долгожитель
 
Сообщения: 2922
Зарегистрирован: 03.04.2013 11:59:44

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

Сообщение zub » 14.05.2018 23:23:34

Это конечно бесполезено, но... выходим в лидеры велопробега
Код: Выделить всё
OpenGL driver info: NVIDIA Corporation GeForce GTX 680/PCIe/SSE2 4.6.0 NVIDIA 397.31
Draw [b]1000000[/b] random lines
Canvas: 5196msec
Alex Byte : 5064msec
Zub Byte : 851msec
Lazy : 1428msec
OpenGL: 59msec

с -O4 выходит быстрее OpenCV
Код: Выделить всё
OpenGL driver info: NVIDIA Corporation GeForce GTX 680/PCIe/SSE2 4.6.0 NVIDIA 397.31
Draw [b]1000000[/b] random lines
Canvas: 5119msec
OpenCV : 792msec
Zub Byte : 729msec
Lazy : 1292msec
OpenGL: 53msec


патчик
Код: Выделить всё
unit1.pas | 51 ++++++++++++++++++++++++++++-----------------------
1 file changed, 28 insertions(+), 23 deletions(-)

diff --git a/unit1.pas b/unit1.pas
index cf11fda..9d04d88 100644
--- a/unit1.pas
+++ b/unit1.pas
@@ -387,23 +387,22 @@ end;


procedure TForm1.ZubPaint(Sender: TObject);
-
+  type TRGB=packed record r,g,b:byte;end;
+       PTRGB=^TRGB;
   Procedure Swap(var x,y:Integer);
   var t:Integer;
   begin
     t:=x;x:=y;y:=t;
   end;

-  Procedure putpoint(pd:pbyte;cl:Longint);
-  type TRGB=packed record r,g,b:byte;end;
-      PTRGB=^TRGB;
+  function ColorToBGR(Color: TColor): Longint;
   var
      t:byte;
   begin
-    t:=PTRGB(@cl)^.b;
-    PTRGB(@cl)^.b:=PTRGB(@cl)^.r;
-    PTRGB(@cl)^.r:=t;
-    PTRGB(pd)^:=PTRGB(@cl)^;
+    result:=ColorToRGB(Color);
+    t:=PTRGB(@result)^.b;
+    PTRGB(@result)^.b:=PTRGB(@result)^.r;
+    PTRGB(@result)^.r:=t;
   end;

   function Align4(value:integer):integer;
@@ -427,20 +426,26 @@ procedure TForm1.ZubPaint(Sender: TObject);
           check:=1;
       end;
       e:= 2*dy - dx;
-      for i:=0 to dx do begin
-          putpoint(pdata,cl);
-          if e>=0 then begin
-              if check=1 then
-                             inc(pdata,sx)
-                         else
-                             inc(pdata,sy);
-              dec(e,2*dx);
-          end;
-          if check=1 then
-                         inc(pdata,sy)
-                     else
-                         inc(pdata,sx);
-          inc(e,2*dy);
+      if check=1 then begin
+        for i:=0 to dx do begin
+            PTRGB(pdata)^:=PTRGB(@cl)^;
+            if e>=0 then begin
+                inc(pdata,sx);
+                dec(e,2*dx);
+            end;
+            inc(pdata,sy);
+            inc(e,2*dy);
+        end;
+      end else begin
+        for i:=0 to dx do begin
+            PTRGB(pdata)^:=PTRGB(@cl)^;
+            if e>=0 then begin
+                inc(pdata,sy);
+                dec(e,2*dx);
+            end;
+            inc(pdata,sx);
+            inc(e,2*dy);
+        end;
       end;
    end;

@@ -461,7 +466,7 @@ begin
      Bitmap1.SetSize(w,h);
      Bitmap1.Canvas.Brush.Color:=clRed;
      Bitmap1.Canvas.FillRect(0,0,w,h);
-     cl:=ColorToRGB(clBlue);
+     cl:=ColorToBGR(clBlue);

      LPTime:=now();
      Bitmap1.BeginUpdate;

просто убрал проверку внутри цикла и перестановку цветовых составляющих. ну и раз теперь процедура установки пиксела из одной строки я ее заинлайнил хардкодно (inline имхо в тестах не академично)

Добавлено спустя 28 минут 26 секунд:
>>У Zub был выход за приделы массива, добавил выравнивание.
Спасибо. Извиняюсь, но я не тестирую - с виду работает - и вперед))

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

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

Сообщение Alex2013 » 15.05.2018 00:37:38

"Как украсть миллион ?" :D :D :D :D
OpenGL driver info: Intel Intel(R) HD Graphics 4.4.0 - Build 20.19.15.4549
Draw 1 000 000 random lines
Код: Выделить всё
Canvas    : 13737 msec
Lazy      : 5337 msec
Zub Byte  : 4942 msec
Alex Byte : 2328 msec
OpenGL    : 476 msec


OpenGL driver info: Intel Intel(R) HD Graphics 4.4.0 - Build 20.19.15.4549
Draw 1000000 random lines
Код: Выделить всё
Canvas    : 15065 msec
Lazy      : 5522 msec
Zub Byte  : 5113 msec
OpenCV    : 2404 msec
OpenGL    : 494 msec


"В миллионах" я короче ... Zub успокойся, твой OpenGL все равно непобедим ! :idea: :wink:
-Q4 Видимо вообще глючит ... (при 100 000 линий то 2ХХ то 2ХХХ мс) А может нужно воссоздать "тепличные условия" сеть и прочие отключить ... Памяти тут все-же всего 2 гига... - подключённый фулЭйчДи монитор -бт наушники
- бп клавиатура и мышь - USB хаб с флэшками ... (Зачем козе баян ? Ну это единственный девайс с легальной 10-й куда поставлено кое ,что из "гастронома" виндовс )
Ps
Можно для комплекта еще и DirectX/Draw/3D помучить... :roll:
Ps Ps
if Frame = nil then Frame:= cvCreateImage( cs, 8, 3 );
Так все-же лучше дело в том что мой собранный "с миру по нитке" OpenCV.pas НЕ ЛЮБИТ повторного выделения и/или освобождения больших объемов памяти . (Видимо имеет место путаница разных менеджеров памяти в С++ и паскале ) По этому я объявил константу ( const frame: PIplImage=nil; ) Константы, как известно, хранятся сегменте "глобальных данных" ( где-бы их не объявляли) .
Последний раз редактировалось Alex2013 16.05.2018 05:48:59, всего редактировалось 1 раз.
Alex2013
долгожитель
 
Сообщения: 2922
Зарегистрирован: 03.04.2013 11:59:44

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

Сообщение zub » 15.05.2018 08:59:45

нет. не короче, ты проигрываешь почти на порядок, обрати внимание на циферки под твоей картинкой. Разбираться лень, но для твоего теста в мемо копируется предыдущий результат
>>твой OpenGL все равно непобедим !
он не мой. результаты огл можно еще улучшить на порядок

>>-Q4 Видимо вообще глючит ...
>>Видимо имеет место ...
насмешил, спасибо
zub
долгожитель
 
Сообщения: 2884
Зарегистрирован: 14.11.2005 23:51:26

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

Сообщение Mavlyudov » 15.05.2018 13:44:10

Сделал с OpenGL через glOrtho, кк советовали выше.
Результат: Заливка (точками шириной 1 пиксел) формы размером 1024x768 пикселей за 733мс.
Интересны будут результаты описанных выше методов для такой же заливки.

Вопрос такой: при отрисовке одной точки на форме, вся форма заливается черным цветом.
Можно как-то сделать, чтобы не заливалась, а рисовалась только точка?
Mavlyudov
новенький
 
Сообщения: 50
Зарегистрирован: 24.01.2010 20:35:23

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

Сообщение zub » 15.05.2018 14:09:54

>>Результат: Заливка (точками шириной 1 пиксел) формы размером 1024x768 пикселей за 733мс.
:?
Скажи, какие учебники тобой уже прочитаны?

>>Интересны будут результаты описанных выше методов для такой же заливки
нудак сделай
zub
долгожитель
 
Сообщения: 2884
Зарегистрирован: 14.11.2005 23:51:26

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

Сообщение Mavlyudov » 15.05.2018 14:20:55

zub
книга Краснова.
А что не так?
Mavlyudov
новенький
 
Сообщения: 50
Зарегистрирован: 24.01.2010 20:35:23

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

Сообщение zub » 15.05.2018 15:06:41

>>Заливка (точками шириной 1 пиксел) формы размером 1024x768
Можно замерить за сколько бы вилкой выроешь яму 2х2х2. Но это бессмысленно - есть совочки, лопаты, экскаваторы...
zub
долгожитель
 
Сообщения: 2884
Зарегистрирован: 14.11.2005 23:51:26

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

Сообщение Pavia » 15.05.2018 16:55:34

Mavlyudov писал(а):Вопрос такой: при отрисовке одной точки на форме, вся форма заливается черным цветом. Можно как-то сделать, чтобы не заливалась, а рисовалась только точка?

Показывайте код. Целиком выложите проект.
А так рисовать можно в цикле либо по таймеру либо по событию OnPaint
А за очистку отвечает glClear(), после создания контекста можно вызвать один раз.
Топа этого:
Код: Выделить всё
glClearColor(GetRValue(Form.Color), GetGValue(Form.Color), GetBValue(Form.Color), 255.0);
glClearDepth(1.0);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);


Добавлено спустя 22 минуты 3 секунды:
Код: Выделить всё
  glBegin(GL_POINTS);
  for i:=0 to 1024 do
   for j:=0 to 768 do
     begin
     glVertex2f(2*i/1024-1,2*j/768-1);
     end;
  glEnd;

Если вынести glBegin glEnd за цикл то работает гораздо быстрее в 10 раз.
Но вообще Zub прав это всё равно, что копать вилкой. Если не хуже.
Аватара пользователя
Pavia
постоялец
 
Сообщения: 290
Зарегистрирован: 07.01.2011 12:46:51

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

Сообщение Alex2013 » 16.05.2018 05:01:46

zub писал(а):нет. не короче, ты проигрываешь почти на порядок, обрати внимание на циферки под твоей картинкой. Разбираться лень, но для твоего теста в мемо копируется предыдущий результат

>>-Q4 Видимо вообще глючит ...
>>Видимо имеет место ...
насмешил, спасибо


Верю !... Ибо нелепо . // Нажать кнопку пару раз до "стабилизации результатов" "не судьба" :?:

А вообще замечательное трололо ! :lol:
Про "нижний ряд" вообще умора.
Дело в том что теперь у меня немного проще сделано . :idea:
(Это настолько мне очевидно в начале подумал, что это была какая-то "запредельная мудрость" и исправил в тихую... Но видимо это не так раз возникают подобные гм.. "откровения Иоана Крестителя " :wink: )
Код: Выделить всё
procedure TForm1.runtest(Sender: TObject);
const

  f:byte=0;
  var
   pvendor,prender,pversion:pchar;

begin
     needresult:=true;
     testcount:=0;
    // self.Invalidate;
if f=0 then begin
     f:=1;
     GDIPaint(GDIWP);
     application.ProcessMessages;
     AlexBypePaint(GDIPlusWP);
     application.ProcessMessages;
     ZubPaint(AGGWP);
     application.ProcessMessages;
     OpenGLPaint(OpenGLWP);
     application.ProcessMessages;
     LazyPaint(LazyWP);
     f:=0;
end;
pvendor:=glGetString(GL_VENDOR);
prender:=glGetString(GL_RENDERER);
pversion:=glGetString(GL_VERSION);

Memo1.Lines.Text:='OpenGL driver info: '+pvendor+' '+prender+' '+pversion+#13#10+
                        'Draw '+inttostr(SpinEdit1.Value)+' random lines'+#13#10+
                        Label1.Caption+#13#10+
                        Label2.Caption+#13#10+
                        Label3.Caption+#13#10+
                        Label4.Caption+#13#10+
                        Label5.Caption;

end;

procedure TForm1._formCreate(Sender: TObject);
const
  angle=15*pi/180;
begin
     matr:=CreateTranslationMatrix(5,5,0);
     matr:=MatrixMultiply(matr,CreateRotationMatrixZ(sin(angle),cos(angle)));
     matr:=MatrixMultiply(matr,CreateScaleMatrix(1.5,1.5,1.5));
     needresult:=false;
end;
// и не забыть отключить OpenGLWP.OnPaint в форме
// Да, я знаю, что так "не каширно"   
// Но это тест ! Тут чем проще тем лучше !


Если не заметил в исходном варианте панели пытаются параллельно обновляться ...
То есть при не которой доле не везения процесс может вообще ЗАЦИКЛИТСЯ .
(Что видимо и происходило при миллионе линий и повышенной загрузке системы Q4 не причем )
Зы
>>твой OpenGL все равно непобедим !
он не мой. результаты огл можно еще улучшить на порядок

Совершенству нет предела ... :idea:

Добавлено спустя 44 минуты 52 секунды:
Mavlyudov писал(а):Сделал с OpenGL через glOrtho, кк советовали выше.
Результат: Заливка (точками шириной 1 пиксел) формы размером 1024x768 пикселей за 733мс.
Интересны будут результаты описанных выше методов для такой же заливки.

Вопрос такой: при отрисовке одной точки на форме, вся форма заливается черным цветом.
Можно как-то сделать, чтобы не заливалась, а рисовалась только точка?


Зачем вообще на точках зацикливаться ? В OpenGL полно векторных ПРИМИТИВОВ... А где нужно растр использовать там текстуры есть . :idea:
Последний раз редактировалось Alex2013 16.05.2018 14:14:35, всего редактировалось 1 раз.
Alex2013
долгожитель
 
Сообщения: 2922
Зарегистрирован: 03.04.2013 11:59:44

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

Сообщение zub » 16.05.2018 09:32:57

>>Если не заметил в исходном варианте панели пытаются параллельно обновляться ...
А ты заметил что там пять областей вывода? это какраз оптимизация под пятиядерные процессоры.

>>гм.. "откровения Иоана Крестителя "
Пожалуй я сольюсь. Кавычек много, смысла ноль. Я тебя не понимаю
zub
долгожитель
 
Сообщения: 2884
Зарегистрирован: 14.11.2005 23:51:26

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

Сообщение Alex2013 » 16.05.2018 14:01:14

>>гм.. "откровения Иоана Крестителя "

Замени на "откровения продвинутого но не вникшего в проблему гуру " если непонятно...
Пожалуй я сольюсь. Кавычек много, смысла ноль. Я тебя не понимаю

Во первых все-же извини "ночь фонарь аптека" ... :wink:

zub писал(а):>>Если не заметил в исходном варианте панели пытаются параллельно обновляться ...
А ты заметил что там пять областей вывода? это какраз оптимизация под пятиядерные процессоры.

Повторяю: для реального использования возможно все так(или похожим образом ) и нужно делать (Спорить не буду !...) но тут ТЕСТ значит нужно делать как можно проще что бы не было накладок.
...Пять ядер ? Это серьезно ! 8) Но мне обычно доступны процессоры с максиму 4 ядрами ... а у моего основного "кодо-писательного" ноутбука их вообще внезапно два .
(кроме того в этом коде нет блокировки приоритета потоков , что означает ядра могут быть заняты.. ...и не было даже блокировки от повторного вызова процедуры до того как произойдет окончание перерисовки... При этом программа реально не сколько раз повисала "с курсором ожидания" не знаю уж циклилось ли там по onPaint или нет ждал минут пять десть .. и даже процесс не закрывался через обычный менеджер процессов (только через FAR ). )
Зы
Чуть поправил в посте выше ... procedure TForm1.runtest(Sender: TObject); и выкинул метод processresult; вот теперь уж точно не будет "предыдущих значений".

Зы Зы
По результатам обсуждения этой темы: думаю что разумно будет сделать что-то вроде переключаемых "рендеров" для своих проектов ... ну мало ли где какое "враждебное системное окружение" окажется у конечного пользователя .
Последний раз редактировалось Alex2013 16.05.2018 14:26:22, всего редактировалось 1 раз.
Alex2013
долгожитель
 
Сообщения: 2922
Зарегистрирован: 03.04.2013 11:59:44

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

Сообщение zub » 16.05.2018 14:25:58

>>...Пять ядер ? Это серьезно !
Конечно серьезно. С тобой толко до такой степени серьезно у меня получается разговаривать.

>>кроме того в этом коде нет блокировки приоритета потоков , что означает ядра могут быть заняты.. ...и не было даже блокировки от повторного вызова процедуры до того как произойдет окончание перерисовки...
картинка_с_чуваком_приложившим_руку_к_лицу.даже_не_jpg_а_BMP

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

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

Сообщение Alex2013 » 16.05.2018 14:33:33

Я хочу получить от обсуждения пользу ... и кстати спасибо ! в полнее полезное обсуждение получилось . :idea: (О ТС и его проблеме правда почти забыли . :) )
Alex2013
долгожитель
 
Сообщения: 2922
Зарегистрирован: 03.04.2013 11:59:44

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

Сообщение zub » 16.05.2018 14:43:02

>>По результатам обсуждения этой темы: думаю что разумно будет сделать что-то вроде переключаемых "рендеров" для своих проектов ...
Аллилуйя! только не всякую байто-бито-велохрень, а то что действительно работает. у меня например воттак:
ИзображениеИзображение

>>Я хочу получить от обсуждения пользу ... и кстати спасибо ! в полнее полезное обсуждение получилось
На этом форуме пользой делятся очень щедро, ненадо только ее во флейме вымачивыть
zub
долгожитель
 
Сообщения: 2884
Зарегистрирован: 14.11.2005 23:51:26

Пред.След.

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

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

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

Рейтинг@Mail.ru