Многие пишут что GraphWPF быстрее GraphABC, решил проверить обрабатывая объекты, и у меня вышло что GraphABC быстрее GraphWPF. Начал обрабатывать 5000 кругов, сначало рисовал, потом менял координаты. Если знаете как можно исправить то жду ответа :3. (Про GraphWPF) Ах, да, я это обрабатывал через BeginFrameBasedAnimation.
Приведите конкретный код которым тестировали.
Пишу на память если что, компа рядом нету, но суть кода напишу.
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;
Как то так.
-
Код надо выделять так:
```
код
```
Знак ` находится за Ё в англ. клаве. -
Я сказал конкретный код, из памяти не годится.
Тогда чуть позже напишу
Ваша программа даже не компилируется.
Что пишет компилятора?
- Очевидная ошибка -
;
вместо.
. -
Program3.pas(5) : Неизвестное имя 'BeginFrameAnimationTime'
. - Метод
BeginFrameBasedAnimationTime
принимает параметр типаprocedure(dt: real)
, а неprocedure
. - Насколько помню, такой стиль написания кода - когда операторы начинаются с большой буквы присутствует в Visual Basic, здесь же PascalABC.NET.
- Цикл
for
может быть заменён наloop
, поскольку счётчик цикла не фигурирует в теле цикла.
Ах, точно вот эту процедуру использовал BeginFrameBasedAnimation
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.
Хотя бы рабочий вариант. Дальше - меняйте под себя.
А если будет 5000 объектов?
А вот на graphABC меньше тормозит, возможно я использовал for, но я и в ABC тоже так использовал
Мне бы такой макбук)
Подправил ваши коды и добавил счётчик 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 при тестировании производительности. Иначе результаты неправильные.
Вы ещё не спрашивали сколько он стоит… И не надо. Скажем так, достаточно много.
Спасибо за код и объяснения. И еще, какая библиотека лучше подойдет для симуляторов, или обработку большого кол.во объектов?
Я уже написал
Чуть ли не все современные распространённые библиотеки (в то числе и управляемые, то есть подключаемые через $reference
) для серьёзной графики - обёртки или для DirectX
, или для OpenGL
. OpenGL
проще для новичков в низкоуровневой графике. А у DirectX
на много больше встроенного функционала. Ну и DirectX
немного высокоуровневее в большинстве своего функционала.