【UnityDOTS 二】Entity的理解

news/2024/11/17 1:50:09/

Entity的理解

Entity作为一种对CPU的Cache友好的编码方式,是DOTS中重要的编码流程与思想。需要程序员由OOP的思想转为DOD的思想,即:面向数据的编码方式。

Unity的ECS:
Entity:只是一个代表,用于快速查找数据等
Component:只有数据的Struct,无法被引用(特殊手法可以),大量相同的Component并排在内存中,可以提高Cache的命中率,以及Burst编译器生成SIMD命令提高性能。
System:用于处理Component的类,包含真正的处理逻辑,有一套自己的生命周期管理。可以遍历筛选出自己需要的Component进行处理。在System中可以结合JOBS来进一步提升性能。

一、Entity是什么?

Entity在DOTS的ECS系统中,只是作为一个包装的概念,看下官方文档的解释。
在这里插入图片描述
简单理解就是一个Struct,里面包含两个数据,Index以及Version。Index指向Entity在EntityWorld中的编号,Version则是版本号。因为Index会被复用,所以销毁一个Enity,又创建一个的时候,这个Index会被复用,然后通过Version就可以判定一个唯一的Enity了。

二、Entity的创建

1.Authoring模式

Authoring模式,在subScene中创建一个GameObject,Unity会隐式使用一个叫做Bake的过程,把托管的GameObject转换成对应的Entity(以及附带的各种内部Component)。
我们还需要用自定义的Component,这个时候,可以在对应的Monobehaviour脚本中,添加一个继承Baker的类,来转换你想要的Enity,以及动态添加自定义的Component

struct RotateSpeed : IComponentData{public float rotateSpeed;}public class RotateSpeedAuthoring : MonoBehaviour{[Range(0, 360)]public float rotateSpeed = 360.0f;public class Baker : Baker<RotateSpeedAuthoring>{public override void Bake(RotateSpeedAuthoring authoring){var entity = GetEntity(TransformUsageFlags.Dynamic);var data = new RotateSpeed{rotateSpeed = math.radians(authoring.rotateSpeed)};AddComponent(entity,data);}}}

以上代码就是将一个挂载了RotateSpeedAuthoring脚本的GameObject转换成一个Entity的过程。同时还为这个Entity添加了RotateSpeed的自定义Component

注意:Baker是增量bake的。

/// <summary>/// Called in the baking process to bake the authoring component/// </summary>/// <remarks>/// This method will be called for every instance of TAuthoringType in order to bake that instance./// </remarks>/// <param name="authoring">The authoring component to bake</param>public abstract void Bake(TAuthoringType authoring);

备注:BakingSystem:用于控制Bake产出的Entity行为,相当于bake转换Entity时,可以通过这个类来控制对应的Entity产出,比如:可以给某些entity转换时,都加上一个Component数据。避免一个个在各个Bake里面手动加代码。

2.Runtime模式

World:Entity的集合,每个Entity在一个World中ID唯一,但是Unity中可以有多个World,各个World中的Entity可能有相同的ID。
EntityManager:管理他自身所在World中的所有Entity,可以创建,销毁Entity,也可以增、删、刷新Entity中的Component数据

ComponentData与Entity具有一定的映射关系,同时ComponentData因为是Struct类型,所以无法(一般情况下)在托管对象进行引用从而管理里面的数据。

创建Entity流程:
1.创建World或者获取一个World;2.拿到World中的EnityManager,创建一个Entity;3.,同时也可以通过这个EntityManager来管理Entity上的Component;4.通过创建的Entity来获取EntityAcheType来实例化更多同类型Entity;5.对应的System就可以实现对这些Entity进行逻辑处理了。

备注:Entity之间没有父子之类的关系,但是可以通过Parent组件来体现这种关系。

var generator = SystemAPI.GetSingleton<CubeGeneratorByPrefab>();var cubes = CollectionHelper.CreateNativeArray<Entity>(generator.cubeCount, Allocator.Temp);state.EntityManager.Instantiate(generator.cubeEntityProtoType, cubes);int count = 0;foreach (var cube in cubes){state.EntityManager.AddComponentData<RotateAndMoveSpeed>(cube, new RotateAndMoveSpeed{rotateSpeed = count*math.radians(60.0f),moveSpeed = count});var position = new float3((count - generator.cubeCount * 0.5f) * 1.2f, 0, 0);var transform = SystemAPI.GetComponentRW<LocalTransform>(cube);transform.ValueRW.Position = position;count++;}cubes.Dispose();

