unity要学ecs吗_Unity ECS简介

当前的Unity开发模式

当前的开发方式我们称为"Classic", 是基于Monobehaviours,把代码当成组件的形式关联到gmaeObject上,通常情况下数据和逻辑是紧密的关联在一起的。这种方式可以很快速的进行开发,但对性能会有一定的影响。

Unity正在尝试解决什么样的问题?

基于Unity的GameObject/Monobehaviour机制,可以很简单的为创作游戏编写代码, 但最终往往会让代码陷入难以阅读,维护和优化的境地。数据分散在内存的各个地方,想要找到这些数据并传送到cpu会消耗很多性能。

2. 很多时候会把不需要的数据或者变量一起传送给cpu,这里会有很多浪费的。

3. 单线程

Entity-Component-System登场

ECS就是为了解决以上的问题而出现的,使用Entity的方式将数据分离出来,然后在需要的地方提供相应的数据,其中System是为了处理Entity中数据的具体逻辑,还有一个很重要的部分"Filter"进行数据的过滤。简单来讲ECS就是数据与数据处理的一个关系。

Entity-Component-System的优点高性能

易编写出高度优化的代码

易编写出可重用的代码

数据在内存中是紧密排列的

和Job System、Burst一起可以获得更高的性能

Job System

大多数使用多线程代码的人都知道编写线程安全代码很难,线程争抢资源可能会发生,但机会非常少,如果程序员没有想到这个问题,可能会导致潜在的严重错误。除此之外,上下文切换的成本很高,因此学习如何平衡工作负载以尽可能高效地运行是很困难的。新的 Unity C# Jobs System将解决这些问题。

如何使用ECS

1. 目前ECS尚处于开发阶段,只有Unity2018.1版本以上才能开启:

2. 新建一个项目,设置.NET

Build Settings - Player Settings ,设置c# runtime:

3. 导入ECS包

Window - Package Manager,选择Entities和Hybird Renderer并安装

4. 新建一个场景,并创建一个Cube,去掉Cube上除了Transform的所有组件,并添加ECS组件,如下图:

5. 新建HelloRotationSpeedProxy.cs和HelloRotationSpeedSystem.cs脚本

using Unity.Entities;

using System;

namespace HelloCube.Cube

{

[Serializable]

public struct HelloRotationSpeed : IComponentData

{

public float Value;

}

[UnityEngine.DisallowMultipleComponent]

public class HelloRotationSpeedProxy : ComponentDataProxy

{

}

}

using Unity.Burst;

using Unity.Entities;

using Unity.Jobs;

using Unity.Mathematics;

using Unity.Transforms;

using UnityEngine;

namespace HelloCube.Cube

{

public class HelloRotationSpeedSystem : JobComponentSystem

{

[BurstCompile]

struct HelloRotationSpeedJob : IJobProcessComponentData

{

public float dT;

public void Execute(ref Rotation rotation, ref HelloRotationSpeed rotSpeed)

{

rotation.Value = math.mul(math.normalize(rotation.Value), quaternion.AxisAngle(math.up(), rotSpeed.Value * dT));

}

}

protected override JobHandle OnUpdate(JobHandle inputDeps)

{

var job = new HelloRotationSpeedJob

{

dT = Time.deltaTime

};

return job.Schedule(this, inputDeps);

}

}

}

相关链接

 一: 什么是ECS?       ECS是一种新的架构模式(当然是针对Unity本身来说),这是一个取代GameObject / Component 的模式。 其模式遵循组合优于继承原则,游戏内的每一个基本单元都是一个实体,每个实体又由一个或多个组件构成,每个组件仅仅包含代表其特性的数据(即在组件中没有任何方法)。系统便是来处理拥有一个或多个相同组件的实体集合的工具,其只拥有行为(即在系统中没有任何数据)。       ECS旨在比GameObject / MonoBehaviour更容易处理大量物体。ECS由于是面向数据的设计,所以很容易并行高速处理,以及与Unity开发的C#JobSystem/Burst Compiler一起工作,从而获取更高的项目运行性能。二:ECS总体发展历史       目前Unity公司由Mike Acton 大佬主持DOD(Data Oriented Design 面向数据设计)的全面改革与推进工作,目的是旨在进一步推进Unity系统本身与Unity项目的执行效率。    ECS总体发展:    A: 在Unity2018引入Entities之前,其实ECS框架早已经出现,但是ECS还是因为守望先锋采用了这个框架才被我们所熟知,后来Git上面出现了一个Entitas的插件可以直接用在Unity上面。Entitas-Unity(有多个语言的port版本,Entitas-Unity下统一称为Entitas) 是 Unity的一个ECS(Entity/Component/System)框架,是在github上面的一个开源项目。    B: 经过Unity公司的认可与改造,目前Unity2018.x 版本已经通过 Package Manager 提供了Unity版本的ECS插件,名称为:“Entities”。    C: Unity2019.x 版本,对“Entities”插件的API进行了进一步改造与完善,以更规范的API实现更加高效的与规范的编程模式。 三:ECS(一)轻松入门篇       本“ECS入门篇”旨在全面讲解ecs 的相关理论与简单Hello World 的编程模式,且通过Unity2018.x与Unity2019.x 两个不同API的编程模式,初步讲解ECS的编程规范与模式规范。        需要进一步学习ECS的小伙伴们,可以关注后续“ECS(二)小试牛刀”篇的进一步讲解。   《Unity ECS(二) 小试牛刀》https://edu.csdn.net/course/detail/27096 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值