11

Relict Engine: Мир и DevLog 20250928

Краткий список изменений

  • Добавлен абстрактный класс GameEntity

  • Добавлен класс GameWorld

  • Атом SceneEntity больше не является атомом и переделан в полноценную Object сущность

  • Исправлено поведение флага Dirty у трансформы SceneEntity, в случае перезаписи трансформы из внешнего источника

  • Исправлено поведение наследных классов от класса с флагом FreeDefaultNoInst

    см ниже

Мир

Схематичное представление потока данных

Схематичное представление потока данных

По сути система будет очень похожа на аналогичную в Unreal Engine, но просто потому, что достаточно сложно, при выбранной модели памяти, данные организовать как-то иначе (плюс не забываем про lua скриптовые сущности, которые рано или поздно нужно будет туда прикрутить).
Изначально конечно планировалось использовать наборные сущности через классы Атомы (что в дальнейшем должно было упростить прикручивание ECS системы), но при экспериментах выяснилось, что данная система сильно переусложняет код, и не позволяет разграничить элементную базу по их типу (множественное наследование от одного базового класса с одним потомком).

Пройдемся кратко:
GameEntity - аналог UE (AActorBase) - минимальная единица, которую понимает и принимает GameWorld. Является контейнером для игровой логики, графических ассетов и прочего. так-же является единицей взаимодействия программиста с движком.

GameWorld - аналог UE (UWorld) - представляет из себя игровой мир. Рулит тиками GameEntity, спавнит эти самые GameEntity, дергает их евенты, и прочее.

* Scene - Набор контейнеров - сцен для разных задач. Логика достаточно проста: если компонент GameEntity графический, то летит в Renderer Scene; если звуковой, то в Sound Scene, а если коллайдер, то в Physic Scene. Возможно, в дальнейшем появится еще и Network Scene, но это не точно.

FreeDefaultNoInst

Начиная с этого участка кода в роль вступает флаг памяти FreeDefaultNoInst, который я кратенько описывал в первых постах серии. Он служит для того, чтобы Сборщик мусора, при удалении последнего экземпляра класса так-же удалял и его архетип (или DefaultClassObject, или просто DO). Если классы уровня ядра не использовали данный флаг, т.к. в нем не было большого смысла, ибо экземпляры этих классов по большей части живут от старта и до выключения движка, то на классах уровня, скажем, мира, этот флаг применяется. Т.е. память не будет захламляться мусором, и будет очищаться от ненужных сущностей по мере необходимости.

Например:

Небольшой тестовый проект работы флага FreeDefaultNoInst (Actor наследный класс от GameEntity)

Небольшой тестовый проект работы флага FreeDefaultNoInst (Actor наследный класс от GameEntity)

Данный код при запуске движка создает объект Actor, при этом, без привязки к RootObject родителю, что означает, что в ближайшее несколько тиков он удалится. И в тике проверяет состояние его DefaultObject. Ну и соответственно выводит в консоль удалился он или нет.

В случае, если флаг не установлен, то мы увидим картину:

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

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

А если установлен, то:

Флаг установлен, после удаления единственного экземпляра Actor, так-же удаляется и его DO

Флаг установлен, после удаления единственного экземпляра Actor, так-же удаляется и его DO

И для понимания: в дальнейшем, использование NewObject для наследных классов GameEntity не будет корректным решением. Оно будет заменено на другой вызов, который будет является оберткой над GameWorld

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

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

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

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

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


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

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

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

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

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

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

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

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

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

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

ЗАПРЕЩЕНО:

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

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

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


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

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

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

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

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