Форум программистов, компьютерный форум, киберфорум
PascalABC.NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.92/13: Рейтинг темы: голосов - 13, средняя оценка - 4.92
Alvin Seville
 Аватар для Соколиный глаз
343 / 273 / 134
Регистрация: 25.07.2014
Сообщений: 4,537
Записей в блоге: 22

Почему от текстур GraphABC лагает?

27.07.2017, 13:36. Показов 2461. Ответов 17
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Почему от движущихся спрайтов GraphABC ужасно лагает? Как избавиться от этого?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
27.07.2017, 13:36
Ответы с готовыми решениями:

Почему при создании игры Lode Runner потребовалось 19 000 текстур? почему так много?
Почему при создании игры Lode Runner потребовалось 19 000 текстур? почему так много? ...

Почему оперативка лагает!?
сегодня купил оперативную память на 1 гб кингстон, но когда я его вставляю в комп, то комп не включается и издаёт гудки, не прикращаемые....

Почему же так лагает IntelliJ IDEA?
del , короче решил я познакомится с языком Java. Скачал среду разработки IntelliJ IDEA, но она лагает. Просто жуткие лаги в интерфейсе, но...

17
20 / 19 / 14
Регистрация: 25.03.2015
Сообщений: 68
27.07.2017, 20:34
Лучший ответ Сообщение было отмечено Volobuev Ilya как решение

Решение

Тоже сталкивался с тем, что GraphABC при казалось бы небольшой нагрузке начинает тормозить. Можно попробовать прорисовку в реальном времени через Milliseconds. Тогда не придётся прорисовывать каждый кадр. Например:
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
uses GraphABC;
begin
  SetWindowSize(300,300);
  var x:=10.0;
  var y:=10.0;
  
  /// Горизонтальная скорость
  var xd:=10;
  /// Вертикальная скорость
  var yd:=20;
  
  // Будем рисовать круг, движущийся по диагонали
  // с заданными скоростями (в п/с)
  LockDrawing;
  MillisecondsDelta;
  repeat
    ClearWindow;
    var d:=MillisecondsDelta;
    x+=xd*d/1000;
    y+=yd*d/1000;
    Circle(round(x),round(y),10);
    Redraw;
  until False;
end.
(это не спрайты, но их тоже можно рисовать функцией с координатами)
1
Alvin Seville
 Аватар для Соколиный глаз
343 / 273 / 134
Регистрация: 25.07.2014
Сообщений: 4,537
Записей в блоге: 22
28.07.2017, 09:09  [ТС]
Я через таймеры делаю прорисовку кадров.

Добавлено через 35 секунд
Мне надо, чтобы вообще приложение на лагало. Такое возможно?

Добавлено через 59 секунд
Потому, что при заливке текстурой фона окна начинает лагать все - даже объектов если не больше 3-х.
0
Эксперт Pascal/Delphi
6812 / 4568 / 4820
Регистрация: 05.06.2014
Сообщений: 22,434
28.07.2017, 10:06
Цитата Сообщение от Volobuev Ilya Посмотреть сообщение
Почему от движущихся спрайтов GraphABC ужасно лагает?
Постарайтесь не забывать, что pabc/pabc.net - это всё-таки среда, разработанная для учебных целей прежде всего.
Цитата Сообщение от Volobuev Ilya Посмотреть сообщение
Как избавиться от этого?
Перейти на нечто, изначально разработанное для преодоления "лагания".
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33393 / 21503 / 8236
Регистрация: 22.10.2011
Сообщений: 36,899
Записей в блоге: 12
28.07.2017, 10:10
Может, в конце концов, ты приложишь проект, который можно запустить и посмотреть на лаги? Вместе со спрайтами, разумеется, а то у тебя есть привычка выкладывать код, который ссылается на какие-то неизвестные файлы, лежащие где-то у тебя на дисках.

Добавлено через 3 минуты
pabc.net - это всё-таки среда, разработанная для учебных целей прежде всего.
pabc.net - это среда, использующая фреймворк .net, и если этот фреймворк не способен отобразить спрайт без лагов - то грош ему цена, и это не проблема Паскаля ни разу.
0
Alvin Seville
 Аватар для Соколиный глаз
