CAST II Game Engine Community

Please login or register.

Login with username, password and session length
Advanced search  

Author Topic: TСвойлКасс = class (TProcessing)  (Read 1315 times)

0 Members and 1 Guest are viewing this topic.

admin

  • Administrator
  • Full Member
  • *****
  • Posts: 192
    • CAST II Engine
Re: TСвойлКасс = class (TProcessing)
« Reply #12 on: January 26, 2010, 10:21:42 PM »

Ну, просчет столкновений не будет всегда квадратично зависеть от количества объектов. Пространственное разбиение добавим и будет линейно зависеть.
А полигонов на современных картах можно много выводить.
Logged

Luarvic

  • Newbie
  • *
  • Posts: 33
Re: TСвойлКасс = class (TProcessing)
« Reply #11 on: January 26, 2010, 12:57:53 PM »

Да теперь гораздо лучше.
Значит производительность больше зависист от количества объектов чем от например количества полигонов на моделях?
Logged

admin

  • Administrator
  • Full Member
  • *****
  • Posts: 192
    • CAST II Engine
Re: TСвойлКасс = class (TProcessing)
« Reply #10 on: January 26, 2010, 03:44:53 AM »

У меня на довольно слабой машине тормозить начинает при 1К объектов и продолжает даже если bc = 0.

Если заменить строчку.
OSUtils.SetWindowCaption(Starter.WindowHandle, inttostr(bc));
на что-то вроде этого
Code: [Select]
OSUtils.SetWindowCaption(Starter.WindowHandle,
    Format('FPS: %3.3F, bc: %D, Proc: %3.3F, Render: %3.3F, Collision: %3.3F',
   [Core.PerfProfile.FramesPerSecond, bc,
    Core.PerfProfile.Times[ptProcessing], Core.PerfProfile.Times[ptRender],
    Core.PerfProfile.Times[ptCollision]]));

То в заголовке окна будут показываться ФПС и время выполнения различных подсистем движка в пределах фрейма. В данном случае, выводим время процессинга, рендера и просчета столкновений.

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

На нескольких сотнях активных объектов этого заметно быть не должно.

Чтобы объекты не накапливались тысячами и тормозов не было, надо отключать процессинг ненужным объектам. Hide() только отключает визуализацию.
В данном примере строчку

if gettickcount - lifetime>10000 then begin if visible then dec(bc); visible:=false; mesh.Hide; end;

заменить на

if gettickcount - lifetime>10000 then begin if visible then dec(bc); visible:=false; mesh.Hide; pause; end;
Logged

Luarvic

  • Newbie
  • *
  • Posts: 33
Re: TСвойлКасс = class (TProcessing)
« Reply #9 on: January 26, 2010, 01:06:36 AM »

Я имел в виду текстуру не накладывал и настройки с стандартных не менял
http://rghost.ru/890794
Logged

admin

  • Administrator
  • Full Member
  • *****
  • Posts: 192
    • CAST II Engine
Re: TСвойлКасс = class (TProcessing)
« Reply #8 on: January 25, 2010, 11:14:57 PM »

При 200 объектах тормозить не должно.
Возможно, при отрисовке в материале что-то не находится и выводится в лог ошибка. Это конечно будет тормозить. Смотри .log файл.
А что значит материала не накладывал? Совсем без материала объект не будет виден.
Если лог чист, то надо проект смотреть.
Logged

Luarvic

  • Newbie
  • *
  • Posts: 33
Re: TСвойлКасс = class (TProcessing)
« Reply #7 on: January 25, 2010, 10:07:57 PM »

Ясненько.
Меня в данный момент волнует нездоровая тенденция движка тормозить... Вощем сделал я стрельбу кубами. Так вот гдето 200 кубов вылетят и тормоза начинаются. Отворачиваю камеру от них, все норм. Или жду пока mesh.Hide случится у них и тож тормозить перестает. Материала на кубы не накладывал. Это нормальная производительность? Или я чето нетак делаю? Кинул еще высокополигональную модель и тормозов незаметил. Такое чуство что движек волнует количество мешей а не вершин...
Могу прислать проект.
« Last Edit: January 25, 2010, 10:43:29 PM by Luarvic »
Logged

admin

  • Administrator
  • Full Member
  • *****
  • Posts: 192
    • CAST II Engine
Re: TСвойлКасс = class (TProcessing)
« Reply #6 on: January 25, 2010, 01:05:06 PM »

