1.4 KiB
1.4 KiB
Transform 组件分析
组件职责
Transform.* 负责实体空间变换数据:
- 位置、旋转、朝向、缩放存储;
- 世界矩阵与逆矩阵计算;
- 脏标记记录与批量更新入口。
数据布局
Transform.cpp 采用并行数组(SoA):
positions / rotations / orientations / scalesto_world / inv_worldhas_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 交互,不直接暴露内部数组。