5

Relict Engine: Сборщик мусора и попытка избавится от наркомании

В прошлом посте у нас завязался интересный диалог с товарищем @TwoCow. После которого много думал.

В итоге этих дум: написал простенький Сборщик мусора и переписал базовый класс Object под ноль.
- Удалось избавится от NewObject (теперь православный operator new правит балом).
- Выкинул SharedPtr из наследников Object - они теперь создаются в отдельном дереве и бдят, в самих классах объектов живут сырые указатели.
- Удалением объекта, не смотря на то, что оператор delete работает (потом оберну логом, чтобы Error кидал), теперь занимается GC. Если объект является владельцем какого-либо другого объекта - они тоже грохаются, за исключением, если объект объявлен Рутом. В этом случае GC его игнорирует (но знает о его существовании) и удалит в случае, если началось завершение работы движка, либо был вызван Destroy после вызова RemoveFromRoot()
- Для удобства дебага добавил текстовое поле с именем класса.

Сам GC выполнен в виде двусвязного непрерывного списка. Срабатывает на следующий тик движка, после вызова операции. Т.е. при вызове Destroy() объект будет помечен на удаление, но удалится только в начале след. кадра. То-же самое с регистрацией. Сначала пометили, потом зарегистрировали.

Внутри страшно, поэтому показывать не буду. Надо итератор сделать, и еще разик эту пояту переписать.

Внутри страшно, поэтому показывать не буду. Надо итератор сделать, и еще разик эту пояту переписать.

Так-же чуть переделал инициализацию движка, на более логичную, а так-же добавил авто очистку объектов при завершении работы движка.

тест кейс

тест кейс

и результат работы

и результат работы

В дальнейшем надо будет еще добавить счетчики по кол-ву объектов каждого класса, причесать GC, и еще раз взглянуть на варианты использования классического конструктора. И потихонечку переключаться уже на другие задачи.

PS: пока писал пост заметил багу с удалением Рут Объектов ). Придется исправлять. Исправил.

Правила сообщества

ОБЩИЕ ПРАВИЛА:

- Уважайте чужой труд и используйте конструктивную критику

- Не занимайтесь саморекламой, пишите качественные и интересные посты

- Никакой политики


СТОИТ ПУБЛИКОВАТЬ:

- Посты о Вашей игре с историей её разработки и описанием полученного опыта

- Обучающие материалы, туториалы

- Интервью с опытными разработчиками

- Анонсы бесплатных мероприятий для разработчиков и истории их посещения;
- Ваши работы, если Вы художник/композитор и хотите поделиться ими на безвозмездной основе

НЕ СТОИТ ПУБЛИКОВАТЬ:

- Посты, содержащие только вопрос или просьбу помочь
- Посты, содержащие только идею игры

- Посты, единственная цель которых - набор команды для разработки игры

- Посты, не относящиеся к тематике сообщества

Подобные посты по решению администрации могут быть перемещены из сообщества в общую ленту.

ЗАПРЕЩЕНО:

- Публиковать бессодержательные посты с рекламой Вашего проекта (см. следующий пункт), а также все прочие посты, содержащие рекламу/рекламные интеграции

- Выдавать чужой труд за свой

Подобные посты будут перемещены из сообщества в общую ленту, а их авторы по решению администрации могут быть внесены в игнор-лист сообщества.


О РАЗМЕЩЕНИИ ССЫЛОК:

Ссылка на сторонний ресурс, связанный с игрой, допускается только при следующих условиях:

- Пост должен быть содержательным и интересным для пользователей, нести пользу для сообщества

- Ссылка должна размещаться непосредственно в начале или конце поста и только один раз

- Cсылка размещается в формате: "Страница игры в Steam: URL"