Unity DOTS框架学习系列四

news/2024/10/19 21:32:42/

文章目录

  • 前言
  • 一、ECS机制与概述
    • EntityQuery
    • 面向数据的编程
    • 总结如下
  • 二、Joy System机制与概述
    • Job System的核心机制
    • 使用Job System的基本步骤
    • 实例说明‌
  • 三、Burst Compiler工具链
    • Burst Compiler的主要功能包括
  • 总结


前言

本文主要介绍Unity的多线程式数据导向型技术堆栈(DOTS),将具体阐述DOTS的核心机制与概述。Unity DOTS(Data-Oriented Technical Stack)是一个面向数据的技术堆栈,旨在提供极致的性能优势。它主要包括ECS(Entity Component System)、Job System和Burst Compiler三部分。ECS负责数据存储,Job System负责逻辑运算,而Burst Compiler提供高速编译。这三者相结合,才能达到最高效的运算效果‌。
在这里插入图片描述


一、ECS机制与概述

Entity:实体,是游戏中对象的唯一标识符,不包含任何数据或行为,仅作为组件的容器;
Component:组件数据,包含实体的数据和行为,如位置、速度、生命值等。组件是可复用的,可以在多个实体之间共享;
System:代码算法,负责管理和处理组件,执行游戏逻辑,如移动、攻击、碰撞检测等。

EntityQuery

‌Unity DOTS中的EntityQuery机制是用于在Entity Component System(ECS)中查询实体的一种方式。‌ 通过EntityQuery,开发者可以高效地筛选出符合特定条件的实体集合,以便进行进一步的处理。EntityQuery基于ArchType和Component进行匹配,从而实现对实体的快速查询和筛选‌。

EntityQuery的概述包括以下几个方面:

  1. 查询条件‌:EntityQuery可以根据实体的ArchType和Component来定义查询条件。ArchType定义了实体所拥有的组件的组合,而Component则包含了实体的具体数据。通过定义这些条件,可以精确地筛选出需要处理的实体‌。
  2. ‌性能优化‌:EntityQuery利用ArchType的信息来优化查询性能。由于实体和组件在内存中是连续存储的,通过ArchType可以快速定位到符合条件的实体集合,从而提高查询效率‌。
  3. ‌使用场景‌:EntityQuery适用于需要对大量实体进行筛选和处理的场景。例如,在一个大型游戏中,可能需要查询所有持有特定武器或处于特定位置的敌人实体,以便进行攻击或策略调整。EntityQuery提供了高效的方式来执行这些查询操作‌。

面向数据的编程

我们学C语言的时候,听到过一句名言,程序=数据结构+算法。Entity解决了数据存储的问题,System就是算法算法所需要的数据,来源于Entity中的Component。DOTS提供机制,System可以访问到entity中的组件数据,拿到这些数据后再做逻辑迭代计算与处理。默认System是运行在Unity的main thread上的,为了发挥多核优势,把可以用多线程处理的任务使用多线程,Unity 还提供了JobSystem机制,通过多线程的线程池来迭代计算JobSystem,不放main thread上提升程序的效率。

总结如下

DOTS中会有一个World对象,每个Word对象会有一个EntityManager负责Entity的管理,内部使用了高效的基于ArchType与Chunk机制的内存分配。所有的system会加入到World里面来进行统一迭代,System可以访问Entity中的Component数据。同时JobSystem可以让我们的算法迭代基于多线程处理。
在这里插入图片描述

二、Joy System机制与概述

Job System的核心机制

Job System是DOTS中的一个重要组成部分,它允许开发者通过多线程并行的方式处理来优化项目逻辑。在Unity中,Job System通过IJobParallelFor(或其他IJob接口)来实现,这些接口允许开发者定义如何处理实体和组件数据。Job System的多线程特性使得数据处理可以同时进行,从而显著提高性能‌。

使用Job System的基本步骤

  1. ‌定义数据结构‌:在ECS中,首先需要定义实体和组件。实体是游戏中的对象,而组件则是实体的属性或行为。
  2. ‌创建Job‌:通过实现IJob接口来定义一个Job。这个接口包含一个执行方法,该方法定义了如何处理实体和组件数据。
  3. 调度Job‌:使用EntityCommandBuffer来记录对实体的操作,并通过EntityCommandBufferSystem来调度这些操作。最终,这些操作会被编译成高效的并行计算任务。

实例说明‌

假设我们需要更新游戏中所有敌人的位置,可以创建一个IJobParallelFor来遍历所有敌人实体,并更新它们的位置。这个Job会被调度并执行,利用多核CPU的能力并行处理,从而提高性能‌。

三、Burst Compiler工具链

‌Unity DOTS中的Burst Compiler是一个可以将C#代码编译为高效本地代码的编译器,从而提高游戏的性能和效率。‌ Burst Compiler是Unity DOTS(数据导向技术栈)的一部分,旨在通过优化代码执行来提升游戏性能‌。
传统:.net代码---->il2cpp---->cpp代码,然后再用编译器来编译;
Burst:.net代码LLVM---->native code,使用了单指令多数据集(MMS)

