GraphWPF и GraphABC кто быстрее


#1

Многие пишут что GraphWPF быстрее GraphABC, решил проверить обрабатывая объекты, и у меня вышло что GraphABC быстрее GraphWPF. Начал обрабатывать 5000 кругов, сначало рисовал, потом менял координаты. Если знаете как можно исправить то жду ответа :3. (Про GraphWPF) Ах, да, я это обрабатывал через BeginFrameBasedAnimation.


#2

Приведите конкретный код которым тестировали.


#3

Пишу на память если что, компа рядом нету, но суть кода напишу.

1)----------------------

Uses GraphABC;

Procedure Render; Begin For var I:=0 to 5000 do Circle(random(0,Window.Width),random(0,Window.Height), 10); Redraw: Clearwindow;

End;

Begin While true do Render; end.

2)---------------------------

Uses GraphWPF;

Procedure Render; Begin For var I:=0 to 5000 do Circle(random(0,Window.Width),random(0,Window.Height), 10,colors.Red); End;

Begin BeginFrameAnimationTime(Render, 200) ; end;

Как то так.


#4
  1. Код надо выделять так:
    ```
    код
    ```
    Знак ` находится за Ё в англ. клаве.

  2. Я сказал конкретный код, из памяти не годится.


#5

Тогда чуть позже напишу


#6

Ваша программа даже не компилируется.


#7

Что пишет компилятора?


#8
  1. Очевидная ошибка - ; вместо ..
  2. Program3.pas(5) : Неизвестное имя 'BeginFrameAnimationTime'.
  3. Метод BeginFrameBasedAnimationTime принимает параметр типа procedure(dt: real), а не procedure.
  4. Насколько помню, такой стиль написания кода - когда операторы начинаются с большой буквы присутствует в Visual Basic, здесь же PascalABC.NET.
  5. Цикл for может быть заменён на loop, поскольку счётчик цикла не фигурирует в теле цикла.

#9

Ах, точно вот эту процедуру использовал BeginFrameBasedAnimation


#10
uses GraphWPF;

procedure Render();
begin
  loop 50 do
    Circle(Random(0, Window.Width), Random(0, Window.Height), 10, colors.Red);
end;

begin
  BeginFrameBasedAnimation(Render);
end.

Хотя бы рабочий вариант. Дальше - меняйте под себя.


#11

А если будет 5000 объектов?


#12

Будет тормозить (на моём то MacBook’e).


#13

А вот на graphABC меньше тормозит, возможно я использовал for, но я и в ABC тоже так использовал


#14

Мне бы такой макбук)


#15

Подправил ваши коды и добавил счётчик fps (и изменил на 5 объектов, дальше объясню почему):

uses GraphABC;

procedure Render;
begin
  
  loop 5 do
    Circle(random(0, Window.Width), random(0, Window.Height), 10);
  
end;

begin
  var i := 0;
  var sw := new System.Diagnostics.Stopwatch;
  
  LockDrawing;
  SetConsoleIO;
  
  while true do
  begin
    Window.Clear;
    
    sw.Start;
    Render;
    Redraw;
    sw.Stop;
    
    i += 1;
    if i=60 then
    begin
      writeln(sw.Elapsed);
      sw.Reset;
      i := 0;
    end;
    
  end;
  
end.
uses GraphWPF;

procedure Render;
begin
  
  loop 5 do
    Circle(random(0, Window.Width), random(0, Window.Height), 10);
  
end;

begin
  var i := 0;
  var sw := new System.Diagnostics.Stopwatch;
  
  while true do
  begin
    Window.Clear;
    
    sw.Start;
    Redraw(Render);
    sw.Stop;
    
    i += 1;
    if i=3000 then
    begin
      writeln(sw.Elapsed);
      sw.Reset;
      i := 0;
    end;
    
  end;
end.

GraphABC рендерит это в 30fps (пишет 2 сек на 60 кадров).
В то же время GraphWPF справляется с 3к кадрами в секунду (поэтому я поставил 3000 а не 60 в счётчик, иначе консоль засирает маленькими числами).

WPF дохнет на большом кол-ве объектов. И вообще не на много лучше по производительности чем GDI (на котором основан GABC). Но WPF, по крайней мере, адекватно себя ведёт с маленьким кол-вом объектов. То есть нет неистовых тормозов в Redraw, не позволяющих получать больше 20fps в нормальных программах.

Если вам нужна серьёзная графика - используйте DirectX или OpenGL. Там и шейдеры будут доступны, и в целом всевозможная низкоуровневая графика.

P.S. Не забывайте отключать отладку и запускать в режиме Shift+F9 при тестировании производительности. Иначе результаты неправильные.


#16

Вы ещё не спрашивали сколько он стоит… И не надо. :slight_smile: Скажем так, достаточно много.


#17

Спасибо за код и объяснения. И еще, какая библиотека лучше подойдет для симуляторов, или обработку большого кол.во объектов?


#18

Я уже написал

Чуть ли не все современные распространённые библиотеки (в то числе и управляемые, то есть подключаемые через $reference) для серьёзной графики - обёртки или для DirectX, или для OpenGL. OpenGL проще для новичков в низкоуровневой графике. А у DirectX на много больше встроенного функционала. Ну и DirectX немного высокоуровневее в большинстве своего функционала.