Unity Dots

ops/2025/3/9 10:48:39/

文章目录

Dots_1">什么是Dots

DOTS(Data-Oriented Technology Stack)是Unity推出的一种用于开发高性能游戏和应用的数据导向技术栈,包含三大核心组件:

ECS架构:实体(Entity)+ 组件(Component)+ 系统(System)的分离式设计
Job System:提供在多个 CPU 核心上并行运行游戏代码的方法
Burst编译器:将C#代码编译为优化的机器码

这些使得 Unity 能够生成高度优化的代码。
在这里插入图片描述

DOTS的优势

1.性能优化:传统的面向对象编程模型可能会导致性能瓶颈,尤其是在需要处理大量相似实体(如敌人、项目、粒子等)时。DOTS 通过将数据放在内存中以连续的方式存储并通过实体组件系统ECS)进行处理,显著提高了内存访问效率和 CPU 利用率。

2.提高并行性:DOTS 中的 Job System 允许开发者轻松地将任务并行化,这样可以充分利用现代CPU多核处理器的优势。通过将游戏逻辑拆分成多个独立的任务,能够同时在多个线程中执行,极大地提高了计算性能。

2.可扩展性:随着游戏复杂性的增加,管理和处理大量实体的需求也随之提高。DOTS 的设计理念使其在处理大规模数据时更加高效,能够轻松支持成百上千的实体而不影响性能。

4.组件化设计:ECS 的组件化模型通过将数据与逻辑分开,提供了更灵活和可重用的代码结构。开发者可以独立修改和组合不同的组件,简化维护和扩展的过程。

5.优化内存使用:DOTS 鼓励以数据驱动的方式组织代码,更少依赖于复杂的对象引用。这样做有助于减少内存碎片,提高内存的整体利用效率。

示例:传统MonoBehaviour在10,000+对象场景下帧率可能低于30FPS,DOTS可实现60FPS以上
硬件利用率提升:多核CPU并行处理效率提升300%+(测试数据:i7-12700K处理20,000实体)

通常被称为DOTS的三个支柱,可作为单独的Unity软件包使用。它们共同构成了交付面向数据的高性能解决方案的基础。
在这里插入图片描述

ECS_29">ECS实体组件系统

ECS 从面向对象的方法转变为面向数据的方法使得重用代码变得更加容易,也使得其他人更容易理解和使用它。它是一个与 GameObjects 兼容的面向数据的框架,凭借前所未有的控制和确定性水平,使经验丰富的 Unity 创作者能够实现更多。

实体创建流程:

// 传统MonoBehaviour转换示例
public class UnitMoverAuthoring : MonoBehaviour
{public float moveSpeed = 2;public float rotationSpeed = 2;//Baker 类负责将 GameObject 的数据和组件转化为可以在 DOTS 中操作的 ECS 实体。private class Baker : Baker<UnitMoverAuthoring>{public override void Bake(UnitMoverAuthoring authoring){Entity entity = GetEntity(TransformUsageFlags.Dynamic);AddComponent(entity, new UnitMover{moveSpeed = authoring.moveSpeed,rotationSpeed = authoring.rotationSpeed,targetPosition = float3.zero,});}}
}//ComponnetData 数据类
public struct UnitMover : IComponentData
{public float moveSpeed;public float rotationSpeed;public float3 targetPosition;
}// System 系统逻辑
public partial struct MoveSystem : ISystem {public void OnUpdate(ref SystemState state) {foreach (var (transform, speed) in SystemAPI.Query<RefRW<LocalTransform>, RefRO<MoveSpeed>>()) {transform.ValueRW.Position.y += speed.ValueRO.Value * SystemAPI.Time.DeltaTime;}}
}

Job System作业系统

C# 作业系统
该系统使 Unity 开发人员能够利用多核计算平台,并行化代码可以安全、高速地运行。C# 作业系统暴露了 Unity 内部的 C++ 作业系统,使 Unity 创作者能够在 Unity 内部处理的同时运行他们的脚本。