343 / 273 / 134
Регистрация: 25.07.2014
Сообщений: 4,537
Записей в блоге: 22
28.07.2017, 11:07  [ТС]
Если запустить просто с градиентным фоном - в 90% будет нормально работать. А вот если запустить с фоном в виде картинки, а еще хуже - еще и назначить движущимуся объекту картинку - то лаги обеспечены.
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
uses GameEngine2DS,GraphABC;
const
  n = 15;
 
var
  scn, scnBG, scnOverlay: Scene;
  a: Sprite; // Движущийся объект
  BGghosts, OVERLAYghosts: List<GameRectangle>;
  
function NewRect(x, y: integer): GameRectangle;
var
  a: GameRectangle;
begin
  a := new GameRectangle();
  a.CenterX := x;
  a.CenterY := y;
  a.Width := Random(100);
  a.Height := Random(100);
  a.FillColor := clRandom;
  a.Visible := true;
  a.UserStringSize := 1;
  Result := a;
end;
 
begin 
  a := NewRect(100, 100);
  a.VelocityX := 2;
  a.Image:=new Picture(1,1);
  a.Image.Load({путь к картинке спрайта});
  
  BGghosts := new List<GameRectangle>();
  for var i := 0 to n - 1 do
    BGghosts.Add(NewRect(Random(Window.Width), Random(Window.Height)));
  
  OVERLAYghosts := new List<GameRectangle>();
  for var i := 0 to n - 1 do
    OVERLAYghosts.Add(NewRect(Random(Window.Width), Random(Window.Height)));
  
  scnBG := new Scene();
  for var i := 0 to BGghosts.Count - 1 do
    scnBG.SceneObjects.Add(BGghosts[i]);
  
  scnOverlay := new Scene();
  for var i := 0 to OVERLAYghosts.Count - 1 do
    scnOverlay.SceneObjects.Add(OVERLAYghosts[i]);
  
  scn := new Scene();
  {scn.HorizonColor := clCyan;
  scn.ZenithColor := clBlue;}
  scn.SceneObjects.Add(a);
  scn.BackgroundImage:=new Picture(1,1);
  scn.BackgroundImage.Load({тут впишите путь к любой картике});
  scn.BackgroundScenes.Add(scnBG);
  scn.OverlayScenes.Add(scnOverlay);
  scn.GhostColor := GHOST_COLOR;
  scn.AsGhosts := true;
  
  MainFunctions.SetCaption(1);
  GameStarter.ActiveScene := scn;
  
  GameStarter.Start();
end.
Код файла. А в архиве - сам движок.
Вложения
Тип файла: rar GameEngine2DS.rar (9.6 Кб, 4 просмотров)
0
Alvin Seville
 Аватар для Соколиный глаз
343 / 273 / 134
Регистрация: 25.07.2014
Сообщений: 4,537
Записей в блоге: 22
28.07.2017, 11:08  [ТС]
В качестве пути к файлу пропишите путь к любому изображению.
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33393 / 21503 / 8236
Регистрация: 22.10.2011
Сообщений: 36,899
Записей в блоге: 12
28.07.2017, 11:41
Цитата Сообщение от Volobuev Ilya Посмотреть сообщение
В качестве пути к файлу пропишите путь к любому изображению.
Вот о чем я и говорил. Мне неинтересно прописывать путь к своему изображению, ибо оно возьмет и не начнет лагать. Мне нужно воспроизвести те же лаги, что есть у тебя, чтобы с ними бороться, поймешь ты это когда-нибудь, или нет? А я не могу, ибо не знаю ни размера изображения, ни формата. Ничего.
0
Alvin Seville
 Аватар для Соколиный глаз
343 / 273 / 134
Регистрация: 25.07.2014
Сообщений: 4,537
Записей в блоге: 22
28.07.2017, 11:53  [ТС]
Вот архив
Вложения
Тип файла: rar Игровой движок.rar (84.0 Кб, 2 просмотров)
0
20 / 19 / 14
Регистрация: 25.03.2015
Сообщений: 68
28.07.2017, 12:47
Лучший ответ Сообщение было отмечено Volobuev Ilya как решение

