SoA и архетипы¶
SoA-слой хранит data-only компоненты в плотном формате и группирует сущности по type_mask.
Регистрация SoA-типа¶
tc_soa_type_id id = tc_entity_pool_register_soa_type(pool, &(tc_soa_type_desc){
.name = "Velocity",
.element_size = sizeof(Velocity),
.init = NULL,
.destroy = NULL
});
Ограничение: максимум 64 типа (TC_SOA_MAX_TYPES).
Добавление и удаление¶
tc_entity_pool_add_soa(pool, entity, type_id);
tc_entity_pool_remove_soa(pool, entity, type_id);
Эти операции меняют type_mask сущности и, при необходимости, переносят её между архетипами (миграция).
Доступ к данным сущности¶
| Функция | Описание |
|---|---|
tc_entity_pool_has_soa(pool, entity, type_id) |
Есть ли SoA-данные этого типа |
tc_entity_pool_get_soa(pool, entity, type_id) |
Указатель на данные |
tc_entity_pool_soa_mask(pool, entity) |
Текущая type_mask сущности |
Query по архетипам¶
tc_soa_query фильтрует архетипы по required_mask и excluded_mask и возвращает chunk:
tc_soa_query_result result;
while (tc_soa_query_next(pool, &query, &result)) {
// result.entities — массив entity_id
// result.data[i] — массив данных для i-го required типа
// result.count — количество сущностей в chunk
}
Когда использовать¶
| Задача | Подход |
|---|---|
| Массовые проходы по однотипным данным (физика, AI) | SoA-архетипы |
| Lifecycle-поведение (start/update/render) | Object-компоненты |
| Смешанная логика | Оба: SoA для данных, object-компонент для управления |