Unity DOTS系列之Struct Change核心机制分析

embedded/2024/9/25 2:19:01/

最近DOTS发布了正式的版本, 我们来分享一下DOTS里面Struct Change机制,方便大家上手学习掌握Unity DOTS开发。

基于ArchType与Chunk的Entity管理机制

我们回顾以下ECS的内存管理核心机制,基于ArchType+Chunk的Entity管理模式。每个Entity不直接存放数据,数据全部存放到ComponentData里面。每个类型的Entity,会把它所有的ComponentData的组合在一起。每种类型的Entity都会得到”一种组合类型”,我们把它叫做ArchType。每种类型的Enitity对应一种ArchType。如果有新的类型的Entity出来,系统就会有新的一种ArchType。ArchType对应的内存块都是由Chunk统一分配,每个Chunk只会分配一种ArchType的内存块。

对惹,这里有一个游戏开发交流小组,大家可以点击进来一起交流一下开发经验呀!

===============================
ArchType1:
chunk1【e1(c1c2),e2(c1c2),e3(c1c2)】
chunk2【e4(c1c2),e5(c1c2),e6(c1c2)】
...
======================
ArchType2:
chunk1【e1(c3c4),e2(c3c4),e3(c3c4)】
chunk2【e4(c3c4),e5(c3c4),e6(c3c4)】
...
===============================
ArchType3: 
chunk1【e1(c5c6),e2(c5c6),e3(c5c6)】
chunk2【e3(c5c6),e4(c5c6),e5(c5c6)】
...
===============================

Struct Change机制

当我们操作entity中的ComponentData的时候,有可能导致Struct Change,及原来的ArchType以已经不适合新的Entity了,必须要产生新的ArchType来存放数据,这种我们叫做Struct Change。以下操作会导致Struct Change发生:

  1. 创建or删除一个Entity: Unity会从当前Entity类型的ArchType里面找到一个chunk, 把第一个空闲的内存块分配分配出来。如果当前的chunk都满了,就重新向操作系统分配一个chunk内存页出来。当删除一个entity的时候,先找到内存块所在的chunk,找到内存块在chunk中的偏移位置,把最后一个entity的component数据复制到刚才释放的内存块中,把最后的那个内存块释放出来,供一下分配。
  2. 添加或删除一个组件数据: 当我们给entity添加or删除一个组件数据的时候,意味着前后是不同的ArchType(因为改变了组合类型)。所以要先释放原来ArchType对应的内存块,然后在新的ArchType里面再找Chunk来分配出Entity的新的ComponentData内存块。
  3. 修改了同一类型Entity共用的ShareComponent数据: 每种ArchType共用一个ShareComponent数据,如果修改了ShareComponent数据,那么意味着要创建一个新的ShareComponent数据。那么代表着当前的Entity已经不再属于当前的ArchType了,既然这样,系统就要重新基于新的ArchType来给Entity重新分配内存块,回收之前的内存块。

Struct Change的代价与开销

Struct Change引发的开销是非常大的,所以当我们基于DOTS来开发的时候,你要能清楚的知道Struct Change的开销。Struct Change开销,除了要重新从chunk里面分配内存块,复制数据以外,还有同步点的开销,同步点你可以理解为一个锁,当发生了Strcut Change的时候,为了保证正确性,系统会生成一个同步点,这样其它的要使用这个数据的线程都会被挂起,直到Struct Change操作完成。

Struct Change还会导致之前系统里面的组件引用失效,所以当发生Struct Change的时候,还要重新更新引用数据,保证后面数据的正确。从上面来看Struct Change开销确实很大,特别是每次修改还要获取同步点,同步点会导致系统的吞吐量下降,我们可以考虑把所有的Struct Change延后一起发生,这样可以只请求一个同步点的基础上把所有的Struct Change全部处理掉。


http://www.ppmy.cn/embedded/116392.html

相关文章

多旋翼无人机维修、组装、调试技术详解

多旋翼无人机作为现代航拍、农业植保、物流运输等领域的重要工具,其性能的稳定性和操作的便捷性对于任务的完成至关重要。因此,掌握多旋翼无人机的维修、组装与调试技术,对于无人机操作员及维修人员来说至关重要。本文将详细介绍这三个方面的…

反转字符串 II--力扣541

反转字符串 II 题目思路代码 题目 思路 本题的关键在于理解每隔 2k 个字符的前 k 个字符进行反转,剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符。并且剩余字符少于 k 个,则将剩余字符全部反转。 让i每次跳2k,成为每一次…

基于SSM+Vue+MySQL的酒店管理系统

系统展示 用户前台界面 管理员后台界面 系统背景 随着旅游业的蓬勃发展,酒店业作为旅游产业链中的重要一环,面临着日益增长的客户需求和激烈的市场竞争。传统的人工酒店管理模式已难以满足高效、精准、个性化的服务要求。因此,开发一套基于SS…

环境部署-环境变量

环境部署-环境变量 1、python设置查找环境变量2、linux设置设置查找环境变量 仅个人笔记使用,感谢点赞关注 1、python设置查找环境变量 python设置环境变量 import os os.environ["PYTHONPATH"] "/path/to/library"python获取环境变量 MYS…

CSS基本概念以及CSS的多种引入方式

CSS基本概念 CSS是层叠样式表,又叫级联样式表,简称样式表。CSS的文件后缀为.css,CSS用于HTML文档中元素样式的定义。 CSS的基本语法 CSS的规则由2个主要的部分构成:选择器以及一条或者多条声明。 选测器通常是你血药改变样式的…

Redis中的setnx的使用场景

Redis中的SETNX命令是一个非常有用的工具,特别是在处理分布式系统和并发控制时。SETNX是“Set if Not Exists”的缩写,用于设置键的值,但仅当键不存在时。以下是SETNX命令的一些主要使用场景: 1. 分布式锁 在分布式环境中&#…

需求2:新加字段

从今天开始,我想把我之前写的一些小的,简单的需求都通过文章的方式写出来,一方面是回顾梳理之前所学的知识,另一方面也是为了方便以后回看,好记性不如烂笔头。 现在的问题是这样的: 涛哥希望,加…

【软件测试】详解测试中常用的几种测试方法

目录 一、集成测试二、 系统测试三、验收测试四、回归测试 总结 一、集成测试 术语 集成测试是继组件测试之后的又一个层次。集成测试假定交给这个层次的测试对象已经经过了组件测试,并且任何组件内部的缺陷都已经尽可能地被纠正。 集成 开发人员、测试人员和专…