//我们定义一个组件,表示实体的速度。
[GenerateAuthoringComponent]
public struct MoveSpeed : IComponentData
{public float Value;
}//创建 JobEntity
public struct MoveJob : IJobEntity
{public float DeltaTime; // 用于控制移动的增量// Execute 方法会对每个具有 MoveSpeed 组件的实体调用public void Execute(ref MoveSpeed moveSpeed, ref Translation translation){translation.Value += moveSpeed.Value * DeltaTime; // 移动逻辑}
}//在系统中使用 JobEntity
public class MoveSystem : SystemBase
{protected override void OnUpdate(){// 获取每帧的时间增量float deltaTime = Time.DeltaTime;// 创建一个 MoveJob 实例var moveJob = new MoveJob {DeltaTime = deltaTime // 设置时间增量};// 调度 Job,处理所有包含 MoveSpeed 和 Translation 组件的实体this.Dependency = moveJob.ScheduleParallel(this.Dependency);}
}

Burst_118">Burst编译器

Burst是一种编译器,可将IL/.NET字节码转换为高度优化的本地代码。它使用业界公认的 LLVM 编译器基础架构,为游戏创作者提供 C# 原生代码的性能。Burst 还暴露了 CPU 的内在特性,从而可以对性能关键代码进行微调。

最后

Unity 面向数据的技术栈Dots
Unity 技术/EntityComponentSystemSamples


http://www.ppmy.cn/ops/164348.html

相关文章

单例模式:确保一个类只有一个实例

目录 引言 1. 单例模式的核心思想 2. 单例模式的实现方式 2.1 饿汉式单例 2.2 懒汉式单例 2.3 线程安全的懒汉式单例 2.4 双重检查锁定&#xff08;Double-Checked Locking&#xff09; 2.5 静态内部类实现单例 2.6 枚举实现单例 3. 单例模式的使用场景 4. 单例模式…

【C++设计模式】第九篇:装饰器模式(Decorator)

注意&#xff1a;复现代码时&#xff0c;确保 VS2022 使用 C17/20 标准以支持现代特性。 动态扩展对象功能的利器 1. 模式定义与用途​ 核心思想 装饰器模式&#xff1a;通过组合对象而非继承&#xff0c;动态地给对象添加额外职责。​关键用途&#xff1a; ​1.运行时扩展功…

【C++】中的赋值初始化和直接初始化的区别

在C中&#xff0c;赋值初始化&#xff08;也称为拷贝初始化&#xff09;和直接初始化&#xff08;也称为构造初始化&#xff09;虽然常常产生相同的结果&#xff0c;但在某些情况下它们有不同的含义和行为。 赋值初始化&#xff08;Copy Initialization&#xff09; 使用等号…

2025CSP-J 冲刺训练(7):表达式递归

2025CSP-J 冲刺训练 7 一、基础知识1. 递归2. 模板 二、基础运用1. Kitty 猫基因编码1.1 审题1.2 分析1.3 参考答案 2. logo 语言2.1 审题2.2 分析2.3 参考答案 一、基础知识 1. 递归 递&#xff1a;把问题给下层的过程 归&#xff1a;总结的过程 2. 模板 dfs(){//处理步骤…

Clion快捷键、修改字体

文章目录 一、Clion快捷键1.撤销&#xff1a;crtl Z2.重做&#xff1a;crtl shift Z3.删除该行&#xff1a;crtl Y4.多行后退&#xff1a;选中多行 Tab5.多行缩进&#xff1a;选中多行 shift Tab 二、修改注释的斜体 一、Clion快捷键 1.撤销&#xff1a;crtl Z 2.重做…

解锁STM32外设:开启嵌入式开发新世界

✨✨✨这里是小韩学长yyds的BLOG(喜欢作者的点个关注吧) ✨✨✨想要了解更多内容可以访问我的主页 小韩学长yyds-CSDN博客 目录 探索 STM32 强大的外设家族 初窥门径&#xff1a;STM32 外设开发基础 开发方式与工具 外设配置基础步骤 深入剖析&#xff1a;常见外设应用实例…

计算机二级备考

1.头文件和命名空间 #include <iostream>//包含标准输入输出流库&#xff0c;用于使用cout和cin进行控制台输入输出。 #include <cmath>//包含数学库&#xff0c;这里虽然代码中未直接使用&#xff0c;但可能后续扩展会用到相关数学函数。 #include <fstream&g…

LINUX网络基础 [五] - HTTP协议

目录 HTTP协议 预备知识 认识 URL 认识 urlencode 和 urldecode HTTP协议格式 HTTP请求协议格式 HTTP响应协议格式 HTTP的方法 HTTP的状态码 ​编辑HTTP常见Header HTTP实现代码 HttpServer.hpp HttpServer.cpp Socket.hpp log.hpp Makefile Web根目录 H…