Карта подсистем движка
Границы подсистем, владение объектами и путь от Entity к серверу.
Reckfell разделяет иерархию игры, службы подсистем и платформенные реализации. Это границы кода внутри процесса движка, а не сетевые микросервисы. Для игровой логики начинайте с Entity и Resource; обращайтесь к серверу напрямую, когда нужен его низкоуровневый контракт и вы готовы управлять нужными дескрипторами.
Карта ответственности
| Область | За что отвечает | Путь в текущих исходниках |
|---|---|---|
| Ядро | Идентичность объектов, регистрация ClassDB, Variant, подсчёт ссылок, загрузка ресурсов, контейнеры и файлы | Source/core/ |
| Иерархия игры | Связи родитель/потомок Entity, обработка EntityTree, объекты 2D/3D и интерфейс | Source/scene/ |
| Серверы | Интерфейсы и реализации рендеринга, звука, физики и навигации | Source/servers/ |
| Драйверы | Код графических и звуковых бэкендов и другие низкоуровневые интеграции | Source/drivers/ |
| Платформа | Интеграция с ОС, точки входа и платформенные реализации | Source/platform/ |
| Запуск и координация кадра | Инициализация, выбор MainLoop, шаги физики, обработка кадра, синхронизация рендеринга и завершение | Source/main/main.cpp |
| Редактор | Инструменты разработки, инспекторы, интерфейс импорта и плагины редактора | Source/editor/ |
| Модули | Возможности, регистрируемые на определённых уровнях инициализации, включая C# | Source/modules/ |
Это карта ответственности, а не строгая цепочка зависимостей в одну сторону. Ядро обслуживает несколько уровней; реализации серверов могут находиться и в модулях. Набор возможностей и доступность бэкендов зависят от сборки.
Entity, Resource и RID
Entity наследует нативный Object, доступный в C# как ReckfellObject, и участвует в иерархии родителей и потомков. EntityTree наследует MainLoop и координирует активную иерархию. Родитель Entity в дереве и родительский класс — разные связи. Название Entity само по себе не превращает эту архитектуру в ECS.
Resource наследует RefCounted. Текстура или материал — повторно используемые данные со своим временем жизни; для них не требуется отдельная Entity в дереве. Несколько объектов могут ссылаться на один ресурс: изменение общего материала способно затронуть всех его потребителей. Подробности: объекты и время жизни, наследование классов.
RID — дескриптор для серверных API. Это не Entity, не ссылка на объект C# и не универсальное свидетельство владения. Не вызывайте FreeRid для дескриптора, полученного от Resource или Entity: владеющий объект может продолжать его использовать. Для дескриптора, созданного напрямую через сервер, выполняйте освобождение по контракту этого API.
Путь одного отображаемого объекта
- VisualInstance3D в нативном конструкторе создаёт экземпляр рендеринга через RenderingServer.
- Передаёт серверу изменения видимости и трансформации; при входе в World3D связывает экземпляр со сценарием рендеринга.
- В деструкторе освобождает экземпляр рендеринга. Поэтому вручную освобождать полученный от него RID опасно.
- Главный цикл синхронизирует рендеринг и запрашивает отрисовку, когда это допускают условия активного вывода и цикла.
Объект-обёртка отвечает за интеграцию с иерархией, сервер рендеринга — за представление для отрисовки. Прямой серверный вызов автоматически не создаёт Entity, запись в инспекторе или жизненный цикл игрового скрипта. Устройство конвейера ниже этой границы описано в архитектуре рендеринга.
Запуск и порядок кадра
Main инициализирует ядро, серверы, игровые типы и применимые модули, затем выбирает MainLoop; обычные проекты используют EntityTree. Кадр может содержать несколько фиксированных шагов физики и обновление с переменным интервалом. Main также выполняет отложенную работу в определённых точках и координирует физику, навигацию, рендеринг и звук. Названия каталогов не определяют безопасный поток или порядок обратных вызовов: проверяйте конкретное уведомление, контракт сервера и код синхронизации.
Обзор сверен с текущими исходниками. Существующие проверки Windows runtime подтверждают нативное наследование, отличие родителя класса от родителя в дереве, отложенные вызовы и удаление через очередь. Они не проверяют все бэкенды, платформенные пути инициализации, режимы потоков или сборку C++-модуля. Пути указывают расположение локальной реализации, а не загрузку исходников с сайта.