Unity3D:DOTS多线程面向数据的技术堆栈之ECS

大腿Plus Unity3D项目开发评论750阅读模式

前言

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

我的微信
微信扫一扫
weinxin
shijun_z
我的QQ
QQ扫一扫
weinxin
846207670
 最后更新:2024-6-4
大腿Plus
  • 本文由 大腿Plus 发表于 2024年6月3日 16:18:31
  • 转载请务必保留本文链接:https://www.zhaoshijun.com/archives/2065

发表评论