# Transform 组件分析 ## 组件职责 `Transform.*` 负责实体空间变换数据: - 位置、旋转、朝向、缩放存储; - 世界矩阵与逆矩阵计算; - 脏标记记录与批量更新入口。 ## 数据布局 `Transform.cpp` 采用并行数组(SoA): - `positions / rotations / orientations / scales` - `to_world / inv_world` - `has_transform`:矩阵缓存有效位 - `changes_from_previous_frame`:逐帧脏标记 ## 创建与绑定 `transform::create(init_info, entity)` 使用 `entity_id` 的索引位定位槽位: - 若槽位已存在,覆写其数据并标记脏; - 若槽位不存在,扩容所有并行数组; - 返回 `transform::component{ transform_id{ entity.get_id() } }`。 这说明 Transform 不维护独立 free list,而是复用实体索引空间。 ## 读写策略 - 写接口(`set_rotation/position/scale`)只改数据与脏标记; - `get_transform_matrices` 在读取时按需计算矩阵; - 通过 `has_transform` 避免重复矩阵重算。 ## 批量更新机制 `transform::update(cache, count)` 接收 `component_cache` 数组: - 每条 cache 带 `flags` 指示写哪些字段; - 逐条落地到内部并行数组; - 适配脚本系统“先缓存,后统一提交”的帧内流程。 ## 设计特点 - 读取快:索引直达; - 可批处理:cache + flags; - 低耦合:外部通过句柄和 cache 交互,不直接暴露内部数组。