接下来让我们继续看ISystem
ISystem
ISystem和SystemBase类似,但是ISystem是非托管系统
他必须要这三个抽象方法
- OnCreate 在使用前初始化系统及其数据
- OnUpdate 添加系统每帧必须执行的工作
- OnDestroy 销毁前清理资源
因为ISystem不是通过基类继承的,所以每个抽象方法和回调里面都有一个 ref SystemState 参数,可用于访问 World、WorldUnsigned 或上下文数据和 API(如 EntityManager)。
而在Isystem里面调用多线程处理逻辑,方法就要比SystemBase要少的多了
- IJobEntity:循环访问多个实体中的组件数据,您可以跨系统重用这些数据。
- IJobChunk:按原型块循环访问数据。
只有这两种方法
ISystem和SystemBase一样提供了相同的接口和相同的时序
- OnStartRunning 首次调用 之前的系统事件回调,以及系统停止或禁用后恢复时的系统事件回调。
- OnStopRunning 当系统被禁用或与系统更新所需的任何组件不匹配时,系统事件回调。
正常使用
partial struct SPeedSystemBaker : ISystem
{
public void OnCreate(ref SystemState state)
{
}
public void OnUpdate(ref SystemState state)
{
var queryMissingTag = SystemAPI.QueryBuilder().WithAll<MoveComponent>().Build();
state.EntityManager.AddComponent<ComponentAddTag>(queryMissingTag);
}
public void OnDestory(ref SystemState state)
{
}
}
ISystem与SystemBase的不同之处
ISystem 可以使用 Burst编译、非托管内存分配、原子性的Foreach访问、使用IJobEntity与IJobChunk。
而SystemBase可以使用GC、可存储管理托管对象、原子性Foreach、Entities.ForEach、Job.WithCode、使用IJobEntity与IJobChunk并且支持继承
ISystem的好处是可以使用Burst编译,并且允许在主线程上运行突发代码
而SystemBase的好处是使用更加方便,有GC并且支持继承