Полезное

Мы Вконтакте

Discord канал

#
Пред.
12
Аватара пользователя
Пользователь
Сообщения: 261
есть класс- обертка, который использую уже конкретно в экторах. В нем содержится static объект и методы вызывающие методы объекта.
Один из методов Add(...) .Он вызывает Add(...) у static объекта, там оператором new создается несколько объектов, если данные объекты уже были созданы, то ничего не делается. Один из создаваемых объектов поток( наследник от FRunnable). Ну и естественно деструктор у статик объекта оператором delete высвобождает память.
В уже собранном проекте пока особо проблем не заметил, вижу что память освобождается чуть ли не самой последней для статика. Примерно тогда, когда в диспетчер исчезает процесс. Грубое завершение процесса тоже проблем особо не создало, но может мало тестировал.

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

Пробовал делать счетчик пользователей (+1 при каждом конструировании класса обертки, -1 и проверка на 0 при каждом деструкторе класса обертки, при 0 - очистка памяти) результат не изменился.

С аварийными завершениями программ пока не работал, что и где можно почитать по этой теме?
Или это особенности работы в едиторе вызывают такую ситуацию и просто так это не лечится?
Если внешнее устройство попытаться подключить повторно, то ничего не должно получится, в случае едитора оно как запустилось так и работает, включай снова, выключай... информация передается корректно, соответственно статик объект не разрушается при завершении симуляции. Едитор запускает конструкторы класса при загрузки проекта, часть классов строится в BeginPlay() объектов. При завершении симуляции как освободить динамически выделенную память?
Аватара пользователя
Пользователь
Сообщения: 860
Static data members are initialized and destroyed exactly like non-local objects.

Objects with a static lifetime will be destructed when the application terminates. Among the various static objects that might be in the program, the destructors are called in the reverse order of how the objects were constructed.

The construction/destruction of object instances has no effect on when a static member is constructed or destroyed.
_________________
https://www.facebook.com/groups/uejob/
Аватара пользователя
Пользователь
Сообщения: 261
Спасибо, это знаю, значит буду думать как отвязать статик Manager от тех объектов, которыми он управляет. Хотя связанности то и нету на первый взгляд, внутри себя создал объект, внутри и удалил. Да, мб лучше надо потестировать, может чего не досмотрел.
Аватара пользователя
Пользователь
Сообщения: 860
Miha15z писал(а):
Спасибо, это знаю, значит буду думать как отвязать статик Manager от тех объектов, которыми он управляет. Хотя связанности то и нету на первый взгляд, внутри себя создал объект, внутри и удалил. Да, мб лучше надо потестировать, может чего не досмотрел.


Ок, напишешь потом результат? Тоже интересует этот момент.
_________________
https://www.facebook.com/groups/uejob/
Аватара пользователя
Пользователь
Сообщения: 261
Немного про результаты использования static в ue ранее: мне нужно было сделать счетчик объектов класса. Генерировал мир плагином, нужно было в зависимости от номера класса передавать координаты точек сплайна(отсутствие какого либо номера не было критично), (при такой генерации конструктор скрипт у объектов при добавлении на сцену не запускался, если принудительно его не запустить - это уже относится к решению проблемы), ну и при попытке считать номер класса везде получал 1, а сплайны у всех объектов были как у 1 номера. Проблема решалась созданием объекта, который запустит конструктор скрипты каждого и созданных на сцене, и передаст информацию о точках сплайна.

Как понял в Едиторе, хз как в сборке самого проекта, изначально объект создается всего один раз, а на сцене вызывается только Draw(), для каждого "объекта" ( если объекты преобразовать в инстансы по материалу, это будет всего 1 дравкол для всех объектов данного вида, что примерно делает "кисть" в UE - очень важная оптимизация для насыщенных миров). Это объясняло почему не работал нормально взрыв для разрушаемых объектов одного вида, так как взрыв находил только один объект. Но стоило сделать их отличными друг от друга(нанести урон единичной цели ) и вуаля, все работает.

Это хорошая оптимизация относительно памяти, но проблем она иногда создает кучу.

К вечеру отпишусь по решению с очисткой памяти.
Аватара пользователя
Пользователь
Сообщения: 860
Miha15z писал(а):

Это хорошая оптимизация относительно памяти, но проблем она иногда создает кучу.

К вечеру отпишусь по решению с очисткой памяти.


Спасибо, очень полезная инфо.
_________________
https://www.facebook.com/groups/uejob/
Аватара пользователя
Пользователь
Сообщения: 261
Немного результатов работы:

- Ну первое что просчелкал, это виртуальные деструкторы для эктаров. Дополнительно создавал наследника блюпринта а вот удаления не видел его.

-Исходные данные: 4 объекта в контентбраузере 2 с++ класса и 2 их наследника, все юзают статик класс через оболочку. на сцене 4 объекта
при старте конструктора оболочки получаем +1 к счетчику ссылок, при деструкторе -1
---- итог 9 вызовов конструктора оболочки
Старт проекта из едитаро -- 9+4 = 13 ссылок, завершение 9 - все логично

собранный проект 4 различных объекта на сцене - 8 ссылок - наверное логично, учтя что движок делит визуальную и физическую часть.

собранный проект: 4 уникальных объетка, 5 копий = 9 объектов на сцене - 13 ссылок логично 8 для уникалок и 5 на копии в один из потоков

По очистке памяти.... (это наверное ужасно выглядит...) ввел флаг очищена память или нет, сделал свой счетчик вызовов конструкторов /деструкторов класса оболочки, по достижению 0 очищаю память и выставляю фллаг как истина. В деструкторе также проверяю очищена ли память, если нет то чищу.
Для едитора завел таймер, если после старта время не сбрасывается в тике, чистить память и выключать внешние устройства. Тут счетчик ссылок чутка бесполезен.

Получить синий экран смерти как вчера пока не удалось, буду еще тестировать.
Аватара пользователя
Пользователь
Сообщения: 261
один объект на сцене, собранный проект- 4 ссылки - ломает всю построенную ранее логику.... хотя в самом проекте еще 3 не используемых объекта, но все равно ломает...
Аватара пользователя
Пользователь
Сообщения: 261
Ну как итог: не фиг делать выделение памяти в конструкторе Actor, все в бегин плей, тогда и ссылок сколько объектов, и счетчик нормально работает , единственное надо упоминать, что память была очищена, и хоть класс существует, надо выделить заново.
Аватара пользователя
Пользователь
Сообщения: 860
Miha15z писал(а):
Ну как итог: не фиг делать выделение памяти в конструкторе Actor, все в бегин плей, тогда и ссылок сколько объектов, и счетчик нормально работает , единственное надо упоминать, что память была очищена, и хоть класс существует, надо выделить заново.


Я использовал PostInitializeComponents для выделения памяти. Должно нормально обрабытываться и в редакторе и в игре.
_________________
https://www.facebook.com/groups/uejob/


Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 52

UEngine.ru © 2017
Все права защищены. При копировании материалов с сайта, ссылка на первоисточник обязательна.
Яндекс.Метрика
Главная страница