Editor Data Storage Plugin (TEDS)
概述
Editor Data Storage (TEDS) 是一个基于Mass Entity System的编辑器数据存储插件。它提供了一个中心化的、可扩展的数据存储系统,用于编辑器和相关数据的管理,并支持通过一系列widget进行查看和编辑。
核心功能
1. 数据存储系统
- 基于Mass Entity System构建
- 支持表格化数据存储(Table-based storage)
- 数据组织方式:
- 表(Table):数据的顶层组织单位,通过TableHandle进行引用
- 行(Row):表中的一条记录,通过RowHandle进行引用
- 列(Column):基于UScriptStruct定义的数据类型,支持动态生成
- 主要操作:
- 表操作:RegisterTable、FindTable
- 行操作:AddRow、BatchAddRow、RemoveRow
- 列操作:AddColumn、RemoveColumn、GetColumnData
- 特点:
- 强类型:每个列都是基于UScriptStruct的强类型数据
- 灵活性:支持动态添加/删除列
- 批量操作:支持批量添加行和列,提高性能
- 观察者模式:支持数据变更通知(Add/Remove事件)
- 数据组织方式:
2. 查询系统
- 提供高效的数据查询机制
- 支持不同的查询执行阶段(PreUpdate、Update、PostUpdate)
- 可自定义查询组(Query Groups)和执行顺序
3. 数据索引
- 支持数据索引化,提高查询效率
- 提供批量索引操作
- 支持动态重索引
4. 工厂系统
- 可扩展的工厂系统,支持自定义数据存储工厂
- 工厂排序机制,确保正确的初始化顺序
5. UI支持
- 提供专门的TedsUI模块
- 包含可重用的widget组件
- 支持数据的可视化展示和编辑
技术特点
Mass Entity Integration
- 与Unreal Engine的Mass Entity System深度集成
- 利用Mass Entity System的高性能特性
- 支持实体管理和处理阶段
模块化设计
- 核心功能模块(TedsCore)
- UI展示模块(TedsUI)
- 清晰的模块间依赖关系
扩展性
- 支持自定义数据类型
- 可扩展的查询系统
- 插件化的架构设计
性能优化
- 批量操作支持
- 高效的数据索引
- 优化的内存管理
应用场景
编辑器工具开发
- 为编辑器工具提供统一的数据存储接口
- 简化编辑器数据管理
数据驱动的编辑器功能
- 支持复杂的数据关系管理
- 提供高效的数据查询和操作
可视化数据编辑
- 通过widget系统提供直观的数据编辑界面
- 支持自定义数据展示方式
使用示例
1. 基本数据存储操作
cpp
// 1. 定义数据结构
USTRUCT()
struct FMyCustomData
{
GENERATED_BODY()
UPROPERTY()
FString Name;
UPROPERTY()
int32 Value;
};
// 2. 注册表
TableHandle MyTable = TedsInterface->RegisterTable(
{
FMyCustomData::StaticStruct()
},
TEXT("MyCustomTable")
);
// 3. 添加数据行
RowHandle Row = TedsInterface->AddRow(MyTable);
// 4. 添加列数据
TedsInterface->AddColumn(Row, FMyCustomData::StaticStruct());
// 5. 获取和修改数据
if (FMyCustomData* Data = static_cast<FMyCustomData*>(TedsInterface->GetColumnData(Row, FMyCustomData::StaticStruct())))
{
Data->Name = TEXT("Test");
Data->Value = 42;
}
2. 批量操作示例
cpp
// 批量添加行
auto RowInitCallback = [](RowHandle NewRow)
{
// 初始化新行的数据
};
TedsInterface->BatchAddRow(MyTable, 100, RowInitCallback);
// 批量添加/删除列
TArray<const UScriptStruct*> ColumnsToAdd = { FMyCustomData::StaticStruct() };
TArray<const UScriptStruct*> ColumnsToRemove;
TedsInterface->BatchAddRemoveColumns(Rows, ColumnsToAdd, ColumnsToRemove);
3. 数据观察示例
cpp
// 注册观察者,监听数据变更
QueryHandle Handle = TedsInterface->RegisterQuery(
Select(
TEXT("MyObserver"),
FObserver(FObserver::EEvent::Add, FMyCustomData::StaticStruct()),
[](IQueryContext& Context, RowHandle Row)
{
// 处理数据添加事件
})
.Compile()
);
4. 查询示例
cpp
// 创建并执行查询
QueryHandle QueryHandle = TedsInterface->RegisterQuery(
Select(TEXT("MyQuery"))
.Where(FMyCustomData::StaticStruct())
.Execute([](IQueryContext& Context, RowHandle Row)
{
// 处理查询结果
})
.Compile()
);
// 运行查询
TedsInterface->RunQuery(QueryHandle);
最佳实践
性能优化
- 使用批量操作代替单个操作
- 合理使用索引提高查询效率
- 避免频繁的列操作
数据组织
- 根据数据的关联性合理设计表结构
- 使用合适的列类型
- 保持列的数据结构简单和清晰
内存管理
- 及时清理不需要的行和列
- 使用适当的数据类型避免内存浪费
- 合理使用批量操作减少内存碎片
注意事项
- 该插件目前处于实验阶段(Experimental)
- 需要了解Mass Entity System的基本概念
- 建议在开发编辑器工具时使用,不适用于运行时数据存储