前言
Unity DOTS(Data-Oriented Technology Stack)是Unity引擎的最新技术栈,旨在提供更高效、更可扩展的游戏开发工具。本文将根据自己得理解详细介绍DOTS相关内容及对于ECS的理解。
一、什么是DOTS
Data Oriented Tech Stack(DOTS)是unity推出的多线程面向数据的技术堆栈。它是一套高性能解决方案,包含三个部分:文章源自大腿Plus-https://www.zhaoshijun.com/archives/2065
- Entity Component System 简记为ECS,提供了默认情况下写出高性能的代码的方法
- C# Job System 提供了以并行的方式在多核CPU上运行游戏代码的方法
- Burst compiler 一个math-aware,后端编译器(backend compiler),能产生高度优化的机器码(highly optimized machine code)
本文主要介绍ECS相关内容,后续再介绍剩下的内容及相关API和代码实现。文章源自大腿Plus-https://www.zhaoshijun.com/archives/2065
二、什么是ECS
ECS是一种基于数据驱动的编程模式,将游戏对象拆分为实体(Entity)、组件(Component)和系统(System)。实体是游戏中的基本单位,组件是实体的属性或行为,系统是对组件进行处理的逻辑。ECS的目标是提高游戏性能和开发效率。文章源自大腿Plus-https://www.zhaoshijun.com/archives/2065
个人理解
1, Entity(实体):Entity就是相当于GameObject上的Transform,这只是打个比方。也就是说Entity是一个基础的对象,学习Unity大家都知道Transform是GameObject的一个基础组件。大概就是这个概念。文章源自大腿Plus-https://www.zhaoshijun.com/archives/2065
2, Component(组件):Component其实就是相当于GameObject上添加的组件,只不过DOTS的Component是结构体,不包含任何方法。文章源自大腿Plus-https://www.zhaoshijun.com/archives/2065
3, System(系统):System相当于MonoBehaviour里面的生命周期方法的实现,不依赖任何脚本,也不需要挂载到任何对象上,只需要继承ISystem接口,并且可以是结构体,也可以是类,区别就是如果是类会产生GC。文章源自大腿Plus-https://www.zhaoshijun.com/archives/2065
为什么这么设计
还是说一下个人理解,这样做的目的是数据和逻辑分开,数据通过堆栈和连续内存地址储存,并且可以在多线程去操作这些数据,使得不管是渲染还是代码的效率都能大大的提升。文章源自大腿Plus-https://www.zhaoshijun.com/archives/2065
举个具体的例子,如果想要实现数组或list,默认有个IBufferElementData,这个也是一个组件,只不过是默认的数组组件,继承这个组件的结构体默认会有一个数据长度128,当然这个长度是可以自定义的。为什么要这样做,就是如果我们知道这个数组最大长度的情况下,我们可以设置相应长度来节省内存。并且这个内存是预先生成的,这样做会使效率提升很多。文章源自大腿Plus-https://www.zhaoshijun.com/archives/2065
好了,就先介绍这么多,后面有时间再去介绍一下多线程和Burst编译相关内容。文章源自大腿Plus-https://www.zhaoshijun.com/archives/2065 文章源自大腿Plus-https://www.zhaoshijun.com/archives/2065
评论