Войти
ПрограммированиеФорумОбщее

[РЕШЕНО] Godot GDNative c++: прошу помощи с Code Review. Никак не удается побороть segfault (3 стр)

Страницы: 1 2 3 4 5 Следующая »
#30
18:27, 24 янв. 2021

rcsim
> Тебе нужен централизованный менеджер
Можешь привести простой пример?


#31
18:29, 24 янв. 2021

rcsim
> Разумеется, бот не может быть удалён из памяти, пока у него есть действующие
> зависимости (пули).
Так как все эти зависимости проверить и удалить только тогда, когда их нет?

#32
(Правка: 20:00) 19:58, 24 янв. 2021

Robotex
Рекомендую почитать про Entity Component System и переписать всё с использованием entt (или подобной либы, но рекомендую именно entt), т.к. без обид, но твой текущий подход никуда не годится. ECS подход сильно упрощает жизнь и решает массу проблем - в том числе и ту, с которой ты столкнулся (spoiler: чтобы ссылаться на игровые сущности нужно использовать не указатели на память, а индексы/id-шники этих сущностей, по которым можно их найти или же понять, что их уже нет - например в entt для этого используются sparse set'ы).

#33
21:31, 24 янв. 2021

Alexander K
> нужно использовать не указатели на память, а индексы/id-шники этих сущностей
В Godot каждая сущность имеет уникальный id. Вот только не пойму, как по нему получить ссылку на объект

#34
23:30, 24 янв. 2021

Robotex
> В Godot каждая сущность имеет уникальный id. Вот только не пойму, как по нему
> получить ссылку на объект
Почитать документацию? И тогда:
1. Либо выяснить, что по этим id нельзя получить ссылку на объект - тогда читаешь что такое sparse set, вкручиваешь его в свою игру и используешь его.
2. Либо выяснить, что получить ссылку можно - тогда используешь этот выясненный нативный godot способ.
3. Либо выяснить, что получить ссылку можно, но это не оптимальный/медленный/неудобный способ - тогда также как в 1. сам вкручиваешь sparse set.
4. Либо выяснить, что документация так себе и ты тратишь больше времени на выяснение банальных вещей, нежели на написание игры - тогда выкидываешь godot, берёшь что попроще (sfml, sdl) и пишешь на них, прокачивая скиллы разработки, а не скиллы копания в чьих-то плоходокументированных технологиях.

#35
1:34, 25 янв. 2021

Alexander K
> Почитать документацию?
Нету там такого. Если бы было, я бы здесь сейчас херней не страдал

#36
1:38, 25 янв. 2021

rcsim
Можешь посмотреть?

TopDownShooter


Я добавил класс Managers/GameAgentsManager.h/.cpp который хранит в себе всех агентов и их instance_id, а указатели заменил на эти instance_id, по которым могу взять объект из менеджера и проверить, что он валидный.

Кидаю туда бота в Spawners/BotSpawner.cpp


Теперь падать перестало (тьфу, тьфу, тьфу).


Решение сварганил на скорую руку, чисто как proof of concept. Если есть рекомендации, что здесь можно улучшить, то с радостью их выслушаю.


Хотелось бы еще научиться считать ссылки на объект.

#37
(Правка: 2:27) 2:23, 25 янв. 2021

https://gitmemory.com/issue/GodotNativeTools/godot-cpp/281/487317637

создаётся впечатление что подход к object life time неряшливый

но есть же С++ со стандартными смарт-поинтерами, потом есть object pool с хендлами в котором кроме id зашито поколение, а там один шаг до ECS

#38
13:40, 25 янв. 2021

Robotex
> Можешь посмотреть?

Это minimal use case?

> Теперь падать перестало (тьфу, тьфу, тьфу).

Не понимаю твой подход.
Надо изначально проектировать правильно, чётко представляя жизненный цикл.
Воспользоваться диаграммами или даже на бумажке отрисовать все процессы, а не
просто рандомно чего то подкрутил и о чудо - заработало, "фиг-знает почему".

#!
> С++ со стандартными смарт-поинтерами,

смарт-поинтеры не помогут при бесконтрольной раздаче в собственность указателей в
100 мест, т.к. Node в GDnative - это это обёртка над Node внутри движка.

Смысла в хэндлах/айдишниках вместо указателей особого не вижу. В любом случае нужен
контейнер для администрирования объектов. Проблема в том, что у автора его видимо не было.
Контейнером кстати может быть ветка дерева сцены, или группа (есть такая фича в godot), в случае
если любой std контейнер "не охота" вводить.

#39
(Правка: 14:15) 14:14, 25 янв. 2021

rcsim
> Robotex
> > Теперь падать перестало (тьфу, тьфу, тьфу).
> Не понимаю твой подход.
У нас даже термин для такого есть:
https://gamedev.ru/code/terms/Voodoo_Programming  :D

rcsim
> Смысла в хэндлах/айдишниках вместо указателей особого не вижу.
Указатели можно использовать только если ты на 100% уверен в lifetime твоих объектов. Например у тебя фиксированный уровень в игре и все объекты гарантировано остаются в памяти пока игра запущена. Но такое очевидно больше подходит для небольших простых игр, и это не кейс ТС'а.

rcsim
> В любом случае нужен контейнер для администрирования объектов.
Об этом и речь. Встроенные механизмы godot'а, если таковые имеются, либо свои (sparse set как хороший вариант).

Robotex
> Alexander K
> > Почитать документацию?
> Нету там такого. Если бы было, я бы здесь сейчас херней не страдал
Может тогда не стоит тратить на него своё время?

#40
15:22, 25 янв. 2021

rcsim
> Надо изначально проектировать правильно, чётко представляя жизненный цикл.
Ну так объясни как правильно. Я же изначально написал, что в Годоте новичек. В своем движке то у меня все норм было, а здесь я не контролирую создание и удаление.

rcsim
> Это minimal use case?
Я тебе указал места в какие нужно посмотреть

rcsim
> В любом случае нужен
> контейнер для администрирования объектов.
Я тебе уже указал место, где он у меня и попросил оценить то ли это, что ты имеешь в виду или нет. В чем проблема?

Alexander K
> все объекты гарантировано остаются в памяти пока игра запущена
У меня постоянно идет спавн и уничтожение ботов. И я вообще не хочу заботиться о их времени жизни, пусть движок этим занимается

Alexander K
> Может тогда не стоит тратить на него своё время?
Ничего лучше человечество пока не создало.

Если не тратить время, то как тогда научиться?


Я конечно рад за вас, что вы все пиздец какие умные и пафосные, но мне толку от ваших насмешек мало. Я спросил совета, как делать правильно. Так и расскажите как делать правильно, если знаете.

#41
15:23, 25 янв. 2021

Alexander K
> У нас даже термин для такого есть:
> https://gamedev.ru/code/terms/Voodoo_Programming
А ты родился сразу с понимаем всех языков и технологий, да? ЧСВ поумерь, а то все ослепнем от белизны твоего пальто.

#42
15:39, 25 янв. 2021

Robotex
> Можешь привести простой пример?

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

Alexander K
> Указатели можно использовать только если ты на 100% уверен в lifetime твоих объектов.

Ключевое слово здесь "твоих", т.е. тех, которые сам кодер и создал.
Что мешает отслеживать статус своих объектов и иметь 100% уверенность, не знаю.
Независимо от указателей ли хэндлов ли. Устал это уже это повторять https://gamedev.ru/code/forum/?id=257509&m=5313579#m9

Alexander K
> Может тогда не стоит тратить на него своё время?
У автора проблемы не с Godot, а архитектурно-алгоритмические.

Да, у Godot есть не сразу очевидные, и пока плохо-документированные фичи, в части С++ особенно.
Но там на старте говорится: C++ требует внимания.
Например враппер новоинстанцированнй ноды валиден не сразу, а только после события ready.
И об этом в документации всё есть, и причины объясняются.

#43
16:03, 25 янв. 2021

Robotex
> Ну так объясни как правильно. Я же изначально написал, что в Годоте новичек.

Судя по темам, ты Годот раньше меня начал изучать. У меня первый комит в проект 2020-08-17 12:28:33 +0700 (5 months).

Robotex
> И я вообще не хочу заботиться о их времени жизни, пусть движок этим занимается
Сожалею что все мои попытки указать на невозможность этого не помогли.


Robotex
> Я тебе указал места в какие нужно посмотреть

Я не понимаю твоей общей задачи, поэтому смысла в этом нет.

#44
16:18, 25 янв. 2021

#!
> https://gitmemory.com/issue/GodotNativeTools/godot-cpp/281/487317637
Большое спасибо, то что нужно

Страницы: 1 2 3 4 5 Следующая »
ПрограммированиеФорумОбщее