其中:SystemAPI.GetSingleton可以用来获取唯一的组件如上图的:CubeGeneratorByPrefab在这里插入图片描述

总结

ECS作为DOTS中的一种面向数据的设计思想,理解内核还是很重要的,后续再加上其他内容


http://www.ppmy.cn/news/684802.html

相关文章

笔记本电脑没有鼠标怎么右键_电脑鼠标右键没有反应怎么办?鼠标右键无法使用的解决方法...

鼠标右键无反应怎么办&#xff1f;电脑鼠标右键没有不能使用该如何解决&#xff1f;下面请看具体解决方法。 操作步骤&#xff1a; 1、按winr打开运行窗口&#xff0c;输入gpedit.msc&#xff0c;回车打开组策略编辑器&#xff0c;如图所示&#xff1a; 2、依次打开&#xff1a…

怎么查看苹果的蓝牙鼠标还有多少电量?

现在很多人都喜欢用蓝牙鼠标和键盘&#xff0c;比如苹果的蓝牙鼠标是充电的&#xff0c;那要怎么看鼠标还剩多少电呢&#xff1f; 1、首先进入到Mac桌面中&#xff0c;然后点击左上角的苹果图标。 2、然后在下拉的子菜单中选择“系统偏好设置”。 3、进入系统偏好设置后&#…

Mac 鼠标和触摸板左键突然失效

遇到了和 这位朋友 一样的问题&#xff0c;鼠标和触摸板的左键&#xff08;触摸板是“单击”动作&#xff09;&#xff0c;都失效&#xff0c;变成了双击。 这位朋友 写到&#xff1a; 鼠标左键突然不起作用,触摸版也没用,右键可用. 原因&#xff1a;有两个蓝牙鼠标同时开着并…

计算机windows无响应,Windows电脑便笺没反应不能用了怎么办?

原标题&#xff1a;Windows电脑便笺没反应不能用了怎么办&#xff1f; Windows系统是很多人工作和生活中常用的电脑系统。Windows电脑具备自带的便签工具&#xff0c;就是便笺。它可以通过桌面便利贴的形式存放在电脑桌面上&#xff0c;查看和编辑待办记事内容。然而有时候Wind…

苹果鼠标右键怎么按_在 iPad 上用鼠标体验怎么样?我用这 12 款 App 试了一下

iPadOS 13.4 上线也已经有一个多月了&#xff0c;大家也通过各种方式体验上了 iPadOS 全新的触控板/鼠标操作。虽然全新的操作方式在系统和第一方应用里的体验不差&#xff0c;但对于没有对其进行适配的应用来说&#xff0c;触控板和鼠标也只能起到「模拟触控」的作用。 本文挑…

苹果鼠标右键怎么按_iPad 软件鼠标体验哪家强?12 款 App 对比测试

iPadOS 13.4 上线也已经有一个多月了,大家也通过各种方式体验上了 iPadOS 全新的触控板 / 鼠标操作。虽然全新的操作方式在系统和第一方应用里的体验不差,但对于没有对其进行适配的应用来说,触控板和鼠标也只能起到「模拟触控」的作用。 本文挑选了 12 款适配了触控板 / 鼠标…

linux系统鼠标左键失灵,苹果Mac笔记本触控板左键失灵原因分析与解决

绝大部分笔记本上都有标配触控板&#xff0c;这样就可以很好的代替鼠标操作&#xff0c;苹果笔记本也不例外&#xff0c;但是在使用过程中难免会遇到触控板失灵等问题。最近有用户在使用苹果MAC系统时突然发现触控板左键失灵而无法正常使用&#xff0c;出现这种现象主要是触控板…

笔记本电脑没有鼠标怎么右键_鼠标右键失灵怎么办,你知道原因吗?

在上网时,有时会遇到按右键没有反应的情况。一开始还以为是中了病毒,但是重启之后,又恢复正常了,这到底是怎么回事呢? 如果是在我电脑上操作电脑软件导致的鼠标右键失灵可能以下原因造成的。 一:系统繁忙,不能响应你的系统安装太久,或软件安太多,注册表过大垃圾太多;或…