「这是我参与2022首次更文挑战的第10天,活动详情查看:2022首次更文挑战」。
作为一名优秀的开发者,对于技术的探求应该是永无止步的,如何让自己更进步,那就只有不停的学习,不停的充电.而这些都都是说起来容易做起来难,坚持才是难的地方 --蛙哈哈
什么是Dots
Dots的全称是: Data-Oriented Tech Stack 中文名称为:多线程技术数据导向型技术栈
Dots由三部分组成:
- ECS Entity Component System
- Jobs System
- Burst Compiler
什么是ECS
关于ECS的介绍请看此文章: ECS
什么是 Jobs System
作业系统
多线程
- 作业系统将通过创建 job 而不是线程,来管理多线程代码
- 作业系统将跨多个核心管理一组工作线程, 此系统通常每个逻辑 CPU 核心对应一个工作线程,这样可以避免上下文切换
- 作业系统将作业放入作业队列中以待执行, 作业系统中的工作线程从作业队列中获取并执行所需项, 作业系统会管理依赖关系并确保作业以适当的顺序执行
依赖关系
作业知道并支持使系统顺利运转的依赖关系。 如果 jobA
依赖于 jobB
,作业系统将确保 jobA
不会在 jobB
完成之前开始执行
什么是Burst Compiler
Burst是一种先进的编译器技术,可用于加速使用新的面向数据的技术堆栈(DOTS)和Unity Job System制作的Unity项目的性能。
通过Dots实现的一个Demo, 生成上万个cube的并移动, 也会有非常好的性能表现.
在之后的文章里面,我会和大家一起去实现一个基于ESC思想架构的游戏.
现在的Demo实现了, 生成上万个Cube,并朝向自己的目标点移动.
namespace ECS.Components
{
[GenerateAuthoringComponent]
public struct EnemyMove : IComponentData
{
public float Speed;
public Entity Target;
public float3 Pos;
}
}
namespace ECS.System
{
[UpdateInGroup(typeof(SimulationSystemGroup))]
public class EnemyMoveSystem : SystemBase
{
protected override void OnUpdate()
{
float deltaTime = Time.DeltaTime;
Entities.WithName("EnemyMoveSystem").ForEach((Entity airEntity, ref Translation trans, ref Rotation rot, ref EnemyMove air) =>
{
trans.Value.z -= deltaTime * air.Speed;
}).Run();
}
}
}
上面的这两段代码,只是体现了C和S,即组件(Component)和系统(System),Entity是需要特殊的转换代码来实现的.
先定义一个移动的组件,即拥有这个移动的组件的entity才会被移动系统处理, 也就才会进行移动,这就是ECS的核心.
再定一个处理移动的系统,在这个系统里面,会遍历所有带移动组件的实体,对实体上的组件进行不同的设计,以及不断更新组件的值.
由于这是一个长期的项目,所以后期我会把代码更新在Github上,敬请期待.