Burst Compiler的主要功能包括

  • ‌数据导向优化‌:Burst Compiler强调数据的连续性和局部性,通过优化代码的执行效率来提升游戏性能。
  • ‌自动代码转换‌:它可以将C#代码自动转换为高效的本地代码,利用SIMD指令和多线程技术来优化性能。
  • ‌动态代码生成‌:Burst Compiler使用动态代码生成技术,根据C#代码生成本地代码,支持多版本生成以适应不同平台‌。

使用Burst Compiler时,开发者需要注意以下几点:

  • ‌属性标注‌:在C#代码中使用BurstCompile属性标注方法,指示Burst Compiler编译这些代码。

  • ‌避免复杂操作‌:Burst Compiler主要适用于简单的数学计算和数组遍历等操作,复杂逻辑可能不适合用Burst Compiler处理。

  • ‌配置启用‌:在Unity编辑器的Player Settings中启用Burst Compiler,确保其在游戏中生效‌。


👉壁纸分享

在这里插入图片描述

在这里插入图片描述

总结

您可能会认为自己还没有为DOTS做好准备,并且可能会担心Unity过渡到全面使用DOTS时自己就会落后。Unity已经承诺会在用户需要时仍为非DOTS工作流程提供支持。这样就为您提供了充足的时间来准备DOTS,因为最终我们希望所有用户都能在某个时候过渡到DOTS。
下篇中,将具体讲解如何使用DOTS的SubScene,让你的项目如鱼得水。
如能帮助到你,就帮忙点个赞吧,三连更好哦,谢谢
你的点赞就是对博主的支持,有问题记得留言评论哦!
不定时更新Unity开发技巧,觉得有用记得一键三连哦。么么哒


http://www.ppmy.cn/news/1538768.html

相关文章

Spark练习json文件-统计问答数据

目录 题目 准备数据 分析数据 实现数据 总结 题目 计算不同分类的问题数量统计问题中的热搜词,并获取top10的热搜词 准备数据 将数据上传到hdfs上 分析数据 读取数据 from pyspark import SparkContext import json import jiebasc SparkContext()# 读取hd…

C语言 | Leetcode C语言题解之第477题汉明距离总和

题目&#xff1a; 题解&#xff1a; int totalHammingDistance(int* nums, int numsSize) {int ans 0;for (int i 0; i < 30; i) {int c 0;for (int j 0; j < numsSize; j) {c (nums[j] >> i) & 1;}ans c * (numsSize - c);}return ans; }

黑马程序员C++提高编程学习笔记

黑马程序员C提高编程 提高阶段主要针对泛型编程和STL技术 文章目录 黑马程序员C提高编程一、模板1.1 函数模板1.1.1 函数模板基础知识 案例一&#xff1a; 数组排序1.2.1 普通函数与函数模板1.2.2 函数模板的局限性 1.2 类模板1.2.1 类模板的基础知识1.2.2 类模板与函数模板1.…

Python列表专题:list与in

Python是一种强大的编程语言,其中列表(list)是最常用的数据结构之一。列表允许我们存储多个元素,并且可以方便地进行各种操作。在Python中,in运算符被广泛用于检测元素是否存在于列表中。本文将深入探讨Python列表及其与in运算符的结合使用。 1. Python列表的基础 1.1 什…

Python | Leetcode Python题解之第477题汉明距离总和

题目&#xff1a; 题解&#xff1a; class Solution:def totalHammingDistance(self, nums: List[int]) -> int:n len(nums)ans 0for i in range(30):c sum(((val >> i) & 1) for val in nums)ans c * (n - c)return ans

Android SELinux——工作模式(二)

通过上一篇文章我们对 SELinux 有一初步的了解&#xff0c;这里我们主要来看一下 SELinux 中的工作模式。 一、模式介绍 SELinux 提供了三种不同的工作模式&#xff0c;每种模式都有其特定的目的和使用场景。这里我们就来介绍这三种模式的使用场景。 1、Disabled&#xff08;…

【60天备战2024年11月软考高级系统架构设计师——第40天:性能优化与高可用设计(总结)】

性能优化和高可用性是现代云架构设计的核心目标。通过合理的策略和设计模式&#xff0c;架构师可以确保系统在高负载情况下仍能快速响应&#xff0c;并且在故障情况下保持服务的持续可用性。理解这些原则和策略&#xff0c;对于构建高性能、高可用的云应用至关重要。 关键策略…

【D3.js in Action 3 精译_034】4.1 D3 中的坐标轴的创建(中一)

当前内容所在位置&#xff08;可进入专栏查看其他译好的章节内容&#xff09; 第一部分 D3.js 基础知识 第一章 D3.js 简介&#xff08;已完结&#xff09; 1.1 何为 D3.js&#xff1f;1.2 D3 生态系统——入门须知1.3 数据可视化最佳实践&#xff08;上&#xff09;1.3 数据可…