Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

GlScene, Objects


Страницы:   1 2

VVV-First ©   (2005-05-17 14:44:00) 

Такой вопрос, если я  динамически создаю в сцене несколько объктов, то после Scene.destroy освободится память из по них(созданных мною бъектов) , или нужно делать это самостоятельно?


Xeno   (2005-06-08 06:41:00) [1]

>Da Stranger

>TGLPerlinPFXManager  - это менеджер эффектов, о которых я >упомянул. А об исключительных ситуациях - их действительно >GLScene обрабатывает нелучшим образом и скорее всего память после >этого не освобождает. А чтобы избежать ошибок при закрытии >приложения надо делать Cadencer.Enabled:=false? это часто >помогает.

Cadencer.Enabled:=false - Иногда помогает,но чаще,к сожалению нет. Это было самое первое что я пробовал что-бы исправить проблему :) Выход я нашёл только один, сочетания кода, вызывающие исключительные ситуации, просто не использую...


П7   (2005-06-07 16:53:00) [2]

дыну? а я думал что проперть - это:

CMyClass = class
private
 FValue : integer;
public
  property Value : integer; read FValue;
end;

Или как там эта гадость пишется... (:


Fosgen   (2005-06-07 16:23:00) [3]

2 П7 : А шо же это такое? Метод что ли? И всяко не родитель и не потомок... Третьего - не дано в любом варианте...


П7   (2005-06-07 11:04:00) [4]


> Fosgen   (07.06.05 10:00) [25]

А это не проперть... (:


Fosgen   (2005-06-07 10:00:00) [5]

2 XProger: Однако... Интересный подход... Попробую на досуге. Не совсем ясна идея с TGLBaseSceneObject в качестве Property, но поразмыслю... Загрузил, спасибо.


XProger   (2005-06-06 14:41:00) [6]

Fosgen,

TSprite = class(TParcicle)
 constructor Create;
 destructor Destroy; override;
public
 Obj : TGLBaseSceneObject;
 procedure Render; override;
end;
...
procedure TSprite.Render;
begin
Obj.Render;
end;

Вах! Какая надстройка! ;)


Da Stranger   (2005-06-06 13:32:00) [7]


> Da Stranger: Уважаемый если Вы  не сталкивались с ситуациями
> некорректной работы Free - это не значит что их нет. В Дельфе
> вообще работа с памятью не очень поставлена... Особенно
> - оптимизация... А насчет исходников - признаюсь - не рылся
> подробно, но внешне идеальный код не во всех ситуациях работает
> идеально - факт доказанный временем.


Увыжаемый, Fosgen! Вы написали, что Destroy надёжнее, чем Free. Опять же повторюсь, что это бред (со ссылкой на процедуру TObject.Free) Насчет оптимизации с работой с паматью - c этим трудно не согласиться... Но по крайней мере работа с памятью более безопасная, чем в C++ ;)


> Позвольте не согласиться,далеко ходить не надо,в GLScene
> присутствует
> TGLPerlinPFXManager и TGLParticleFXRenderer,освобождение
> памяти, при их интенсивном использовании, иногда вызывает
> исключительные ситуации,причём чаще всего всё работает нормально
> до выгрузки приложения, код не привожу,но думаю те кто пробовал
> их использовать в своих проектах должны были с этим столкнуться,
> хотя допускаю мысль что я сам что-то неправильно сделал.


TGLPerlinPFXManager  - это менеджер эффектов, о которых я упомянул. А об исключительных ситуациях - их действительно GLScene обрабатывает нелучшим образом и скорее всего память после этого не освобождает. А чтобы избежать ошибок при закрытии приложения надо делать Cadencer.Enabled:=false? это часто помогает.


Fosgen   (2005-06-05 11:39:00) [8]

2 XProger: Я вообще много чего пишу ручками, но в данном случае проверено - как надстройка это не будет работать, поскольку у класса TGLBaseSceneObject метод Render не является виртуальным, таким образом override сделать ему никак нельзя - разве что исходники GlScene править,вот только не знаю к каким эффектам это приведет - у меня сейчас немного другая задача...


XProger   (2005-06-04 16:13:00) [9]

Fosgen, это можно использовать в качестве надстройки над GLScene %)
А вообще написание всего ручками пойдёт тебе только на пользу...


Fosgen   (2005-06-04 09:40:00) [10]

Приношу всем свои искренние извинения - тупил несколько недель по пустяковому вопросу. Спасибо всем, особенно DeadMeat, который вывел мои мозги из тупикового периода - разумеется NoZWrite - именно то св-во, что мне и требовалось. Однозначно благодарю всех, проявивших интерес к моей задаче.
2 XProger: Как ни печально, но предложенный (не лишенный заманчивости) вариант с override процедурой класса не проходит, ибо метод Render - как выяснилось не virtual...


Fosgen   (2005-06-02 09:20:00) [11]

2 XProger: ВААУ! СПАСИБО! Однако... Правда туплю - заменить один из методов класса... То ли смелости, то ли ума не хватило...