Решение

А почему именно прорисовка по таймерам? В большинстве таких движков есть возможность загрузить программу так, что на один кадр будут уходить секунды, и таймеры тут совершенно неуместны. Даже если решить проблему, она будет лишь отложена. Я бы переписал всё это дело на прорисовку в реальном времени.
1
Alvin Seville
 Аватар для Соколиный глаз
343 / 273 / 134
Регистрация: 25.07.2014
Сообщений: 4,537
Записей в блоге: 22
28.07.2017, 13:34  [ТС]
Хм, а возможно ли то, что "лаги" - это всего лишь движок не успевает дорисовать все объекты и уже вызывается новая отрисовка кадра с нуля?
0
20 / 19 / 14
Регистрация: 25.03.2015
Сообщений: 68
28.07.2017, 13:36
В таком случае обычно возникает Runtime error: попытка доступа к занятой области. GraphABC обычно ругается при многопоточном рисовании.
1
Alvin Seville
 Аватар для Соколиный глаз
343 / 273 / 134
Регистрация: 25.07.2014
Сообщений: 4,537
Записей в блоге: 22
28.07.2017, 13:39  [ТС]
Хм, странно - поставил у таймеров промежуток рисования через 50 милисекунд и уже при 840 частицах не лагает.
0
20 / 19 / 14
Регистрация: 25.03.2015
Сообщений: 68
28.07.2017, 13:51
Я бы сам проверил, но в коде висит непреодолимый 'C:\Ilya\Ground.jpg'.
0
Alvin Seville
 Аватар для Соколиный глаз
343 / 273 / 134
Регистрация: 25.07.2014
Сообщений: 4,537
Записей в блоге: 22
28.07.2017, 13:54  [ТС]
Вот, тут можете посмотреть.
Вложения
Тип файла: rar Output.rar (61.5 Кб, 4 просмотров)
0
Alvin Seville
 Аватар для Соколиный глаз
343 / 273 / 134
Регистрация: 25.07.2014
Сообщений: 4,537
Записей в блоге: 22
28.07.2017, 14:01  [ТС]
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
uses GameEngine2Ds, GraphABC;
var
  scn: Scene;
 
procedure NewParticles();
begin
  ParticleSystem.ParticlesBorderColor := clRed;
  ParticleSystem.ParticlesFillColor := clRandom;
  ParticleSystem.Radius := Random(5);
  ParticleSystem.SpeedCoeff := Random(100);
  ParticleSystem.NewParticleSystem();
end;
 
begin
  scn := new Scene();
  scn.HorizonColor := clCyan;
  scn.ZenithColor := clBlue;
  
  ParticleSystem.ParticlesCount := integer.MaxValue;
  ParticleSystem.ParticlesAngleCount := 150;
  ParticleSystem.AngleCount := 6;
  ParticleSystem.RandomAngle := 15;
  ParticleSystem.CenterX := Window.Width div 2;
  ParticleSystem.CenterY := Window.Height div 2;
  ParticleSystem.MinLifeTime := 1;
  ParticleSystem.MaxLifeTime := 3;
  ParticleSystem.ParticlesMinWidth := 10;
  ParticleSystem.ParticlesMaxWidth := 20;
  ParticleSystem.ParticlesMinHeight := 10;
  ParticleSystem.ParticlesMaxHeight := 20;
  ParticleSystem.ParticlesList := scn.SceneParticles;
  ParticleSystem.MinDecSpeed := 1;
  ParticleSystem.MaxDecSpeed := 20;
  
  for var i := 0 to 3 do
    NewParticles();
  
  MainFunctions.SetCaption(1);
  GameStarter.ActiveScene := scn;
  
  GameStarter.Start();
end.
Добавлено через 5 минут
Кстати вот так лагать гораздо меньше стало (почти не лагает):
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
uses GameEngine2Ds, GraphABC;
var
  scn: Scene;
 
