![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
GlScene, Objects
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 наиболее сильна при загрузке некоторого числа моделей(с использованием маппинга) с одинаковой текстурой...