【UnityDOTS 二】Entity的理解

news2024/9/27 5:59:15

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.coloradmin.cn/o/709715.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

前端Vue基于腾讯地图Api实现的选择位置组件 返回地址名称详细地址经纬度信息

前端Vue基于腾讯地图Api实现的选择位置组件 返回地址名称详细地址经纬度信息&#xff0c; 下载完整代码请访问uni-app插件市场地址&#xff1a;https://ext.dcloud.net.cn/plugin?id13310 效果图如下&#xff1a; #### 使用方法 使用方法 <!-- leftTitle:左边标题 name&…

哈工大计算机网络课程网络层协议详解之:路由算法概述与链路状态路由算法

哈工大计算机网络课程网络层协议详解之&#xff1a;路由算法概述与链路状态路由算法 在前面的小节中&#xff0c;我们介绍了网络中路由器的路由与转发等功能。我们说作为网络层&#xff0c;从功能上来说&#xff0c;核心功能就是要实现路由和转发。 对于转发来说&#xff0c;实…

PyTorch开放神经网络交换(Open Neural Network Exchange)ONNX通用格式模型的熟悉

我们在深度学习中可以发现有很多不同格式的模型文件&#xff0c;比如不同的框架就有各自的文件格式&#xff1a;.model、.h5、.pb、.pkl、.pt、.pth等等&#xff0c;各自有标准就带来互通的不便&#xff0c;所以微软、Meta和亚马逊在内的合作伙伴社区一起搞一个ONNX(Open Neura…

Redis - 优惠券秒杀、库存超卖、分布式锁、Redisson

文章目录 一、优惠券秒杀1.1 全局唯一ID概述1.2 Redis实现全局唯一ID1.3 添加优惠券1.3.1 entity1.3.2 Controller1.3.3 Service层1.3.4 测试 1.4 优惠券秒杀下单1.4.1 entity1.4.2 Controller1.4.3 Service1.4.3 测试 1.5 库存超卖问题1.5.1 库存超卖原因1.5.2 介绍乐观锁1.5.…

【博学谷学习记录】超强总结,用心分享 | 架构师 Jenkins学习总结

文章目录 Jenkins介绍背景应用场景主从集群 Jenkins使用访问Jenkins获取管理员密码进入jenkins主页修改管理员密码 安装插件插件安装 全局工具配置 企业实战pipeline(重点)创建PipelinePipeline语法语法示例 Jenkins介绍 背景 ​ Jenkins&#xff0c;之前叫做Hudson&#xff…

php开发人员信息搜索查询系统 名单查询系统后台 php增删改查功能

php实现人员信息搜索的功能的方法&#xff1a;1、创建conn.php文件连接人员信息数据库&#xff1b;2、创建index.php文件&#xff1b;3、通过“ if(isset($_POST[“flag”])){…}”等语句实现人员搜索功能即可。 1、首次登录需要输入访问的密码 <?php /*** 登录 **/ $mo…

git的基础总结

写在前面&#xff1a; 前天搞了个面试&#xff0c;发现好多都是会使用&#xff0c;但是要我说&#xff0c;难得说出来&#xff0c;现在对基础进行巩固总结。其实我感觉要求背出来一样的没必要吧&#xff0c;ide基本上可视化了会用就行吧。 文章目录 介绍git的状态 使用/安装/…

php使用PhpSpreadsheet导出Excel表格详解

本文会介绍php使用PhpSpreadsheet操作Excel&#xff0c;供大家参考&#xff0c;具体内容如下&#xff1a; PhpSpreadsheet介绍 1、简介 PhpSpreadsheet 是一个用纯PHP编写的库&#xff0c;提供了一组类&#xff0c;使您可以读取和写入不同的电子表格文件格式 PhpSpreadsheet …

Jetson查CPU/GPU等的占用情况——jtop的安装和使用

Jtop的安装 (1) 安装JTOP查看可查CPU等的占用情况 sudo apt-get updatesudo apt-get full-upgradesudo apt install curlsudo apt install nanocurl https://bootstrap.pypa.io/get-pip.py -o get-pip.py #下载安装脚本sudo python3 get-pip.py # 运行安装脚本sudo pip3 insta…

0401锁详解-MySQL-数据库

1 概述 介绍 锁是计算机协调多个进程或线程并发访问某一资源的机制。在数据库中&#xff0c;除传统的计算资源&#xff08;CPU、RAM、I/O&#xff09;外&#xff0c;数据也是一种供许多用户共享的资源。如何保证数据并发访问的一致性、有效性是所有数据库必须解决的问题&#x…

解决QtCreator安卓平台原生C++代码无法输出日志问题

1.需求,因原生C++调用std::cout ,std::cerr,及C函数prinf输出要显示在控制台, 问题: 在QtCreator中只看到qDebug输的日志,并没有看到 cout,cerr,printf的输出日志 2.最终已解决如下 在QtCreator中显示了C++原生日志 在Android Studio 的Logcat中显示了C++原生日志 模拟器 …

c++11 标准模板(STL)(std::basic_ostream)(三)

定义于头文件 <ostream> template< class CharT, class Traits std::char_traits<CharT> > class basic_ostream : virtual public std::basic_ios<CharT, Traits> 类模板 basic_ostream 提供字符流上的高层输出操作。受支持操作包含有格式…

印刷企业WMS仓储管理系统解决方案

在数字化转型的浪潮中&#xff0c;印刷企业也积极寻求适合自身发展的解决方案。作为印刷业的重要环节&#xff0c;仓储管理对于提高效率、降低成本至关重要。而印刷企业WMS仓储管理系统的应用&#xff0c;为印刷企业带来了全新的解决方案。 印刷WMS仓储管理系统是一种基于信息技…

简单认识Tomcat的部署和优化

文章目录 一、简单认识Tomcat1、简介2、构成3、Tomcat 功能组件结构4、Tomcat 请求过程&#xff1a; 二、Tomcat部署1.关闭防火墙&#xff0c;将安装 Tomcat 所需软件包传到/opt目录下2.安装JDK3.设置JDK环境变量4.测试java环境5.安装Tomcat6.启动和关闭Tomcat7.优化 tomcat 启…

synchronized锁升级以后会再降级吗?

Java对象头Markword的结构 其中&#xff0c;最低2位是10代表重量级锁&#xff0c;00代表轻量级锁&#xff0c;001代表无锁&#xff0c;101代表偏向锁。 synchronized锁在1.6的时候做了优化&#xff0c;当仅有一个线程竞争锁的时候&#xff0c;锁处于偏向锁的状态&#xff0c;当…

bim技术的发展趋势是哪些方向?

BIM在现阶段已经取得了较高的发展水平。尽管BIM在许多方面取得了显著进展&#xff0c;但仍有继续改进和发展的空间。未来&#xff0c;BIM在数字化转型、智能化应用和全生命周期管理方面的进一步推进将成为发展重点。简单聊聊BIM技术的发展趋势包括以下几个方向&#xff1a; BIM…

Java面试通关:阿里内部实战模拟面试精讲题库,竟被上传GitHub!

其实这些技术在真正的实际开发环境中真的用得到吗&#xff1f;不一定的&#xff0c;但是没办法&#xff0c;环境就是如此&#xff0c;能做的也就只有不断提升自己&#xff0c;去适应市场环境&#xff0c;提高自身技术水平&#xff01; 我的建议&#xff0c;不管自己现在是个什…

2021北大生命科学院饶毅教授毕业致辞

在祝福裹挟着告诫呼啸而来的毕业季&#xff0c;请原谅我&#xff0c;不敢祝愿每一位毕业生都成功都幸福。因为历史不幸的记载着有人的成功&#xff0c;代价是丧失良知&#xff0c;有人的幸福&#xff0c;代价是损害他人。 从物理学来说&#xff0c;无机的原子&#xff0c;逆​热…

Loadrunner怎么实现MD5加密

目录 前言&#xff1a; 1、写一个md5.h文件&#xff0c;将其放入脚本路径下 2、在globals.h中加入#include “md5.h” 3、在Action中写脚本&#xff0c;脚本示例如下&#xff1a; 前言&#xff1a; 在 LoadRunner 中实现 MD5 加密可以通过使用 LoadRunner 提供的函数来完成…

Redis发布订阅的通讯模式

这个是非常简单的,我们只需要打开两个redis就可以轻松完成 通过Xshell工具两次连接linux,同时启动两个redis: 在第一个里面进行订阅: subscribe leq 在第二个里面进行发布: publish leq hello 这样就可以在订阅的里头看到刚刚发布的信息,没看之前订阅那块也会有提示