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

Unity DOTS系列之IJobChunk来迭代处理数据

最近DOTS发布了正式的版本, 我们来分享一下System中如何在System中使用IJobChunk来迭代处理World中的数据,方便大家上手学习掌握Unity DOTS开发。

再回顾一次基于ArcheType Chunk内存管理

我们先再次回顾以下基于ArcheType的Chunk内存管理。每一类Entity都是由一些列的ComponentData组合而成的,这个组合我们使用ArcheType来进行描述。同一种ArcheType的Entity具有相通的内存大小与布局,存放在chunk里面。每个chunk只会存放同一种ArcheType类型的Entity的组件数据。每个chunk的大小是16kb。里面并排存放着每个Entity的组件数据。如下所示:

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

===============================
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)】
...
===============================

使用IjobChunk的主要流程

在DOTS中迭代处理Entity的组件数据先找到对应符合条件的ArcheType,然后再找到ArcheType对应的所有的Chunks,再遍历每个Chunk里面的每个Entity的组件数据。有了这个思路以后,我们先来看下如何来使用IJobChunk机制来进行数据迭代。步骤如下:

  1. 定义一个EntityQuery对象,它根据赛选条件而生成,当IJobChunk来筛选Entity的时候就基于这个对象的筛选条件。EntityQuery对象是基于EntityQueryBuilder对象创建出来。EntityQueryBuilder负责将筛选条件转成最后的EntityQuery对象。示例代码如下:
    public partial class UpdateTranslationFromVelocitySystem : SystemBase{EntityQuery query;protected override void OnCreate(){// Set up the queryquery = new EntityQueryBuilder(Allocator.Temp).WithAllRW<ObjectPosition>().WithAll<VelocityVector>().Build(this);}
  1. 定义一个继承IJobChunk接口的Job结构体,并实现Execute接口。
public struct UpdateTranslationFromVelocityJob : IJobChunk {
public void Execute(in ArchetypeChunk chunk, 
int unfilteredChunkIndex, 
bool useEnabledMask, 
in v128 chunkEnabledMask)}
  1. 定义在Job中Execute中所使用的数据,这些数据在System Update迭代的时候传入。IJobChunk迭代处理数据的时候都是一个一个Chunk来处理的,每个Chunk调用一次Execute函数。在Execute函数中你需要什么样的数据就可以定义在Job的结构体里面。
public struct UpdateTranslationFromVelocityJob : IJobChunk{public ComponentTypeHandle<VelocityVector> VelocityTypeHandle;public ComponentTypeHandle<ObjectPosition> PositionTypeHandle;public float DeltaTime;       public void Execute(in ArchetypeChunk chunk, 
int unfilteredChunkIndex, 
bool useEnabledMask, 
in v128 chunkEnabledMask){}}

利用ComponentTypeHandle可以把chunk内存块里面所有的对应的组件的数据放到NativeArray里面给Execute迭代使用。普通的数据可以直接定义即可。

  1. 实现Interface IjobChunk的Execute函数的具体迭代逻辑,用于具体的处理。处理组件数据的时候,基于ComponentTypeHandle把Chunk里面的组件数据获取到一个NativeArray里面。Execute有4个参数:
  • chunk,类型是ArcheTypeChunk,就是我们的chunk内存块,存放数据地方;
  • unfilteredChunkIndex: 我们当前chunk,所在所有chunk的索引;
  • bool useEnbaleMask, in v128 chunkEnableMask, 是enableable component的bitmap,给我们查询使用。

在Execute里面我们使用ChunkEntityEnumerator来遍历chunk里面的每个entity的Component,参考代码如下:

NativeArray<VelocityVector> velocityVectors = chunk.GetNativeArray(ref VelocityTypeHandle);NativeArray<ObjectPosition> translations = chunk.GetNativeArray(ref PositionTypeHandle);var enumerator = new ChunkEntityEnumerator(useEnabledMask, chunkEnabledMask, chunk.Count);while(enumerator.NextEntityIndex(out var i)){float3 translation = translations[i].Value;float3 velocity = velocityVectors[i].Value;float3 newTranslation = translation + velocity * DeltaTime;translations[i] = new ObjectPosition() { Value = newTranslation };}
  1. 在System中来使用IJobChunk,进行执行。当JobChunk的结构体定义好以后,我们就可以在System中使用它们,在System的Update中定义一个结构体对象,把JobChunk结构体中的数据初始化好,然后调用JobChunk的执行函数。执行函数有三个接口,分别如下:
  • Run: 执行当前的job(job chunk 的execute)是在当前线程(system的update迭代所在的线程);
  • Shedule: 就是会在另外一个线程来处理我们的Excute,按照顺序一个一个来处理; chunk1, chunk2, chunk3….
  • SheduleParallel: 并发处理, 可以多个线程同时并发处理多个chunk, 线程1 chunk1, 线程2 处理chunk2 , …..

按照这5个步骤,来定义与使用IJobChunk来计算迭代游戏逻辑与数据。

相关文章:

Unity DOTS系列之IJobChunk来迭代处理数据

最近DOTS发布了正式的版本, 我们来分享一下System中如何在System中使用IJobChunk来迭代处理World中的数据&#xff0c;方便大家上手学习掌握Unity DOTS开发。 再回顾一次基于ArcheType Chunk内存管理 我们先再次回顾以下基于ArcheType的Chunk内存管理。每一类Entity都是由一些…...

哈希——哈希表

回顾/本期梗概 上期我们学习了哈希——字符串哈希&#xff08;空降链接&#xff09;&#xff0c;本期我们将学习哈希中的哈希表。 1、哈希表原理 &#xff08;1&#xff09;使用数组下标直接标记元素 哈希表&#xff08;也叫数列表&#xff09;&#xff1a;是一种高效的、通过把…...

简单了解 JVM

目录 ♫什么是JVM ♫JVM的运行流程 ♫JVM运行时数据区 ♪虚拟机栈 ♪本地方法栈 ♪堆 ♪程序计数器 ♪方法区/元数据区 ♫类加载的过程 ♫双亲委派模型 ♫垃圾回收机制 ♫什么是JVM JVM 是 Java Virtual Machine 的简称&#xff0c;意为 Java虚拟机。 虚拟机是指通过软件模…...

已经30岁了,想转行从头开始现实吗?什么样的工作算好工作?

我是29岁那年&#xff0c;完成从转行裸辞副业的职业转型。 如果你把职业生涯看成是从现在开始30岁&#xff0c;到你退休那年&#xff0c;中间这么漫长的30年&#xff0c;那么30岁转行完全来得及&#xff1b; 如果你觉得必须在什么年纪&#xff0c;什么时间内必须完成赚到几十…...

快速理解docker(一)docker 简介

在当今快速迭代的软件开发环境中&#xff0c;如何高效地部署、管理和扩展应用程序成为了开发者们面临的重大挑战。Docker&#xff0c;作为一款开源的容器化平台&#xff0c;凭借其轻量级、可移植性和易于部署的特性&#xff0c;迅速成为了解决这些挑战的热门选择。本文将带您走…...

RHCS认证-Linux(RHel9)-Ansible

文章目录 一、ansible 简介二 、ansible部署三、ansible服务端测试四 、ansible 清单inventory五、Ad-hot 点对点模式六、YAML语言模式七、RHCS-Ansible附&#xff1a;安装CentOS-Stream 9系统7.1 ansible 执行过程7.2 安装ansible&#xff0c;ansible-navigator7.2 部署ansibl…...

【Python】Spyder:科学 Python 开发环境

在数据科学和科学计算领域&#xff0c;Python 已经成为了一个不可或缺的工具。为了提高开发效率和改善编程体验&#xff0c;一个功能强大且用户友好的开发环境是必需的。Spyder&#xff08;Scientific Python Development Environment&#xff09;正是这样一个为科学计算和数据…...

SpringBootWeb响应

2. 响应 前面我们学习过HTTL协议的交互方式&#xff1a;请求响应模式&#xff08;有请求就有响应&#xff09; 那么Controller程序呢&#xff0c;除了接收请求外&#xff0c;还可以进行响应。 2.1 ResponseBody 在我们前面所编写的controller方法中&#xff0c;都已经设置了…...

CMake 构建Qt程序弹出黑色控制台

CMake 构建Qt程序弹出黑色控制台...

虚拟机centos_7 配置教程(镜像源、配置centos、静态ip地址、Finalshell远程操控使用)

文章目录 一、下载镜像源&#xff08;准备工作&#xff09;1、开源网站2、下载 二、VMware配置centos三、配置静态IP地址四、Finalshell使用1、下载Finalshell2、连接虚拟机 五、谢谢观看&#xff01; 一、下载镜像源&#xff08;准备工作&#xff09; 1、开源网站 有许多开源…...

git 删除 git push 失败的记录

文章目录 问题分析 问题 git push 失败后如何清理 commit 提交的内容 当我们 git push 失败后&#xff0c;如果下次有新的改动需要push时&#xff0c;会出现如下报错 分析 找到需要回退的那次commit的 哈希值 git log然后就回退到了指定版本&#xff0c;这个时候再把新修改…...

【专题】2024年中国白酒行业数字化转型研究报告合集PDF分享(附原数据表)

原文链接&#xff1a;https://tecdat.cn/?p37755 消费人群趋于年轻化&#xff0c;消费需求迈向健康化&#xff0c;消费场景与渠道走向多元化&#xff0c;这些因素共同驱动企业凭借数据能力来适应市场的变化。从消费市场来看&#xff0c;消费群体、需求、场景及渠道皆展现出与…...

哪款品牌充电宝性价比比较高?五款性价比绝佳充电宝推荐

在现代生活中&#xff0c;充电宝已经成为我们日常出行和工作的必备品。然而&#xff0c;面对市场上琳琅满目的充电宝品牌&#xff0c;大家往往难以抉择。尤其是在近期&#xff0c;充电宝不合格产品的数量持续上升&#xff0c;据最新抽查结果显示&#xff0c;不合格率已经上升到…...

巨坑!!华为大数据平台sparksql,连接gauss200数据库

最近用华为大数据平台fusion6.5平台&#xff0c;写了一个sparksql 读取gauss200的MPP数据库的程序。 首先将spark 相关的jar依赖包&#xff0c;必须在华为大数据平台的客户端的spark/jars 这个文件里面去找到然后添加到idea 依赖里面。打包要把整体包打在里面。 核心代码片段…...

BGP相关知识笔记

技术背景&#xff1a; 在只有IGP&#xff08;诸如OSPF、IS-IS、RIP等协议&#xff0c;因为最初是被设计在一个单域中进行一个路由操纵&#xff0c;因此被统一称为Interior Gateway Protocol&#xff0c;内部网关协议&#xff09;的时代&#xff0c;域间路由无法实现一个全局路由…...

在 Windows 上运行 Vue 项目时解决 ‘NODE_OPTIONS‘ 错误

在 Windows 上运行 Vue 项目时解决 ‘NODE_OPTIONS’ 错误 在 Windows 系统上启动 Vue 项目时&#xff0c;遭遇报错。具体报错信息如下&#xff1a; ‘NODE_OPTIONS‘ 不是内部或外部命令&#xff0c;也不是可运行的程序或批处理文件。这个错误通常意味着 Windows 系统无法识…...

面试真题:谈一谈Mysql的分库分表

分表和分库是什么&#xff1f;有什么区别&#xff1f; 分库是一种水平扩展数据库的技术&#xff0c;将数据根据一定规则划分到多个独立的数据库中。每个数据库只负责存储部分数据&#xff0c;实现了数据的拆分和分布式存储。分库主要是为了解决并发连接过多&#xff0c;单机 my…...

玄机靶场--蚁剑流量

木马的连接密码是多少 黑客执行的第一个命令是什么 id 黑客读取了哪个文件的内容&#xff0c;提交文件绝对路径 /etc/passwd 黑客上传了什么文件到服务器&#xff0c;提交文件名 黑客上传的文件内容是什么 黑客下载了哪个文件&#xff0c;提交文件绝对路径 蚁剑流量特征总结 …...

uniapp map设置高度为100%后,会拉伸父容器的高度

推荐学习文档 golang应用级os框架&#xff0c;欢迎stargolang应用级os框架使用案例&#xff0c;欢迎star案例&#xff1a;基于golang开发的一款超有个性的旅游计划app经历golang实战大纲golang优秀开发常用开源库汇总想学习更多golang知识&#xff0c;这里有免费的golang学习笔…...

CICD从无到会

一 CICD是什么 CI/CD 是指持续集成&#xff08;Continuous Integration&#xff09;和持续部署&#xff08;Continuous Deployment&#xff09;或持续交付&#xff08;Continuous Delivery&#xff09; 1.1 持续集成&#xff08;Continuous Integration&#xff09; 持续集成是…...

【Perplexity教育搜索实战指南】:3大隐藏功能+5个教师必用技巧,90%用户至今未发现

更多请点击&#xff1a; https://codechina.net 第一章&#xff1a;Perplexity教育信息搜索的核心价值与定位 Perplexity 作为新一代AI驱动的信息检索工具&#xff0c;其在教育场景中的核心价值在于将“被动查找”转化为“主动理解”。它不依赖传统关键词匹配&#xff0c;而是…...

Inter字体终极指南:如何为现代数字界面选择最佳开源字体方案?

Inter字体终极指南&#xff1a;如何为现代数字界面选择最佳开源字体方案&#xff1f; 【免费下载链接】inter The Inter font family 项目地址: https://gitcode.com/gh_mirrors/in/inter Inter字体是一款专为数字屏幕精心设计的开源无衬线字体系统&#xff0c;通过科学…...

3大核心功能解析:LilToon如何让Unity卡通渲染变得简单又专业

3大核心功能解析&#xff1a;LilToon如何让Unity卡通渲染变得简单又专业 【免费下载链接】lilToon Feature-rich shaders for avatars 项目地址: https://gitcode.com/gh_mirrors/li/lilToon 如果你正在Unity中寻找一个既能满足专业需求又容易上手的卡通渲染解决方案&am…...

专业级LaTeX排版:深度解析中国科学技术大学学位论文模板括号使用的最佳实践

专业级LaTeX排版&#xff1a;深度解析中国科学技术大学学位论文模板括号使用的最佳实践 【免费下载链接】ustcthesis LaTeX template for USTC thesis 项目地址: https://gitcode.com/gh_mirrors/us/ustcthesis 在学术论文写作中&#xff0c;细节决定专业水准。中国科学…...

书匠策AI论文生存指南:降重降AIGC,2025届毕业生的“反内卷外挂“

&#x1f3ac; 开场&#xff1a;一场关于"论文能不能活着毕业"的生存实验 朋友们&#xff0c;今天咱不开学术讲座&#xff0c;咱开一场生存发布会。 2025年写毕业论文是什么体验&#xff1f;你辛辛苦苦码了两万字&#xff0c;满怀信心点了查重——好家伙&#xff0…...

Linux用户必备的三大翻译神器:CuteTranslation如何解决多语言工作难题

Linux用户必备的三大翻译神器&#xff1a;CuteTranslation如何解决多语言工作难题 【免费下载链接】CuteTranslation Linux屏幕取词翻译软件 项目地址: https://gitcode.com/gh_mirrors/cu/CuteTranslation 对于长期在Linux环境下工作的开发者、研究人员和学生来说&…...

i.MX6Q烧录翻车实录:从‘No Device Connected’到‘Push error’,我拔掉一个USB WiFi才搞定

i.MX6Q烧录实战&#xff1a;当USB设备冲突遇上OTG接口的排查指南 那天下午的阳光透过窗户斜射进实验室&#xff0c;我正对着i.MX6Q开发板进行例行固件更新。Mfgtools工具已经准备就绪&#xff0c;开发板电源接通&#xff0c;一切看起来都很完美——直到屏幕上跳出那个令人沮丧…...

共享麻将室无人化运营:技术架构、硬件选型与实战避坑指南

1. 项目概述&#xff1a;当传统棋牌室遇上“无人化”浪潮最近几年&#xff0c;如果你留意过城市里的商业形态&#xff0c;会发现一个挺有意思的现象&#xff1a;那些曾经需要前台、服务员、保洁阿姨的传统棋牌室&#xff0c;特别是麻将馆&#xff0c;正在悄然“变身”。它们门口…...

别再死记硬背了!用Cisco Packet Tracer搞定IPv6地址配置(附EUI-64和静态路由实战)

思科模拟器实战&#xff1a;从零掌握IPv6地址配置与路由技术 在数字化浪潮席卷全球的今天&#xff0c;IPv6作为下一代互联网协议&#xff0c;正逐步取代IPv4成为网络世界的基石。然而&#xff0c;对于许多网络初学者来说&#xff0c;IPv6那长达128位的地址和全新的配置方式往往…...

ME_PURCHDOC_POSTED

创建采购订单时常用的保存增强ME_PROCESS_PO_CUST~POST里是没有订单号的可以使用ME_PURCHDOC_POSTED来做相关处理...