当前位置: 首页 > news >正文

初探unity中的ECS

ECS是一种软件架构模式,就像MVC一样。ECS最早在游戏《守望先锋》中提及到的相关链接。ECS具体是指实体(entity)、 组件(component)和系统(system):

实体:实体是一个ID,它是一个唯一的标识符,用于标识一个对象,它本身不包含任何数据,只是一个ID,它的作用是用于标识一个对象,它的数据是由组件来提供的。

组件:组件是一个数据结构,它包含了一些数据,用于描述一个对象的属性,组件是没有任何行为的,它只是一个数据结构。

系统:主要用户逻辑处理,进行状态迁移。系统中不保留数据,且是无状态的。

三者之间的关系如下图所示:
请添加图片描述

ECS在unity中出现的原因

在使用unity开发的时候,monobehaviour是我们最常用的,然而monobehaviour中的update是基于gameobject去更新的且无序的,这样很容易造成memory cache miss。而ECS是基于数据的,它将具有相同Component组合的Entity放在一起,这样可以更好的利用cache,提高性能。

archetype

通过上面的图和介绍我们知道通过将不同的Component组合和Entity一起组成了GameOjbect,Component不同组合的唯一性在ECS中被称为archetype。在ECS中,archetype是一个很重要的概念,它是用来管理内存的,每个archetype都有一个chunk列表,chunk是一种内存管理方式。

请添加图片描述

上图中EntityA和EntityB具有相同的Component组合,所以它们属于同一个Archetype M,而EntityC具有不同的Component组合,所以它们属于不同的Archetype N。

下图是一个chunk的内存排布:
请添加图片描述

component在chunk中的排布.
请添加图片描述

Archetype
ArchetypeChunkData Chunks;
ComponentTypeInArchetype* Types;
ArchetypeChunkData
Chunk** p;
Chunk

执行System

请添加图片描述

unity会自己实例化system,system里的方法默认都在主线程执行,可以通过一下几种方式来实现多线程

  • Entities.ForEach
  • Job.WithCode
  • IJobEntity
  • IJobEntityBatch
  • C# Job System

各部分的创建

下面是一个简单的例子,创建一个CustomSystem,它会在每一帧中更新CustomData的值。ComponentData不一定要和MonoBehaviour一起使用,它可以单独使用,像一些CPU密集性的计算可以使用ComponentData来实现。下面的示例重点是为了说明各部分的创建过程,从LaunchECS中可以发现仅仅使用了World中的EntityManager来创建了一个Entity,系统的创建被注视掉了。这是因为unity会自己实例化system,所以我们不需要手动创建system。

public class Custom : MonoBehaviour
{private void Awake(){LaunchECS();}private void LaunchECS(){var world = World.DefaultGameObjectInjectionWorld;world.EntityManager.CreateEntity(typeof(CustomData));// world.CreateSystem<CustomSystem>();}
}public struct CustomData : IComponentData
{public int Value;
}public partial class CustomSystem : SystemBase
{[BurstCompile]protected override void OnUpdate(){var timeElapsedTime = World.Time.ElapsedTime;Entities.ForEach((ref CustomData customData) =>{customData.Value = (int)(100 * math.sin(timeElapsedTime));}).ScheduleParallel();}
}

游戏制作

ECS的大致情况我们已经了解了,那如何在项目中应用呢。下面是一个简单的例子,我们创建一个Cube,然后通过ECS来控制它的移动。