Видимо пока не везде учитывается возможность уничтожения.
Но вообще идея такова, что объекты могут уничтожаться в любой момент.
Когда алгоритм процессинга устаканится (в данный момент там еще не финальный вариант) и это заработает.
Пока можно вместо удаления заносить в массив, а в главом цикле программы, удалять все занесенные в массив.

У TProcessing есть свойство TimeProcessed, представляющее собой время, прошедшее с момент создания объекта (или обнуления данного свойства) в секундах. Лучше и быстрее его использовать, чем gettickcount.
Logged

Luarvic

  • Newbie
  • *
  • Posts: 33
Re: TСвойлКасс = class (TProcessing)
« Reply #5 on: January 25, 2010, 10:50:48 AM »

Ну связываю, смысле присваиваю TBullet.mesh:=меш в сцене
А уничтожить чето неполучается - хотел прям в Process:
if gettickcount - lifetime>2000 then begin mesh.free; Free;end;
ошибки выдает
Logged

admin

  • Administrator
  • Full Member
  • *****
  • Posts: 192
    • CAST II Engine
Re: TСвойлКасс = class (TProcessing)
« Reply #4 on: January 25, 2010, 10:29:48 AM »

Да, клонировать и добавлять в сцену это нормально.
Насчет связывания не понял каким именно образом связывается TBullet и меш (TMesh?).
TBullet кстати можно унаследовать от TMesh.
Clone() клонирует один объект.
С потомками можно склонировать сохранив в поток (Item.Save) и загрузив (Core.LoadItem).

Насчет уничтожения: можно делать Item.Free().
Однако, если объекты уничтожаются и рождаются очень часто, то это может начать (а может и не начать) тормозить из-за выделений/освобождений памяти. В таком случае можно создать пул невидимых или даже отсоединенных от сцены объектов и при создании брать из пула (т.е. без Clone()), а при уничтожении возвращать в пул.
« Last Edit: January 25, 2010, 10:34:50 AM by admin »
Logged

Luarvic

  • Newbie
  • *
  • Posts: 33
Re: TСвойлКасс = class (TProcessing)
« Reply #3 on: January 25, 2010, 10:15:39 AM »

"свежесозданная" это смысле риалтайм? Не, я таким не страдаю ;D
У меня в сцене есть меш пули, который я клонирую и связываю с TBullet в программе. Вопрос: это нормальная практика?
И еще вопрос: Clone создает копию только одного объекта или еще всех его потомков? И как правильно уничтожать игровые классы?
« Last Edit: January 25, 2010, 10:22:45 AM by Luarvic »
Logged

admin

  • Administrator
  • Full Member
  • *****
  • Posts: 192
    • CAST II Engine
Re: TСвойлКасс = class (TProcessing)
« Reply #2 on: January 24, 2010, 09:43:21 PM »

Так объект создан, но к сцене не присоединен.
Чтобы присоединить, надо задать Parent'a:
Bullet.Parent := Core.Root;

Не присоединенные объекты нужны чтобы создавать игровые объекты, путем клонирования оригиналов:

Bullet.Clone().Parent := Core.Root;

При этом сам Bullet остается неизменным.

Да, если используется свежесозданная сцена, то надо еще настроить процессинг (в следующих релизах это будет автоматически делаться):
Core.Root.SetProperty('Processing\Number of classes', '1');

По умолчанию процессинг будет происходить раз в 30 миллисекунд.
Logged

Luarvic

  • Newbie
  • *
  • Posts: 33
TСвойлКасс = class (TProcessing)
« Reply #1 on: January 24, 2010, 06:40:34 PM »

Об этом вроде в мануале говорилось, но решил все уточнить.
Вот игровой класс:
TBullet = class (TProcessing)
  private
  movevect:TVector3s;
  mesh:TMesh;
  public
  procedure init;
  procedure Process(const DeltaT: Single); override;
end;

Создаю его и вощем ничего не происходит, Process объекта не вызывается. Создаю так:
tbullet.Create(core).init;
Logged
 

+ Quick Reply

With Quick-Reply you can write a post when viewing a topic without loading a new page. You can still use bulletin board code and smileys as you would in a normal post.

Warning: this topic has not been posted in for at least 120 days.
Unless you're sure you want to reply, please consider starting a new topic.

Name: Email:
Verification:
Type the letters shown in the picture
Listen to the letters / Request another image
Type the letters shown in the picture:

Please enter the number 234 in the field: