Unity DOTS从入门到精通之 C# Job System

news2025/4/21 18:40:30

文章目录

    • 前言
    • 安装 DOTS 包
    • C# 任务系统
      • Mono 环境
      • DOTS 环境
      • 运行作业
      • NativeContainer

前言

作为 DOTS 教程,我们将创建一个旋转立方体的简单程序,并将传统的 Unity 设计转换为 DOTS 设计。

  • Unity 2022.3.52f1
  • Entities 1.3.10

安装 DOTS 包

要安装 DOTS 包,请按照以下步骤操作:

(1)从菜单“窗口 → 包管理器”打开包管理器。
(2)搜索“ Entities” 并安装 Entities和Entities Graphics。
(3)搜索“ Universal RP” 并安装 Universal RP,并设置Graphics/Scriptable Render Pipeline Settings。

这会添加“实体”作为依赖项,并递归添加它所依赖的关联包( Burst、Collections、Jobs、Mathematics等)。

在这里插入图片描述

C# 任务系统

“ C# 作业系统”是用于执行并行处理的功能。您只需执行作业即可充分利用 CPU 内核,而不必担心执行的顺序或时间。

其特点包括:
・代码简洁
・无GC
・安全
・快速

当“主线程”上无法执行所有处理时,将创建一个“作业”,将处理划分为多个较小的进程,并将这些进程添加(调度)到“作业队列”中。 “工作线程”从“作业队列”中取出一个“作业”并执行。
在这里插入图片描述
此时,C# 作业系统管理依赖关系,以便按适当的顺序执行作业。例如,如果 JobB 依赖于 JobA,那么您可以确保在 JobA 完成之前 JobB 不会运行。

虽然Job可以在Mono和Dots环境下运行,但是Mono下只能使用多线程的基本能力。
我们这里推荐在Dots环境下使用JobSystem

Mono 环境

仅依赖 JobSystem 的多线程能力

// 需继承 MonoBehaviour
public class MonoJobSample : MonoBehaviour {
    void Update() {
        var job = new MyJob { 
        	/* 数据传递 */ 
        };
        JobHandle handle = job.Schedule();
        handle.Complete(); // 需手动同步
    }
}

DOTS 环境

Dots环境下配合Burst,才真正能够发挥JobSystem的并行能力
但是Job的写法也很重要,写法不规范依然不能充分使用Burst的能力。

  • job内联写法,Lambda写法,适合简单组件遍历
public void OnUpdate(ref SystemState state) {
    Entities.ForEach((ref LocalTransform trans, ref FindTarget find) => {
        // 自动处理多线程调度
    }).ScheduleParallel();
}
  • IJobEntity 标准实现,适合复杂逻辑,支持Burst编译
public partial struct HealthSystem : ISystem
{
    private EntityCommandBuffer.ParallelWriter _ecb;
    
    [BurstCompile]
    public void OnUpdate(ref SystemState state)
    {
        _ecb = SystemAPI.GetSingleton<EndSimulationEntityCommandBufferSystem.Singleton>()
            .CreateCommandBuffer(state.WorldUnmanaged).AsParallelWriter();
        HealthJob unitMoverJob = new HealthJob
        {
            ECB = _ecb,
        };
        unitMoverJob.ScheduleParallel();
    }
}

[BurstCompile]
public partial struct HealthJob : IJobEntity
{
    public EntityCommandBuffer.ParallelWriter ECB;

    public void Execute([EntityIndexInQuery] int index,
        ref Health health,in PostTransformMatrix localTransform,
        Entity entity)
    {
		//这里做System逻辑处理
		//逻辑是跑在Burst多线程中,性能提升明显
    }
}

运行作业

1.定义一个作业
要定义一个作业,首先准备一个继承“ IJob ”的结构。接下来,准备在字段中作业处理中要使用的变量。最后用Execute()实现 Job 的处理。

2.创建 Job
“Job”是作为继承“ IJob ” 的结构体( struct )生成的。

Job 字段可以有两种类型:
・基础类型:int、float、bool 等。
・NativeContainer:NativeArray、NativeSlice、NativeList 等。

只有“NativeContainer”数据可以在 Job 和主线程之间共享;“原始类型”可用于输入但不能用于输出。

3.指定Job的执行方式
指定Job的执行方式有三种方式:

・Run():在主线程中执行 lambda 表达式。在这种情况下,等待作业完成。
・Schedule():将 lambda 表达式安排为单个作业。
・ScheduleParallel():将 lambda 表达式安排为分成多个块的作业。

返回的值是“ JobHandle ”。这是对计划作业进行操作的句柄。

4.JobHandle 操作:
通过调用“JobHandle”方法上的 Complete() 等待 Job 完成。

NativeContainer

“ NativeContainer ” 是一个非托管容器,不同于 C# 提供的托管容器(List、Dictionary 等)。由于它不受 GC 管理,因此您需要通过调用Dispose()自行释放内存。

其特点包括:

  • 自己决定内存分配类型(分配器)
  • 使用后必须使用 Dispose() 释放内存
  • 仅限结构(不允许使用类)
  • 不能增加元素的数量

“NativeContainer”的类型有:

・NativeArray<Value>:数组
・NativeSlice<Value>:从 NativeArray 中切出一部分
・NativeList<Value>:列表
・NativeHashMap<Key, Value>:字典
・NativeMultiHashMap<Key, Value>:每个键有多个值的字典
・NativeQueue<Value>:先进先出(FIFO)队列

“C#作业系统”使用“NativeContainer”实现作业和主线程之间的数据共享。用于在Job和主线程之间传递数据。

创建 NativeContainer
创建一个“NativeArray”,即 NativeContainer 之一。第一个参数是“元素的数量”,第二个参数是“内存分配类型”。

内存分配类型有:

・Allocator.Temp:用于分配和释放一帧或更少的内存。
・Allocator.TempJob:4帧内使用的内存分配和释放。
Allocator.Persistent :应用程序生命周期内的持久分配。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2312986.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Godot4.4】浅尝Godot中的MVC

概述 基于一个Unity的视频。学习了一下基本的MVC概念&#xff0c;并尝试在Godot中实现了一下。 原始的MVC&#xff1a; Godot中的MVC&#xff1a; Model、View和Controller各自应该实现的功能如下&#xff1a; Model: 属性(数据字段)数据存取方法数据更新信号 View: 控…

Elasticsearch为索引设置自动时间戳,ES自动时间戳

文章目录 0、思路1、配置 ingest pipeline2、在索引映射中启用_source字段的时间戳3、使用 index template 全局设置时间戳4、写入测试数据5、验证结果6、总结 在使用 Elasticsearch 进行数据存储和检索时&#xff0c;时间戳字段是一个非常重要的组成部分。它可以帮助我们追踪数…

计算机网络:计算机网络的组成和功能

计算机网络的组成&#xff1a; 计算机网络的工作方式&#xff1a; 计算机网络的逻辑功能; 总结&#xff1a; 计算机网络的功能&#xff1a; 1.数据通信 2.资源共享 3.分布式处理:计算机网络的分布式处理是指将计算任务分散到网络中的多个节点&#xff08;计算机或设备&…

FPGA设计时序约束用法大全保姆级说明

目录 一、序言 二、时序约束概览 2.1 约束五大类 2.2 约束功能简述 2.3 跨时钟域约束 三、时序约束规范 3.1 时序约束顺序 3.2 约束的优先级 四、约束示例 4.1 设计代码 4.2 时序结果 4.2.1 create_clock 4.2.2 create_generated_clock 4.2.3 Rename_Auto-Derive…

云服务运维智能时代:阿里云操作系统控制台

阿里云操作系统控制台 引言需求介绍操作系统使用实例获得的帮助与提升建议 引言 阿里云操作系统控制台是一款创新型云服务器运维工具&#xff0c;专为简化用户的运维工作而设计。它采用智能化和可视化的方式&#xff0c;让运维变得更加高效、直观。借助AI技术&#xff0c;控制…

硬件学习笔记--48 磁保持继电器相关基础知识介绍

目录 1.磁保持继电器工作原理 2.磁保持继电器内部结构及组成部分 3.磁保持继电器主要参数 4.总结 1.磁保持继电器工作原理 磁保持继电器利用永磁体的磁场和线圈通电产生的磁场相互作用&#xff0c;实现触点的切换。其特点在于线圈断电后&#xff0c;触点状态仍能保持&#…

简记_硬件系统设计之需求分析要点

目录 一、 功能需求 二、 整体性能需求 三、 用户接口需求 四、 功耗需求 五、 成本需求 六、 IP和NEMA防护等级需求 七、 认证需求 功能需求 供电方式及防护 供电方式&#xff1a;市电供电、外置直流稳压电源供电、电池供电、PoE&#xff08;Power Over Ether…

ubuntu 20.04下ZEDmini安装使用

提前安装好显卡驱动和cuda&#xff0c;如果没有安装可以参考我的这两篇文章进行安装&#xff1a; ubuntu20.04配置YOLOV5&#xff08;非虚拟机&#xff09;_ubuntu20.04安装yolov5-CSDN博客 ubuntu20.04安装显卡驱动及问题总结_乌班图里怎么备份显卡驱动-CSDN博客 还需要提前…

tauri-plugin-shell插件将_blank的a标签用浏览器打开了,,,解决办法

