• 什么是ECS ?

    随着目前游戏对CPU性能要求的不断提升,单核高频的CPU对我们的帮助越来越有限。所以ECS(一种面向数据编程)多核心工作的方式也是大势所趋。

  • Entity 传统组件的集合,代替了GameObject的位置。
  • Component 纯数据,不含有其他逻辑行为。 例如:旋转速度,缩放大小之类的。
  • System 业务逻辑,根据组件的集合(Enitites)和纯数据(Components)编写对应的逻辑。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;/// <summary>
/// 纯数据
/// </summary>
public class InputComponent : MonoBehaviour
{public float horizontal;public float vertical;
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Unity.Entities;//根据指定的数值对星球进行移动控制
public class PlanetMovementSystem : ComponentSystem
{/// <summary>/// Entity 组件集合/// </summary>private struct component{public Rigidbody rigidbody;public InputComponent inputComponent;}/// <summary>/// 具体逻辑操作/// </summary>protected override void OnUpdate(){var deltaTime = Time.deltaTime;foreach (var entity in GetEntities<component>())//获取所有指定的Entity{var moveVector = new Vector3(entity.inputComponent.horizontal, 0, entity.inputComponent.vertical);var movePosition = entity.rigidbody.position + moveVector.normalized * 6 * deltaTime;entity.rigidbody.MovePosition(movePosition);}}
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Unity.Entities;
public class InputSystem : ComponentSystem
{private struct Data{public int Length;public ComponentArray<InputComponent> inputComponents; //数据集合}/// <summary>/// Inject特性在unity启动时自动赋值合适的Value/// </summary>[Inject] private Data data;protected override void OnUpdate(){var horizontal =  Input.GetAxis("Horizontal");var vertical = Input.GetAxis("Vertical");for (int i = 0; i < data.inputComponents.Length; i++){data.inputComponents[i].horizontal = horizontal;data.inputComponents[i].vertical = vertical;}}
}

  • ECS的相对优势

ecs的概念很早就有了,最初的主要目的应该还是为了改善设计。

e-c-s三者都有其意义,e-c是组合优于继承,主要用以改善oo的继承耦合过重以及多继承菱形问题。

oop常见设计里,每个gameobject有父类,子类继承来实现不同类型的对象,很容易产生过多\过深的继承以及多继承,而这两者理论上都不好(依赖、冗余),

继承更应该用来隔离接口与实现(父类提供接口,子类提供实现,调用方只关心父类接口,不关心具体子类实现),而不是用来重用父类的代码。


  • Entity抽象成容器

e-c里gameobject是entity,只是个类似容器的抽象概念,entity里包含的component决定了对象是什么

component可以给不同的gameobject重用,通过组合多种component而不是继承来构造不同的对象。

  • Unity 中的 ECS

Unity一直以来都是 Component Based,可以看成 e-c,此外还有很多现代引擎也是 e-c(UE4、CryEngine等)。

对同一类型的 Component,通常会进行相同的操作(比如用 Render组件进行渲染),一个直观的想法就是把这些操作集中在一起,就是System。

一个理想的设计里,包含多种不同的 System,每个System只处理一个类型的 Component,每帧对所有 Compoent 实例进行相同的操作,继而可以做到数据和逻辑分离,Component里放纯数据,逻辑在System里。

  • ECS 的几个好处
  1. 逻辑集中在system里,职责单一,读\改\控制(初始化、顺序依赖等等)都方便。
  2. 容易扩展,很容易新增e\c\s. 新增任何entity,这些entity上有各种Component,这些 Component可以(自动)共享现有的system,不需要单独写。
  3. 灵活,e-c-s之间,s-s之间,e-e之间,c-c之间耦合较松,便于读\改\扩展。理想情况下不同的system之间,不同的compoent之间没有任何依赖,但通常很难做到。
  4. cache friendly, system会连续对同一类 Component 进行操作,保证了时间上的局部性(连续性),如果这些 Component能保证空间上的局部性(内存布局连续),则显而易见对缓存是很友好的。
  5. simd, 如果能保证同一个system对大量 Compoent实例的操作顺序无关,那么很自然的可以并发。 但实际中,Component很难完全独立,经常需要和其它 Component 进行交互,也就是 System 很难做到只负责一类 Component,通常需要和多种Component(甚至其它系统)进行交互,交互的开销,遍历 Compoent 的开销都需要考虑。

Unity ECS 简介相关推荐

  1. unity ECS简介

    什么是Unity ECS Unity ECS是Unity引擎中的一种高性能游戏开发架构,它采用了基于数据的设计思路,与传统的面向对象编程不同.它的目标是提高游戏的性能和可伸缩性. Unity ECS通 ...

  2. 01.Gameplay Architecture ECS简介

    1. 人生如(游)戏,(游)戏如人生 在我们生活的大环境中,到处都可以看似一个舞台,一些演员,各自扮演着自己的角色, 顺着时间轴继续着进行中:在此当中,各自都有自己的思考,对事物的了解,对生活的理解 ...

  3. [Unity ECS] 游戏对象转换和子场景 [1]

      游戏只是关于玩家输入改变数据,然后看到不同呈现的事物,因此玩得开心.这些数据是使用 Unity 的 WYSIWYG 工具在scene设计的.但是那些基于 GameObject 的数据与 ECS 不 ...

  4. Unity图集简介及使用

    Unity图集简介及使用 定义 图集是将很多零碎的2D小图整合成一张大图,方便unity渲染合批,降低渲染消耗. 优势 1.UI的合批处理,减少DrawCall 多张图片需要多次DrawCall,合并 ...

  5. 引擎入门 | Unity UI简介–第1部分(1)

    本期我们开始为大家介绍UI,这个教程分为三大部分,在第一部分中你将熟悉Unity UI,使你能够向游戏添加自定义用户界面. 值得庆幸的是,Unity Technologies听取了社区的反馈并制定了一 ...

  6. Unity ECS小知识1 - PhysicsTrigger Event

    Unity ECS 小知识1 - PhysicsTrigger Event ECS套件学习过程中会遇到各种问题,专门开辟一个专题"ECS小知识"来记录这些点滴.每个小知识文章是没有 ...

  7. 引擎入门 | Unity UI简介–第1部分(6)

    本期我们继续为大家进行Unity UI简介(第一部分)的后续教程 本篇内容 12.Rect变换取决于当前锚点设置 13.Pivot 文章末尾可免费获取教程源代码 本篇Unity UI简介(第一部分)篇 ...

  8. Unity Ecs源码分析

    C# Job System 什么是Job System? Job System通过创建Job而不是线程来管理多线程代码. Job System跨多个核心管理一组工作线程.它通常每个逻辑CPU核心有一个 ...

  9. Unity ECS实例:制作俯视角射击游戏!

    目录 创建主角 3:主角移动和摄像机跟随 4:实现敌人角色 5:子弹,死亡,机器人 6:粒子与音效 这次我们来使用Unity ECS系统制作一个俯视角度的射击游戏.虽然现在网上有不少ECS的资料和项目 ...

最新文章

  1. C++ lambda表达式
  2. Leetcode 58.最后一个单词的长度 (每日一题 20210705)
  3. 【转】PBR基于物理的渲染
  4. Docker容器间通讯,直接路由方式实现网络通讯
  5. 授权码模式-获取令牌
  6. 安装 sql server时变更检查解决方案
  7. USACO2.3【dfs,dp,背包】
  8. Spring Security with Spring Boot 2.0:使用Servlet堆栈的简单身份验证
  9. 玫瑰花函数matlab,网上收到的用matlab画玫瑰花的代码怎么不行啊,报告错误,求大神...
  10. mysql索引_MySQL索引介绍和实战
  11. Network-Monitor项目中观察者模式解析
  12. Windows 7双系统安装与卸载
  13. cache 的设计与实现
  14. java dem数据格式解析_ArcGIS读取dem格式数据
  15. 苹果开启了颠覆wintel的序幕,谷歌和ARM做好准备了么?
  16. ucfirst() strtoupper() strtolower()
  17. 安装Java时出现‘以下应用程序正在使用需要由此安装程序更新的文件。请关闭这些应用程序’ (已解决)
  18. 一张纸微缩打印多个PowerPoint内容
  19. #5.2探讨时空同时考虑的相关理论的软肋
  20. 微信小程序 图片验证码展示

热门文章

  1. c语言美元转换人民币的程序,【其它】编程题: 1.编写一个人民币和美元的双向汇率转换程序,实现美元和人民币转换,汇率:1美元=6.92人民币...
  2. Android自定义-滑动缩放渐变填充曲线折线图表
  3. Scene之间的数据传递
  4. 浅谈三极管、运放、MOS管驱动 的常见电路
  5. c# Npoi导出Excel并合并行列
  6. 微信登录(微信公众号授权)的开发(详解)
  7. ubuntu创建批处理文件
  8. 在linux搭建wiki教程,在Ubuntu 16.04系统上安装WikkaWiki
  9. jQuery搜索高亮显示
  10. 邮箱服务器满了foxmail,关于foxmail邮箱满了的解决方法,简单有效