procedure NewParticles();
begin
  ParticleSystem.ParticlesBorderColor := clRed;
  ParticleSystem.ParticlesFillColor := clRandom;
  ParticleSystem.Radius := Random(5);
  ParticleSystem.SpeedCoeff := Random(100);
  ParticleSystem.NewParticleSystem();
end;
 
begin
  scn := new Scene();
  scn.HorizonColor := clCyan;
  scn.ZenithColor := clBlue;
  
  ParticleSystem.ParticlesCount := integer.MaxValue;
  ParticleSystem.ParticlesAngleCount := 450;
  ParticleSystem.AngleCount := 6;
  ParticleSystem.RandomAngle := 15;
  ParticleSystem.CenterX := Window.Width div 2;
  ParticleSystem.CenterY := Window.Height div 2;
  ParticleSystem.MinLifeTime := 1;
  ParticleSystem.MaxLifeTime := 3;
  ParticleSystem.ParticlesMinWidth := 10;
  ParticleSystem.ParticlesMaxWidth := 20;
  ParticleSystem.ParticlesMinHeight := 10;
  ParticleSystem.ParticlesMaxHeight := 20;
  ParticleSystem.ParticlesList := scn.SceneParticles;
  ParticleSystem.MinDecSpeed := 1;
  ParticleSystem.MaxDecSpeed := 20;
  
  for var i := 0 to 3 do
    NewParticles();
  
  MainFunctions.SetCaption(1);
  repeat
    ClearWindow();
    scn.Draw();
    Redraw();
  until false;
end.
0
20 / 19 / 14
Регистрация: 25.03.2015
Сообщений: 68
28.07.2017, 14:03
Работает. В начале быстро разлетаются частицы, и чем их меньше, тем чаще screen freezes. Возможно из-за вычислений с быстро растущими числами координат. Не лучший тест; нужно что-то, что не задаёт всем частицам гигантские координаты, вызывающие такие тормоза.

Второй модуль не компилируется. Какая версия компилятора?

Да и первый тоже.
0
Alvin Seville
 Аватар для Соколиный глаз
343 / 273 / 134
Регистрация: 25.07.2014
Сообщений: 4,537
Записей в блоге: 22
28.07.2017, 17:36  [ТС]
Версия 3.2.

Добавлено через 2 минуты
Как центр частицы вылетает за границы окна или скорость равна 0 она удаляется.

Добавлено через 2 часа 37 минут
Без таймеров работает гораздо быстрее.

Добавлено через 33 минуты
Кстати, рисование в реальном времени дало свои результаты - не лагает как было.

Добавлено через 2 минуты
Pascal
1
2
3
4
5
6
    procedure ApplyForce();
    begin
      var T := ObjectData.GetTimeDelta() / 1000;
      CenterX := CenterX + VelocityX * T;
      CenterY := CenterY + VelocityY * T;
    end;
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
28.07.2017, 17:36
Помогаю со студенческими работами здесь

Почему так лагает при рисовании градиентов?
uses GraphABC; var M: array of Color; C: Color; ///Функция линейной интерполяции. function Intr(a, b: byte; p: byte):...

Почему иногда лагает панель задач и кпопка пуск?
Бывает, что кнопка пуск просто при нажатии никак не реагирует.

Fuser -s ./ или почему лагает сервер шо аж кони рыгают?
Добрый день. Ох пофиксиш одно вылезет другое :) И так всю жизнь как я понимаю. Скажите мне пожалуйста, кто может объяснить не...

Почему при запуске любого приложение ЦП перегружается и все лагает
Добрый вечер! Я уже во 2 раз столкнулся с такой проблемой, как сильное &quot;лагание&quot; игр и т. д. Впервый раз на это я не обратил внимания...

В hellblade падает фпс до 30 лагает фризит.ризен 1600 и 5700 .почему?
ризен 1600\ рх5700 \крушл 3000 16 хмр \550 сеасоник\ 7200 wd в других играх нет такого хоть и мультиплеер батлы например. в хелблейд...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Программа принимает математическое выражение в виде строки и выдаёт его производную в виде строки и вычисляет значение производной при заданном х Логарифм записывается как: (x-2)log(x^2+2) -. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru