首页 > 编程知识 正文

吉他入门到入土,c语言从入门到入土表情包

时间:2023-05-03 17:43:02 阅读:13185 作者:2321

撰写本文时,Entities包已更新为preview 1 - 0.11.2版本

结合主要参考官方文档,打开我自己的cai发送keng的经验,建议英语好的同学直接啃English — ECS Docs

Demo List

首先,深入研究DOTS的hello world [ https://github.com/unity-technologies/entitycomponentsystemsamples ],深入研究大规模的战争场景[ 3https://githuhuu uniteaustintechnicalpresentation ]新技术,Animation,Physics,Renderer等[ https://github.com/unity-technologies/dots sampll

一.什么是ECS

ECS,全称 Entity Component System(实体、组件、系统)与继承传统的MonoBehavior的类,重写start(update )等来控制GameObject不同,ECS使用System来处理实体的compoty

官方表示,theentitycomponentsystem(ECS ) isthecoreoftheunitydata-orientedtechstack .是实体组件系统(ECS )为unity的面向数据的技术堆栈

世界,实体,组件,系统

World(世界):ECS具有一个名为World的特殊存在,它在程序启动时默认生成。 当然,如果您有在在线game上播放死亡或拍摄快照等特殊需求,可以使用多个World对象。 在一个World中创建的实体仅在该World中有意义,但可以通过EntityManager.MoveEntitiesFrom迁移到其他世界。

每个World都有一个EntityManager,用于管理该World中的所有实体,还包括许多系统用于运行程序的逻辑。

Entity(实体):实体表示程序中的单个物体,这里的实体不是指具体的游戏对象,而是指概念。 实体不包括具体的数据、行为,主要用于关联几列组件数据,可以理解为一个索引值。

ECS系统保持这些索引值,从索引值中取得与Entity对应的Component的数据,能够在System中进行有效的读取、变更等操作。

Component(组件):是结构,必须继承IComponentData (通用组件,当然是类型组件)才能被ECS识别。 这里的组件与Unity Editor的不同。 Unity Editor可以向GameObject中添加各种组件,如TransForm、Animator、Script…,但ECS中的组件是一组结构,仅用于存储数据。

组件可以在Unity Editor中作为脚本装载到游戏对象上,也可以在代码中使用EntityManager添加和修改组件。

System(系统):System是实现ECS中几乎所有代码逻辑的部分。 System允许您搜索实体并处理实体上的组件数据。 通常,我们的System类必须从SystemBase继承,并重新加载OnUpdate ()方法。

系统通常用于更新实体的状态。 例如,Entity装载了一个名为MoveSpeed的组件,其中保存了Enttity的移动速度。 System读取该组件的值,并通过更改平移值来移动实体。

在项目中编写系统代码时,不需要装载到GameObject中。 因为ECS会在运行时找到并实例化所有可用的系统,并将其添加到默认World中的系统组。 系统组的概念将在后面介绍。

以此图为例,系统读取实体a和b的(Translation-(位置,Rotation-)角度)分量数据,进行计算,最终对两个实体的本地数据

这里展示了ECS的差异化。 具有相同组件的实体位于同一内存或相邻内存中

块,使得System 能够对同一种类型的实体进行快速的查找,并且能够实现并行的数据处理,从而提高了程序的执行速度。

此处可以直接参考官方文档(English): World、Entity、Component、System

Chunk Archetype

Archetype(原型): 一系列组件的唯一组合称为原型Archetype,换言之拥有完全相同的组件类(数据可以不相同)型的两个实体属于同一种原型。

Archetype 所对应的Entity Component数据都存储在同一片区域,我们可以通过Archetype 快速访问到所有该类型的Entity 数据。同时,当我们对一个实体的组件进行添加、删除操作时,就会修改这个实体的原型,ECS 会将其移动到其他存储区域。

Chunk(内存块): 书接上文,Chunk 与Archetype 有着密不可分的联系。ECS底层将同一Archetype 的数据存储在一系列的内存块中,数据增加时就会不断分配新的Chunk。这种底层机制说明,当我们查找某一类具有相同性质的实体时,只需要根据原型进行查找,而不是在所有的Entities 中进行遍历。

其实,不管是Archetype or Chunk, 更多的是概念性的东西,我们在实际开发中并不会经常接触到。

总结

通过了解ECS中的一些概念,我们已经对ECS有了一个大体的认识。ECS相较于传统的项目架构,可以说上手难度+++,并且脚本数量也会+++,yjddbks真正上手的时候就会发现,原来写在一个MonoBehavior 中的代码,转到ECS 后,竟然可以写成好几个甚至十好几个Scripts, Amazing(No)!

ECS的好处也是显而易见的,通过特殊的低层机制,当我们需要对一组大量对象进行相似的处理时,ECS可以大幅提高代码速度、内存访问速度,从而使程序的帧数有明显的提升。

但是(还有转折!),在你决定上手ECS之前要先想这样一个问题:ECS能够对我的项目起到多大的提升作用?能够抵消团队的学习开发和维护成本吗?写出来的代码可读性怎么样,能够让新人快速上手吗(并不能)?

如你所见,ECS对于需要处理大量相似实体的程序有明显的提升:比如你想实现一个大型的人群仿真项目,其中每个人的行为逻辑都是相同或相似的;但是yjddbks的程序更偏向于ARPG游戏(每个NPC对象的处理逻辑完全不同),那么ECS可能对你的程序性能并不会有多大的改善。

题外话:关于DOTS

说到ECS,就要提一下与之密切相关的另一个东西–DOTS, 当然它其实不是一个东西,而是一套集合型的高效技术堆栈,那么DOTS包含什么呢?

Job System编写多线程代码ECS编写高性能代码Burst Compiler编译生成高性能代码

总的来说,DOTS本身就包含了ECS!但是ECS会涉及到DOTS 的核心内容以及大部分用法,因此关于Job System 和Burst Compiler 本文不会过多介绍(因为我也不会啦)。

其他

贴上一些ECS好文,对新手来说也非常友好了

Unity ECS 基础概念介绍 风小锐Unity DOTS:入门简介 烟雨迷离半世殇木头哥的ECS教程,入门啃官方Demo推荐官方Demo全解析+深入学习 CloudHu1989ECS由浅入深 没有分专栏,需要从历史文章中找 王王王渣渣

本文为原创,如有错误欢迎指正,感谢阅读。
未完待续…

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。