  1. 将下面的代码放到名叫MoveMono的cs文件中,
  2. 然后在场景中添加一个sub scene
  3. 在sub scene中添加一个Cube,然后添加一个MoveMono组件,并设置Velocity的值。
    运行后,我们会发现Cube会按照我们设置的Velocity的值进行移动。
[GenerateAuthoringComponent]
public struct MoveData : IComponentData
{public float3 Velocity; 
}public partial class MoveSystem : SystemBase
{[BurstCompile]protected override void OnUpdate(){var deltaTime = World.Time.DeltaTime;Entities.ForEach((ref Translation translation, in MoveData moveData) =>{translation.Value += moveData.Velocity * deltaTime;}).ScheduleParallel();}
}

上面代码中使用了GenerateAuthoringComponent,这个属性将会自动生成一个名为MoveMono的MonoBehaviour,所有虽然我们并没有显示的创建MoveMono,但是我们可以给GameObject添加组件是可以看到MoveMono.

除了GenerateAuthoringComponent属性以外还有其他方式去将ComponentData和MonoBehaviour关联起来,还可以有其他方式。我们将在后面的gameplay文章中介绍。

相关文章:

初探unity中的ECS

ECS是一种软件架构模式&#xff0c;就像MVC一样。ECS最早在游戏《守望先锋》中提及到的相关链接。ECS具体是指实体&#xff08;entity&#xff09;、 组件&#xff08;component&#xff09;和系统&#xff08;system&#xff09;&#xff1a; 实体&#xff1a;实体是一个ID&a…...

力扣:131. 分割回文串

回溯解法思路&#xff1a; 1.先声明一个集合来接受全部的回文子串组合&#xff0c;在声明一个集合来接收单个回文子串的组合。 2.写一个回溯函数&#xff0c;里面有终止条件和遍历全部组合的for循环来进行遍历全部的组合&#xff0c;终止条件为开始索引等于字符串的长度时&am…...

2024美赛数学建模B题思路源码

赛题目的 赛题目的&#xff1a; 问题描述&#xff1a; 解题的关键&#xff1a; 问题一. 问题分析 要开发一个模型来预测潜水器随时间的位置&#xff0c;我们需要考虑以下几个关键因素&#xff1a; 海洋环境因素&#xff1a;当前和预测的洋流、海水密度&#xff08;可能会随…...

线程的取消和互斥

线程的取消 int pthread_cancel(pthread_t thread); 注意:线程的取消要有取消点才可以,不是说取消就取消,线程的取消点主要是阻塞的系统调用(前面sleep就是一个阻塞的系统调用) 如果没有取消点,手动设置一个 把上图中sleep函数替换成这个一样可以取消 void pth…...

机器学习之DeepSequence软件使用学习1

简介 DeepSequence 是一个生成性的、无监督的生物序列潜变量模型。给定一个多重序列比对作为输入&#xff0c;它可以用来预测可获得的突变&#xff0c;提取监督式学习的定量特征&#xff0c;并生成满足明显约束的新序列文库。它将序列中的高阶依赖性建模为残差子集之间约束的非…...

【Kotlin】Kotlin环境搭建

1 前言 Kotlin 是一种现代但已经成熟的编程语言&#xff0c;由 JetBrains 公司于 2011 年设计和开发&#xff0c;并在 2012 年开源&#xff0c;在 2016 年发布 v1.0 版本。在 2017 年&#xff0c;Google 宣布 Kotlin 正式成为 Android 开发语言&#xff0c;这进一步推动了 Kotl…...

langgraph学习--创建基本的agent执行器

本文介绍如何使用langgraph创建一个基本的Agent执行器&#xff0c;主要包括下面几个步骤&#xff1a; 1、定义工具 2、创建langchain Agent&#xff08;由LLM、tools、prompt三部分组成&#xff09; 3、定义图形状态 传统的LangChain代理的状态有几个属性: &#xff08;1&#…...

Mybatis中的sql-xml延迟加载机制

Mybatis中的sql-xml延迟加载机制 hi&#xff0c;我是阿昌&#xff0c;今天记录一下关于Mybatis中的sql-xml延迟加载机制 一、前言 首先mybatis技术本身就不多介绍&#xff0c;说延迟加载机制之前&#xff0c;那要先知道2个概念&#xff1a; 主查询对象关联对象 假设咱们现…...

【Linux系统学习】1.初识Linux

初识Linux 操作系统概述 初识Linux 虚拟机介绍 VMware WorkStation安装 1.操作系统概述 了解操作系统的作用 了解常见的操作系统 1.1 硬件和软件 计算机由哪两个主要部分组成&#xff1f; 硬件&#xff1a;计算机系统中由电子&#xff0c;机械和光电元件等组成的各种物理装置的…...

政安晨:政安晨:机器学习快速入门(三){pandas与scikit-learn} {模型验证及欠拟合与过拟合}

这一篇中&#xff0c;咱们使用Pandas与Scikit-liarn工具进行一下模型验证&#xff0c;之后再顺势了解一些过拟合与欠拟合&#xff0c;这是您逐渐深入机器学习的开始&#xff01; 模型验证 评估您的模型性能&#xff0c;以便测试和比较其他选择。 在上一篇中&#xff0c;您已经…...

分享65个节日PPT,总有一款适合您

分享65个节日PPT&#xff0c;总有一款适合您 65个节日PPT下载链接&#xff1a;https://pan.baidu.com/s/1hc1M5gfYK8eDxQVsK8O9xQ?pwd8888 提取码&#xff1a;8888 Python采集代码下载链接&#xff1a;采集代码.zip - 蓝奏云 学习知识费力气&#xff0c;收集整理更不易。知…...

架构学习(二):原生scrapy如何接入scrapy-redis,初步入局分布式

原生scrapy如何接入scrapy-redis&#xff0c;实现初步入局分布式 前言scrpy-redis分布式碎语 实现流程扩展结束 前言 scrpy-redis分布式 下图是scrpy-redis官方提供的架构图&#xff0c;按我理解&#xff0c;与原生scrapy的差异主要是把名单队列服务器化&#xff0c;也是存储…...

第1节、电路连接【51单片机+L298N步进电机系列】

↑↑↑点击上方【目录】&#xff0c;查看本系列全部文章 摘要&#xff1a;本节介绍如何搭建一个51单片机L298N步进电机控制电路&#xff0c;所用材料均为常见的模块&#xff0c;简单高效的方式搭建起硬件环境。 一、硬件清单 ①51单片机模块 ②恒流模块 ③开关电源 ④L298N模…...

API接口文档怎么写?

API接口文档模板 本文档更新时间&#xff1a;2022-12-07 本文档更新说明&#xff1a;提供了接口文档模板&#xff0c;后续如果有接口文档编写相关工作&#xff0c;可以参考该模板。 接口名称&#xff1a; XX帐号基础信息批量获取接口 【接口名称&#xff0c;见名知意】 接口…...

Qt 范例阅读: QStateMachine状态机框架 和 SCXML 引擎简单记录(方便后续有需求能想到这两个东西)

一、QStateMachine 简单应用&#xff1a; 实现按钮的文本切换 QStateMachine machine; //定义状态机&#xff08;头文件定义&#xff09;QState *off new QState(); //添加off 状态off->assignProperty(ui->pushButton_2, "text", "Off"); //绑定该…...

Linux实验记录:使用DHCP动态管理主机地址

前言&#xff1a; 本文是一篇关于Linux系统初学者的实验记录。 参考书籍&#xff1a;《Linux就该这么学》 实验环境&#xff1a; VmwareWorkStation 17——虚拟机软件 RedHatEnterpriseLinux[RHEL]8——红帽操作系统 备注&#xff1a; 动态主机配置协议&#xff08;DHCP&…...

Qt应用软件【协议篇】MQTT协议介绍

文章目录 MQTT简介QT中MQTT的源码什么是 MQTT?MQTT 的工作原理MQTT 的工作流程MQTT 的应用场景智能家居工业物联网(IIoT)车联网环境监测医疗健康物流与供应链智能能源公共安全基于传输层TCP协议上的MQTT应用层协议...

Linux ncftp命令教程:如何使用ncftp来管理FTP服务器(附实例详解和注意事项)

Linux ncftp命令介绍 ncftp是一种增强的FTP客户端程序&#xff0c;它可以让你在本地和远程服务器之间传输文件&#xff0c;并管理远程服务器上的文件和目录。ncftp具有许多特色&#xff0c;包括显示传输速率&#xff0c;下载进度&#xff0c;自动续传&#xff0c;标记书签&…...

2、ChatGPT 在数据科学中的应用

ChatGPT 在数据科学中的应用 ChatGPT 可以成为数据科学家的绝佳工具。以下是我所了解到的关于它擅长的地方和不那么擅长的地方。 我从使用 ChatGPT 中学到了一个教训。它在数据科学中非常有帮助,但你必须仔细检查它输出的所有内容。它非常适合某些任务,并且可以非常快速准确…...

从小白到入门webrtc音视频通话

0. 写在前面 先会骑车&#xff0c;再研究为什么这么骑&#xff0c;才是我认为学习技术的思路&#xff0c;底部付了demo例子&#xff0c;根据例子上面的介绍即可运行。 1. 音视频通话要用到的技术简介 websocket 介绍&#xff1a;1. 服务器可以向浏览器推送信息&#xff1b;2…...

变量 varablie 声明- Rust 变量 let mut 声明与 C/C++ 变量声明对比分析

一、变量声明设计&#xff1a;let 与 mut 的哲学解析 Rust 采用 let 声明变量并通过 mut 显式标记可变性&#xff0c;这种设计体现了语言的核心哲学。以下是深度解析&#xff1a; 1.1 设计理念剖析 安全优先原则&#xff1a;默认不可变强制开发者明确声明意图 let x 5; …...

【入坑系列】TiDB 强制索引在不同库下不生效问题

文章目录 背景SQL 优化情况线上SQL运行情况分析怀疑1:执行计划绑定问题?尝试:SHOW WARNINGS 查看警告探索 TiDB 的 USE_INDEX 写法Hint 不生效问题排查解决参考背景 项目中使用 TiDB 数据库,并对 SQL 进行优化了,添加了强制索引。 UAT 环境已经生效,但 PROD 环境强制索…...

2024年赣州旅游投资集团社会招聘笔试真

2024年赣州旅游投资集团社会招聘笔试真 题 ( 满 分 1 0 0 分 时 间 1 2 0 分 钟 ) 一、单选题(每题只有一个正确答案,答错、不答或多答均不得分) 1.纪要的特点不包括()。 A.概括重点 B.指导传达 C. 客观纪实 D.有言必录 【答案】: D 2.1864年,()预言了电磁波的存在,并指出…...

sqlserver 根据指定字符 解析拼接字符串

DECLARE LotNo NVARCHAR(50)A,B,C DECLARE xml XML ( SELECT <x> REPLACE(LotNo, ,, </x><x>) </x> ) DECLARE ErrorCode NVARCHAR(50) -- 提取 XML 中的值 SELECT value x.value(., VARCHAR(MAX))…...

html-<abbr> 缩写或首字母缩略词

定义与作用 <abbr> 标签用于表示缩写或首字母缩略词&#xff0c;它可以帮助用户更好地理解缩写的含义&#xff0c;尤其是对于那些不熟悉该缩写的用户。 title 属性的内容提供了缩写的详细说明。当用户将鼠标悬停在缩写上时&#xff0c;会显示一个提示框。 示例&#x…...

九天毕昇深度学习平台 | 如何安装库?

pip install 库名 -i https://pypi.tuna.tsinghua.edu.cn/simple --user 举个例子&#xff1a; 报错 ModuleNotFoundError: No module named torch 那么我需要安装 torch pip install torch -i https://pypi.tuna.tsinghua.edu.cn/simple --user pip install 库名&#x…...

Docker 本地安装 mysql 数据库

Docker: Accelerated Container Application Development 下载对应操作系统版本的 docker &#xff1b;并安装。 基础操作不再赘述。 打开 macOS 终端&#xff0c;开始 docker 安装mysql之旅 第一步 docker search mysql 》〉docker search mysql NAME DE…...

保姆级教程:在无网络无显卡的Windows电脑的vscode本地部署deepseek

文章目录 1 前言2 部署流程2.1 准备工作2.2 Ollama2.2.1 使用有网络的电脑下载Ollama2.2.2 安装Ollama&#xff08;有网络的电脑&#xff09;2.2.3 安装Ollama&#xff08;无网络的电脑&#xff09;2.2.4 安装验证2.2.5 修改大模型安装位置2.2.6 下载Deepseek模型 2.3 将deepse…...

为什么要创建 Vue 实例

核心原因:Vue 需要一个「控制中心」来驱动整个应用 你可以把 Vue 实例想象成你应用的**「大脑」或「引擎」。它负责协调模板、数据、逻辑和行为,将它们变成一个活的、可交互的应用**。没有这个实例,你的代码只是一堆静态的 HTML、JavaScript 变量和函数,无法「活」起来。 …...

何谓AI编程【02】AI编程官网以优雅草星云智控为例建设实践-完善顶部-建立各项子页-调整排版-优雅草卓伊凡

何谓AI编程【02】AI编程官网以优雅草星云智控为例建设实践-完善顶部-建立各项子页-调整排版-优雅草卓伊凡 背景 我们以建设星云智控官网来做AI编程实践&#xff0c;很多人以为AI已经强大到不需要程序员了&#xff0c;其实不是&#xff0c;AI更加需要程序员&#xff0c;普通人…...