#1 2022-03-19 17:06:18

Глеб
Участник
Зарегистрирован: 2022-03-04
Сообщений: 48

Уничтожение объектов

Столкнулся с проблемой уничтожения объектов. Когда это происходит игра вылетает после зависания. Но оставлять объекты мне не нужно, их может быть бесчисленное количество. В справке написано что уничтожать объекты безопасно если нету потомков и у некоторых объектов свои функции уничтожения. У меня нету у этих объектов потомков, но все равно вылетает из игры. Как очистить эти объекты? Ведь нужно экономить память, потому что если их не удалять а просто скрывать то это наверное приведет к неблагоприятному.

Offline

#2 2022-03-19 17:38:39

Gecko
Админ
Из РФ, Казань
Зарегистрирован: 2018-06-02
Сообщений: 164
Сайт

Re: Уничтожение объектов

Не должно вылетать, если после уничтожения объект нигде не используется.
Но если создается и уничтожается много объектов динамически, то эффективнее не удалять их, а скрывать и заносить в какой-нибудь список, а потом оттуда доставать для переиспользования, когда нужно создать новый. Т.е., создать пул объектов.

Offline

#3 2022-03-19 17:41:04

Глеб
Участник
Зарегистрирован: 2022-03-04
Сообщений: 48

Re: Уничтожение объектов

я делаю вот так: ObjectDestroy(object);instance_destroy();
У меня есть разные объекты самого гамака и объекты xtreme внутри их
Я использую o_engine для создания объектов xtreme, потом создаю объект gm и в нем Proxy нужного объекта, чтобы каждый раз не загружать новый, потом его удаляю после использования (взрыва), но при удалении вылетает в редактор или зависает до завершения программы, я убрал удаление xtreme объекта и больше не вылетает. Но объект xtreme остается.

Редактировался Глеб (2022-03-19 17:52:50)

Offline

#4 2022-03-19 18:04:45

Gecko
Админ
Из РФ, Казань
Зарегистрирован: 2018-06-02
Сообщений: 164
Сайт

Re: Уничтожение объектов

Я бы делал все в одном объекте - если привязывать их к объектам ГМ, которые еще и динамически создаются, могут быть проблемы, связанные с очередностью выполнения логики в Step. В теории оно может так работать, но просто отлаживать сложнее.
Если что-то не удаляется нормально, то скорее всего не все связи очищены, что-то где-то продолжает ссылаться на объект.
Но я, если честно, не тестировал удаление всех типов объектов, так что допускаю, что это может быть баг.

Offline

#5 2022-03-19 18:19:07

Глеб
Участник
Зарегистрирован: 2022-03-04
Сообщений: 48

Re: Уничтожение объектов

Просто в одном объекте не создашь количество нужных xtreme-объектов приближенной к бесконечности, в отличии от создания нового объекта-gm. Таких может быть бесчисленное множество. А делать все в объекте engine дает скончаемое количество (так как каждый xtreme-объект имеет свое имя).
К тому же я использую direction объекта для его поворота по Y и x y гамака, для передвижения. Остается только ObjectSetPosition(object,x,Y,y); Мне это нужно для движения и вычислений функций гамака, которые не стыкуются с объектами xtreme (например instance_nearest(x,y,object)) и их проще выставить в комнате (если они привязаны к x y). Есть какой-то другой способ о котором я не знаю?
Это может быть не баг если после события аларм происходит чтение из события степа объекта. Это может быть так? У меня в событии аларм уничтожается объект, а в степе еще есть функции с этим объектом.

Редактировался Глеб (2022-03-19 18:50:34)

Offline

#6 2022-03-19 18:57:48

Глеб
Участник
Зарегистрирован: 2022-03-04
Сообщений: 48

Re: Уничтожение объектов

Нет это не баг я проверил. Дело в том что после уничтожения объекта в степе на следующих строчках еще были функции с этим объектом
То есть уничтожение объекта должно быть самой последней ссылкой в степе на объект-xtreme. Если будет еще этот объект вызываться после в степе тогда игра зависнит или вылетит

Редактировался Глеб (2022-03-19 19:13:44)

