Вы не вошли.
Страницы 1
Столкнулся с проблемой уничтожения объектов. Когда это происходит игра вылетает после зависания. Но оставлять объекты мне не нужно, их может быть бесчисленное количество. В справке написано что уничтожать объекты безопасно если нету потомков и у некоторых объектов свои функции уничтожения. У меня нету у этих объектов потомков, но все равно вылетает из игры. Как очистить эти объекты? Ведь нужно экономить память, потому что если их не удалять а просто скрывать то это наверное приведет к неблагоприятному.
Offline
Не должно вылетать, если после уничтожения объект нигде не используется.
Но если создается и уничтожается много объектов динамически, то эффективнее не удалять их, а скрывать и заносить в какой-нибудь список, а потом оттуда доставать для переиспользования, когда нужно создать новый. Т.е., создать пул объектов.
Offline
я делаю вот так: ObjectDestroy(object);instance_destroy();
У меня есть разные объекты самого гамака и объекты xtreme внутри их
Я использую o_engine для создания объектов xtreme, потом создаю объект gm и в нем Proxy нужного объекта, чтобы каждый раз не загружать новый, потом его удаляю после использования (взрыва), но при удалении вылетает в редактор или зависает до завершения программы, я убрал удаление xtreme объекта и больше не вылетает. Но объект xtreme остается.
Редактировался Глеб (2022-03-19 17:52:50)
Offline
Я бы делал все в одном объекте - если привязывать их к объектам ГМ, которые еще и динамически создаются, могут быть проблемы, связанные с очередностью выполнения логики в Step. В теории оно может так работать, но просто отлаживать сложнее.
Если что-то не удаляется нормально, то скорее всего не все связи очищены, что-то где-то продолжает ссылаться на объект.
Но я, если честно, не тестировал удаление всех типов объектов, так что допускаю, что это может быть баг.
Offline
Просто в одном объекте не создашь количество нужных 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
Нет это не баг я проверил. Дело в том что после уничтожения объекта в степе на следующих строчках еще были функции с этим объектом
То есть уничтожение объекта должно быть самой последней ссылкой в степе на объект-xtreme. Если будет еще этот объект вызываться после в степе тогда игра зависнит или вылетит
Редактировался Глеб (2022-03-19 19:13:44)
Offline
Просто в одном объекте не создашь количество нужных 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
Да я так и делаю Proxy object Proxy actor, но несмотря на то, что мои деревья, тава, кусты - бревна obj все равно когда их становиться видно фпс падает вдвое, думаю уже бросать проект
Offline
Fps падает в отсутствие оптимизации покадровой нагрузки. Чем больше видимых объектов, тем больше расчетов матриц в Update и нагрузка на пайплайн для обработки примитивов (которые, возможно, в итоге вообще не будут отрисованы). Так что, по идее, нужно скрывать объекты, которые находятся за пределами экрана. Куллинг по пирамиде видимости - EngineSetCulling(vcObjectBased) или EngineSetCulling(vcHierarchical) - может в этом помочь, но не во всех случаях - например, если объекты находятся за стеной или горой, то они все равно считаются видимыми для куллинга.
В интерьерных сценах можно сделать систему порталов (т.е., показываем комнату, только если игрок в ней, или на экране виден дверной проем - и так же, рекурсивно, связанные с ней комнаты). В общем случае это будет вычислительно дешевле, чем обычный куллинг, который является брутфорс-алгоритмом - при использовании порталов мы вообще не проходим по заведомо невидимым комнатам и не проверяем их. Xtreme в принципе имеет все нужные для системы порталов инструменты, но у меня пока нет готовой реализации.
В уличных сценах можно для детализированных объектов сделать lod'ы и использовать мультипрокси, но это конечно немного усложняет логику игры, в зависимости от используемых компонентов.
Из-за того, что мало встроенных оптимизаций, GLScene/Xtreme3D - скорее для маленьких игр с ограниченным миром, чем для open world и тому подобного. Вообще библиотека, как я понимаю, изначально создавалась больше под научную визуализацию, да и игры в те времена были не такие большие.
Offline
Я использую ObjectInFrustrum и скрываю если ложь
Offline
Страницы 1