苏州高端网站建设,刷seo关键词排名软件,旅游营销的网站建设,怎么仿制别人的网站DOTS
Unity DOTS是Unity官方基于ECS架构开发的一套包含Burst编辑器和JobSystem的技术栈#xff0c;它旨在充分利用多核处理器的特点#xff0c;充分发挥ECS的优势。
安装
Entities、Burst、Jobs、Hybrid Renderer#xff08;必选#xff0c;用于DOTS的渲染相关#xf…DOTS
Unity DOTS是Unity官方基于ECS架构开发的一套包含Burst编辑器和JobSystem的技术栈它旨在充分利用多核处理器的特点充分发挥ECS的优势。
安装
Entities、Burst、Jobs、Hybrid Renderer必选用于DOTS的渲染相关、Unity Physics(非必选用于DOTS的高性能物理组件)
com.unity.Entities com.unity.rendering.hybrid
ECS框架
实体EntityID和组件列表 组件Component存储Data 系统System对象关联的Component进行操作 适用情况需要处理超多对象的同屏渲染问题如戴森球计划需要处理超多对象的管理和操作如FPS游戏。
传统Unity开发通常是把逻辑脚本挂载到GameObject上很多时候还可能挂载多个不同功能的逻辑脚本。而ECS采用面向数据的方法Entity代替了传统的GameObject的概念Component则保留了传统组件的数据部分所有逻辑交由System处理。写ECS的基本思路就是创建Component、创建Entity、编写System处理逻辑。
System可以重写OnUpdate函数大家可以把它看成是MonoBehaviour的Update函数。这就是之前提到的ECS把实体的逻辑专门放到System里处理了。OnUpdate函数也是会每帧调用一次的。
Component继承IComponentData
Entity
创建方式
[GenerateAuthoringComponent] 自动将组件转换成实体[RequiresEntityConversion] 通过EntityManager的AddComponentData将组件附加到实体上通过Prefab创建实体 *方便EntityCommandBufferSystem *灵活
Component
Component需要继承IComponentData
其他组件类型
ISharedComponentData共享组件 // 生成大量相同怪物
ChunkComponent块组件
ISystemStateComponent状态组件 // 处理回调事件
ISystemStateSharedComponentData状态共享组件
IBufferElementData动态队列/缓冲区/数组System
System需要继承ComponentSystem或JobComponentSystem
ComponentSystem更适合旧项目迁移到ECS框架类似于Monobehaviour但ECS的性能在多线程下才能发挥到最大JobComponentSystem配合各种JobIJobForEach、IJobChunk等可以方便地实现并行多线程、多核执行逻辑 System中可以重写了OnUpdate()该函数每帧调用一次类似mono的Update()。System相当于将一定的逻辑封装起来例如RunSystem、JumpSystem等那对应的问题就是System如何知道哪些Entity需要执行逻辑答案就是筛选而筛选条件就是Component。
筛选方式
Entities.ForEachIJobChunkIJobForEachWithEntityEntityQuery *灵活 All Any None
Entity Debuger
不同于传统DebugECS框架下需要用Entity Debuger进行调试Unity菜单的Window-Analysis-EntityDebugger可以打开ECS的调试窗口
Chunk和Archetype
对于拥有相同Component的EntityECS采用Chunk结构统一存储例如下图中的EntityA和EntityB Chunk不能无限存储Entity当Entity数量过多时就需要用新的概念Archetype来统一保存Chunk。
World
ECS会自动创建一个默认世界包含了实体管理器EntityManager以及项目中所有可用的系统System。
系统分组ComponentSystem Group
System用来处理游戏逻辑游戏逻辑肯定就会涉及到先后顺序为了解决这类问题System的OnUpdate函数的执行是有先后顺序的。
// ECS默认分组
InitializationSystemGroup负责初始化工作的系统分组
SimulationSystemGroup负责逻辑运算的系统分组
PresentationSystemGroup负责图形与渲染工作的系统分组使用特性Attribute调整System执行顺序
UpdateInGroup指定当前System在哪个分组下
UpdateBefore指定当前System在哪个System之前执行
UpdateAfter指定当前System在哪个System之后执行EntityCommandBuffer
JobComponentSystem配合各种JobIJobChunk等可以方便地实现并行多线程、多核执行逻辑。多线程逻辑中会出现数据一致性的问题ECS规定以下行为都不能在Job中处理创建实体Create Entities、销毁实体Destroy Entities、给实体添加组件Add Components、删除实体的组件Remove Components需要采用EntityCommandBuffer提前或延迟执行。 每一个系统分组下都有两个EntityCommandBufferSystem并且分别都是Begin和End对应的通过World获取System。 笨木头的博客里讲到“在JobComponentSystem中如果Job没有筛选出实体数据那么OnUpdate是不会被调用的”这也就解释了为什么有些system最后会执行DestoryEntity操作。这就是面向数据编程的关键程序根据数据筛选实体执行逻辑删除数据保证后面筛选不到。我需要执行逻辑就添加执行完了删掉完全是数据有无在控制逻辑的有无。 EntityCommandBufferSystem每次执行队列的任务后都会清空所以不存在重复执行的问题。 参考链接
官方Demo ECS Samples 笨木头与游戏开发 博客