Offline

#7 2022-03-21 08:07:42

Gecko
Админ
Из РФ, Казань
Зарегистрирован: 2018-06-02
Сообщений: 164
Сайт

Re: Уничтожение объектов

Просто в одном объекте не создашь количество нужных xtreme-объектов приближенной к бесконечности, в отличии от создания нового объекта-gm. Таких может быть бесчисленное множество. А делать все в объекте engine дает скончаемое количество (так как каждый xtreme-объект имеет свое имя).

Нет такого ограничения, для Xtreme совершенно не важно, как ты создаешь его объекты - он про ГМ ничего не знает. Это чисто вопрос архитектуры приложения.

К тому же я использую direction объекта для его поворота по Y и x y гамака, для передвижения. Остается только ObjectSetPosition(object,x,Y,y); Мне это нужно для движения и вычислений функций гамака, которые не стыкуются с объектами xtreme (например instance_nearest(x,y,object)) и их проще выставить в комнате (если они привязаны к x y). Есть какой-то другой способ о котором я не знаю?

Если так, то да, есть смысл делать в объектах ГМ. Но как я уже сказал, если что-то удалять динамически, есть риск того, что где-то остаются ссылки на несуществующие объекты.

Это может быть не баг если после события аларм происходит чтение из события степа объекта. Это может быть так? У меня в событии аларм уничтожается объект, а в степе еще есть функции с этим объектом.

Очень вероятно, что проблема где-то тут)

Кстати, забыл сказать: у видимых объектов Xtreme графические данные всегда создаются заново (у моделей, примитивов и пр.). Если нужно много точных копий объекта, то надо использовать Proxy (или ActorProxy), иначе память у тебя будет засоряться лишними копиями моделей.

Offline

#8 2022-03-21 18:42:51

Глеб
Участник
Зарегистрирован: 2022-03-04
Сообщений: 48

Re: Уничтожение объектов

Да я так и делаю Proxy object Proxy actor, но несмотря на то, что мои деревья, тава, кусты - бревна obj все равно когда их становиться видно фпс падает вдвое, думаю уже бросать проект

Offline

#9 2022-03-23 10:00:04

Gecko
Админ
Из РФ, Казань
Зарегистрирован: 2018-06-02
Сообщений: 164
Сайт

Re: Уничтожение объектов

Fps падает в отсутствие оптимизации покадровой нагрузки. Чем больше видимых объектов, тем больше расчетов матриц в Update и нагрузка на пайплайн для обработки примитивов (которые, возможно, в итоге вообще не будут отрисованы). Так что, по идее, нужно скрывать объекты, которые находятся за пределами экрана. Куллинг по пирамиде видимости - EngineSetCulling(vcObjectBased) или EngineSetCulling(vcHierarchical) - может в этом помочь, но не во всех случаях - например, если объекты находятся за стеной или горой, то они все равно считаются видимыми для куллинга.
В интерьерных сценах можно сделать систему порталов (т.е., показываем комнату, только если игрок в ней, или на экране виден дверной проем - и так же, рекурсивно, связанные с ней комнаты). В общем случае это будет вычислительно дешевле, чем обычный куллинг, который является брутфорс-алгоритмом - при использовании порталов мы вообще не проходим по заведомо невидимым комнатам и не проверяем их. Xtreme в принципе имеет все нужные для системы порталов инструменты, но у меня пока нет готовой реализации.
В уличных сценах можно для детализированных объектов сделать lod'ы и использовать мультипрокси, но это конечно немного усложняет логику игры, в зависимости от используемых компонентов.

Из-за того, что мало встроенных оптимизаций, GLScene/Xtreme3D - скорее для маленьких игр с ограниченным миром, чем для open world и тому подобного. Вообще библиотека, как я понимаю, изначально создавалась больше под научную визуализацию, да и игры в те времена были не такие большие.

Offline

#10 2022-03-23 13:32:04

Глеб
Участник
Зарегистрирован: 2022-03-04
Сообщений: 48

Re: Уничтожение объектов

Я использую ObjectInFrustrum и скрываю если ложь

Offline

Подвал доски

Под управлением FluxBB