不要使用这个插件&#xff0c;这个插件默认会将网页中a标签为_blank的使用默认浏览器打开&#xff0c;但是这种做法在我的程序里不是很友好&#xff0c;我需要自定义这种行为&#xff0c;当我点击我自己的链接的时候&#xff0c;使用默认浏览器打开&#xff0c;当点击别的链接的…

C++ 继承(2)

Hello&#xff01;&#xff01;大家早上中午晚上好&#xff01;&#xff01;今天收尾继承剩余部分内容&#xff01;&#xff01; 一、友元不能继承 基类的友元函数不能被子类继承&#xff0c;也就是基类的友元函数访问不了子类的私有或保护成员&#xff01; 1.1解决方法在子…

解决:Word 保存文档失败,重启电脑后,Word 在试图打开文件时遇到错误

杀千刀的微软&#xff0c;设计的 Word 是个几把&#xff0c;用 LaTex 写完公式&#xff0c;然后保存&#xff0c;卡的飞起 我看文档卡了很久&#xff0c;就关闭文档&#xff0c;然后 TMD 脑抽了重启电脑 重启之后&#xff0c;文档打不开了&#xff0c;显示 杀千刀的&#xff…

基于Asp.net的零食购物商城网站

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏&#xff1a;…

ESP8266UDP透传

1. 配置 WiFi 模式 ATCWMODE3 // softAPstation mode 响应 : OK 2. PC 连⼊入 ESP8266 softAP 就是连接wifi 3.查询ESP8266设备的IP地址 ATCIFSR 响应: CIFSR: APIP, "192.168.4.1" CIFSR: APMAC, "1a: fe: 34: a5:8d: c6" CIFSR: STAIP, "192.…

UE5从入门到精通之如何创建自定义插件

前言 Unreal 的Plugins插件系统中有很多的插件供大家使用,包括官方的和第三方的,这些插件不仅能帮我我们实现特定功能,还能够提升我们的工作效率。 所以我们今天就来自己创建一个自定义插件,如果我们想实现什么特定的功能,我们也可以发布到商店供大家使用了。 创建插件 …

基于python大数据的招聘数据可视化与推荐系统

博主介绍&#xff1a;资深开发工程师&#xff0c;从事互联网行业多年&#xff0c;熟悉各种主流语言&#xff0c;精通java、python、php、爬虫、web开发&#xff0c;已经做了多年的设计程序开发&#xff0c;开发过上千套设计程序&#xff0c;没有什么华丽的语言&#xff0c;只有…

olmOCR:高效精准的 PDF 文本提取工具

在日常的工作和学习中&#xff0c;是否经常被 PDF 文本提取问题困扰&#xff1f;例如&#xff1a; 想从学术论文 PDF 中提取关键信息&#xff0c;却发现传统 OCR 工具识别不准确或文本格式混乱&#xff1f;需要快速提取商务合同 PDF 中的条款内容&#xff0c;却因工具不给力而…

Spring Boot使用JDBC /JPA访问达梦数据库

Spring Boot 是一个广泛使用的 Java 框架&#xff0c;用于快速构建基于 Spring 的应用程序。对于达梦数据库&#xff08;DMDB&#xff09;的支持&#xff0c;Spring Boot 本身并没有直接内置对达梦数据库的集成&#xff0c;但你可以通过一些配置和依赖来支持达梦数据库。 以下…

【五.LangChain技术与应用】【31.LangChain ReAct Agent:反应式智能代理的实现】

一、ReAct Agent是啥?为什么说它比「普通AI」聪明? 想象一下,你让ChatGPT查快递物流,它可能直接编个假单号糊弄你。但换成ReAct Agent,它会先推理(Reasoning)需要调用哪个接口,再行动(Action)查询真实数据——这就是ReAct的核心:让AI学会「动脑子」再动手。 举个真…

OpenText ETX 助力欧洲之翼航空公司远程工作升级

欧洲之翼航空公司&#xff0c;作为欧洲知名的低成本航空公司&#xff0c;拥有超过 130 架飞机&#xff0c;服务于约 60 个国家的 210 多个目的地&#xff0c;是欧洲第三大的点对点航空公司。面对 2020年 冠状病毒大流行的挑战&#xff0c;欧洲之翼航空公司迅速采取行动&#xf…

特征表示深度解析:颜色、纹理、形状与编码

第一部分&#xff1a;颜色与纹理特征&#xff08;Part 1&#xff09; 1. 颜色特征 颜色直方图&#xff08;Color Histogram&#xff09; 定义&#xff1a;统计图像中各颜色通道&#xff08;R/G/B&#xff09;的像素分布&#xff0c;形成直方图。 计算步骤&#xff1a; 将每个…