DeadMeat   (2005-06-01 01:09:00) [12]

Я так и не понял, почему NoZWrite не подходит...

---
...Death Is Only The Begining...


XProger   (2005-06-01 00:27:00) [13]

Draw замени на Render :o)


XProger   (2005-06-01 00:23:00) [14]


TParticle = class
...
procedure Render; virtual;
end;

TSprite = class(TParticle)
...
procedure Render; override;
end;

TSpark = class(TParticle)
...
procedure Render; override;
end;

procedure TSprite.Draw;
begin
glDisable(GL_DEPTH_TEST);
...
glEnable(GL_DEPTH_TEST);
end;

procedure TSpark.Draw;
begin
...
end;

var
Obj : array of TParticle;
begin
SetLength(Obj, 2);
Obj[0] := TSprite.Create;
Obj[1] := TSpark.Create;
...
for i := 0 to Length(Obj) - 1 do
Obj[i].Draw;
end;


Fosgen   (2005-05-31 23:51:00) [15]

2 Домовенок : Спасибо, этим уже давно пользуюсь, как и организацией своих классов и т.д., да вот только в DirectOpenGL это мало помогает или я что-то туплю. Разговор идет о классификации рендеренных объектов при исполнении события OnRender компонента DirectOpenGL в GLScene. Если я ничего не путаю... В частности надо перед рендерингом объектов класса TSprite вырубать DepthTest. Какой командой выключать я знаю. Уже знаю что это можно сделать в событии OnRender, но вот как это сделать ТОЛЬКО для СПРАЙТОВ? Причем вариант с превентивной организацией не про меня - у меня вся сцена динамически генерится, меняется каждую секунду и в разные DummyCube мне объекты даже по какому-то одному признаку заталкивать - не подходит... Хоть бы кусок кода привел хто-нить что ли...


Домовенок   (2005-05-31 23:19:00) [16]

> Fosgen (31.05.05 22:58) [13]

> Компилится в нем все - как отделить мух от котлет?

Мухи это мухи, а котлеты это котлеты. Так же и в твоем случае, спрайты это спрайты, FreeFormы это FreeFormы. У каждого объекта  есть ClassName можно по нему проверять что есть что – но это не очень удобно. Так же можно для каждого типа объектов задавать свой номер в свойстве Tag после чего уже определять по номеру в Tag что есть что. Еще очень полезно разбивать разные типы объектов в разные DummyCubes что бы потом можно было легко что-то найти. К примеру:

Есть 3 модели ящика и 5 модели бочки, помещаем ящики в DummyCube1, а бочки в DummeCube2. Допустим, нам понадобилась какая то бочка, ты сразу знаешь, что у тебя бочки в DummyCube2, остается только перебрать все содержимое DummyCube2 и определить какая из всех тамошних бочек является нужной тебе. В таком случае тебе не придется перебирать все ящики и проверять является ли этот ящик нужной тебе бочкой. Думаю, что этот пример поможет с экономить множество лишних проверок.


Fosgen   (2005-05-31 22:58:00) [17]

2 DeadMeat: Это конечно приятно. Спасибо за ответ, в принципе непосредственно с командами OpenGL я знаком, но все-таки неясно как разделять (на уровне DirectOpenGL), сваленные в одной куче (на уровне GLScene) объекты компилируемые с DepthTest и спрайты компилируемые без? А ведь именно в ЭТОМ вся загвоздка... OnRender событие одно. Компилится в нем все - как отделить мух от котлет? Причем ввиду динамически перестраиваемой сцены последовательность и тех и других непредсказуема...


DeadMeat   (2005-05-31 19:15:00) [18]

NoZWrite...
glDisable(GL_DEPTH_TEST); с учетом http://www.delphimaster.ru/cgi-bin/forum.pl?id=1117520325&n=9&web=1

---
...Death Is Only The Begining...


Fosgen   (2005-05-31 08:52:00) [19]

2 Xeno : Пока что не наступил на таковые грабли, но за предупреждение - благодарю. Использую исключительно модели в 3DS, потому как анимированные мне не требуются (по крайней мере на данном этапе), все модели с маппингом, все грузятся во FreeForm. В среднем число моделей в сцене от 20 до 100. Но это пока я некоторые модули доделаю... Динамика объектов довольно большая даже в таком диапазоне.
Да, извиняюсь за оффтоп, никто не сталкивался с задачей отключения Z-buffer (depth test) перед рендерингом СПРАЙТОВ в GLScene? Меня интересует скорее как это вставить в процесс рендеринга. Потому как все остальные объекты должны с буфером глубины обсчитываться... Если Вас не затруднит - подбросьте мысль, али намекните.


Xeno   (2005-05-31 06:30:00) [20]

>Fosgen  
Могу добавить, что вероятность возникновения глюка с TGLFreeForm и 3DS наиболее сильна при загрузке некоторого числа моделей(с использованием маппинга) с одинаковой текстурой...


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо