Unity ECS 学习记录

版本是用的Unity的2019.4的版本,因为Ecs的版本更新太快,api更新太频繁,所以学习起来是比较的麻烦,而且教程也是有限

ECS快的原因

需要去了解dots,推荐大家看一看这个视频 DOTS从原理到应用-雨松MOMO

首先如果学过计算机组成原理或者操作系统应该知道,计算机的存储层次最快的为cpu寄存器,往下是主存,但是主存的访问速度与cpu的处理速度相差太远,于是在二者之间加了一个高速缓存来解决这个问题

ECS所做的工作,就是来提高缓存的命中率

当我们使用面向对象编程的时候,各个对象引用各个对象,使得数据在内存中分布是分散的,但在是ECS中 组件使用的是结构体,结构体的内存是分配在栈上的,这就是的数据的在内存中的分配是比较连续的
在这里插入图片描述

ECS只是Dots中的一部分,Dots是由ECS Jobsystem(管理多线程) 和Burst(对c#代码进行高度优化)组成

Jobsystem和Burst性能测试

新建一个test脚本,写入一下的代码,把脚本挂载到物体上,然后测试

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Unity.Entities;
using Unity.Transforms;
using Unity.Collections;
using Unity.Rendering;
using Unity.Mathematics;
using Unity.Jobs;
using UnityEngine.Jobs;
using Unity.Burst;

	class Testing : MonoBehaviour
    {
   
        [SerializeField] private bool useJobs;
        
        private void Update()
        {
   
            float startTime = Time.realtimeSinceStartup;
            if (!useJobs)
            {
   
                for(int i = 0; i < 10; i++)
                {
   
                    ReallyToughTask();
                }
            }
            else
            {
   
                NativeList<JobHandle> jobHandleList = new NativeList<JobHandle>(Allocator.Temp);
                for(int i = 0; i < 10; i++)
                {
   
                    JobHandle jobHandle = ReallyToughTaskJob();
                    jobHandleList.Add(jobHandle);
                }
                JobHandle.CompleteAll(jobHandleList);
                jobHandleList.Dispose();
            }
            Debug.Log((Time.realtimeSinceStartup - startTime) * 1000);
        }

        /// <summary>
        /// 不使用作业系统
        /// </summary>
        private void ReallyToughTask()
        {
   
            float v = 0f;
            for(int i = 0; i <= 10000; i++)
            {
   
                v = math.exp10(math.sqrt(v));
            }
        }
        /// <summary>
        /// 使用作业系统
        /// </summary>
        /// <returns></returns>
        private JobHandle ReallyToughTaskJob()
        {
   
            ReallyToughJob job = new ReallyToughJob();
            return job.Schedule();
        }

    }
    
    [BurstCompile]
    public struct ReallyToughJob : IJob
    {
   
        void IJob.Execute()
        {
   
            
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
 一: 什么是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 
Unity ECS(Entity Component System)是Unity引擎的一种编程范式,它是一种数据驱动的编程模型,它将游戏对象(Entity)分解为数据和行为两个部分,其中数据由组件(Component)来表示,行为则由系统(System)来实现。相对于传统的面向对象编程模型,ECS提供了更高效、更灵活的编程方式,可以有效地提高游戏的性能和扩展性。 下面是我学习Unity ECS时的笔记: ## Entity Entity是ECS中最基本的概念,它表示游戏对象。每个Entity由一个唯一的ID来标识,可以通过EntityManager来创建、销毁、查询和管理Entity。 ## Component Component是Entity的数据部分,用来描述Entity的属性和状态。每个Component包含一些数据成员和一些方法,用来操作这些数据成员。Component是以结构体(struct)的形式定义的,通常只包含数据成员,不包含方法。 ## System System是Entity的行为部分,用来实现游戏逻辑和操作Component。System可以访问和操作EntityManager和Component,但不能直接访问Entity。每个System包含一个或多个Component,表示它所处理的数据类型。System是以类(class)的形式定义的,通常包含一个Update方法,用来实现游戏逻辑。 ## Job Job是一种轻量级的线程,用于并行执行System中的任务。Job可以访问和操作Component,但不能直接访问Entity和EntityManager。Job通常是以结构体(struct)的形式定义的,不包含方法。 ## Archetype Archetype是Entity的集合,包含一组具有相同Component类型的Entity。Archetype可以用来优化数据的访问和处理,可以在不同的System之间共享。 ## Chunk Chunk是Archetype中的数据块,包含一组连续的Entity和它们的Component数据。Chunk可以用来优化内存的分配和访问,可以在Job中进行并行处理。 ## Buffer Buffer是一种Component类型,用来存储可变长度的数据,例如数组或列表。Buffer可以在System和Job中进行修改和访问。 以上是我学习Unity ECS时的笔记,希望对你有所帮助。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值