Unity Dots

文章目录

    • 什么是Dots
    • DOTS的优势
    • ECS(实体组件系统)
    • Job System作业系统
    • Burst编译器
    • 最后

什么是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(实体组件系统)

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编译器

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

最后

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

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Flink-DataStreamAPI-执行模式

一、概览 DataStream API支持不同的运行时执行模式&#xff0c;我们可以根据用例的要求和作业的特征进行选择。 STREAMING执行模式&#xff1a;被称为“经典”执行模式为&#xff0c;主要用于需要持续增量处理并且预计无限期保持在线的无界作业BATCH执行模式&#xff1a;类似…

DeepSeek DeepEP学习(三)normal dispatch

上节介绍了normal kernel执行过程中会分成两部分&#xff0c;第一步通过notify_dispatch计算meta信息&#xff0c;然后本节介绍数据dispatch的过程。 notify_dispatch过程中会计算其他所有rank发送给当前rank多少token&#xff0c;写入到host的moe_recv_counter_mapped&#x…

mysql创建数据库和表

登录 MySQL 并选择数据库 登录 MySQL 命令行&#xff1a;mysql -u root -p 查看所有数据库&#xff1a;SHOW DATABASES; 创建数据库&#xff1a;CREATE DATABASE my_database; 查看数据库是否创建成功&#xff1a;SHOW DATABASES; 选择数据库&#xff1a;USE 你的数据库名…

Python 实现图片提取文字

文章目录 一、效果图 二、库安装 三、使用示例 四、完整代码 一、效果图 使用的图片&#xff1a; 返回文字&#xff1a; 二、库安装 pip install easyocr opencv-python numpy 三、使用示例 ocr EasyOCRProcessor() results ocr.extract_text("test.png",&…

根目录下的两个包相互没有import成功

问题1&#xff1a; import models 或者import models.Models不成功 问题2&#xff1a;在项目名称后面出现unnamed的提示 查阅资料&#xff0c;说错误可能是&#xff1a;.idea 文件夹配置缺失或损坏 PyCharm 的项目配置信息&#xff08;包括名称&#xff09;存储在 .idea 目录中…

什么样的物联网框架适合开展共享自助KTV唱歌项目?

现在物联网的广泛应用&#xff0c;也让更多用户们看到了它的实力&#xff0c;也使得共享经济遍地开花。其中共享自助唱歌设备也备受欢迎&#xff0c;那么适合开展共享自助KTV唱歌项目的物联网框架都应具备哪些特点呢&#xff1f; 智能化与自动化管理 物联网技术在共享KTV中的应…

《白帽子讲 Web 安全》之深入同源策略(万字详解)

目录 引言 一、同源策略基础认知 &#xff08;一&#xff09;定义 &#xff08;二&#xff09;作用 &#xff08;三&#xff09;作用机制详解 二、同源策略的分类 &#xff08;一&#xff09;域名同源策略 &#xff08;二&#xff09;协议同源策略 &#xff08;三&…

【Linux篇】调试器-gdb/cgdb使用

&#x1f4cc; 个人主页&#xff1a; 孙同学_ &#x1f527; 文章专栏&#xff1a;Liunx &#x1f4a1; 关注我&#xff0c;分享经验&#xff0c;助你少走弯路&#xff01; 文章目录 1. 前言2.关于gdb2.1 快速认识gdb2.2 安装cgdb2.3 gdb命令2.4 调试 & 断点 3.常见技巧3.…

推荐一些免费开源支持Vue3甘特图组件

文章目录 前言一、dhtmlxGantt二、frappe-gantt三、vue-ganttastic四、gantt-elastic五、v-gantt六、vue-gantt-schedule-timeline-calendar七、vue-gantt八、总结 前言 在现代项目管理和任务调度中&#xff0c;甘特图是一种非常实用的工具。它能够直观地展示任务的时间安排、…

十大数据科学Python库

十大数据科学Python库 1、NumPy&#xff1a;脊髓2、Pandas&#xff1a;数据操纵专家3、Matplotlib&#xff1a;艺术之魂4、Scikit-Learn&#xff1a;瑞士军刀5、TensorFlow&#xff1a;聪明的家伙6、PyTorch&#xff1a;叛逆者7、Selenium&#xff1a;操纵大师8、NLTK&#xff…

【C++初阶】类与对象(下)

目录 再探构造函数&#xff1a;初始化列表 使用方法&#xff1a; 特点&#xff1a; &#xff11;、初始化列表是每个成员变量定义初始化的地方 &#xff12;、每一成员变量在初始化列表只出现一次 3、必须在初始化列表中出初始化的成员变量 4、成员变量给缺省值 5、在构…

Android设备是如何进入休眠的呢?

首先我们手机灭屏后&#xff0c;一般需要等一段时间CPU才真正进入休眠。即Android设备屏幕暗下来的时候&#xff0c;并不是立即就进入了休眠模式&#xff1b;当所有唤醒源都处于de-avtive状态后&#xff0c;系统才会进入休眠。在手机功耗中从灭屏开始到CPU进入休眠时间越短&…

多线程知识概述

目录 1. 基本知识概述 2. 多线程概述 2.1 优点 2.2 使用场景 3. 创建线程 3.1 继承 Thread 类 3.2 实现 Runnable 接口 3.3 比较 3.4 创建 Callable 接口 3.5 使用线程池 4. Thread 类常用方法 5. 线程生命周期 6. 线程安全机制 6.1 同步代码块 6.2 同步方法 6.3 …

elasticsearch是哪家的

Elasticsearch&#xff1a;数据搜索与分析的领航者 在当今这个信息爆炸的时代&#xff0c;快速且准确地处理海量数据成为了众多企业和组织追求的目标。而Elasticsearch正是在这个背景下脱颖而出的一款强大的开源搜索引擎。它是由位于美国加利福尼亚州的Elastic公司所开发和维护…

Spring学习笔记:工厂模式与反射机制实现解耦

1.什么是Spring? spring是一个开源轻量级的java开发应用框架&#xff0c;可以简化企业级应用开发 轻量级 1.轻量级(对于运行环境没有额外要求) 2.代码移植性高(不需要实现额外接口) JavaEE的解决方案 Spring更像是一种解决方案&#xff0c;对于控制层&#xff0c;它有Spring…

【一个月备战蓝桥算法】递归与递推

字典序 在刷题和计算机科学领域&#xff0c;字典序&#xff08;Lexicographical order&#xff09;也称为词典序、字典顺序、字母序&#xff0c;是一种对序列元素进行排序的方式&#xff0c;它模仿了字典中单词的排序规则。下面从不同的数据类型来详细解释字典序&#xff1a; …

前端学习——CSS

CSS CSS&#xff08;Cascading Style Sheets&#xff09;级联样式表语法 选择器全局选择器元素选择器类选择器ID选择器合并选择器选择器的优先级 字体属性字体颜色 背景属性background-color属性background-image属性background-repeat属性background-size属性background-posit…

【Python 2D绘图】Matplotlib绘图(统计图表)

【Python 2D绘图】Matplotlib绘图&#xff08;统计图表&#xff09; 1. 概述1.1 简介1.2 安装1.3 导入1.4 保存1.5 数据来源1.5.1 Numpy ndarray1.5.2 Pandas DataFrame 1.6 中文显示 2. 基础样式2.1 颜色2.1.1 简称2.1.2 全称 2.2 布局2.2.1 Matplotlib 画布划分2.2.2 绘制子图…

学习笔记:Python网络编程初探之基本概念(一)

一、网络目的 让你设备上的数据和其他设备上进行共享&#xff0c;使用网络能够把多方链接在一起&#xff0c;然后可以进行数据传递。 网络编程就是&#xff0c;让在不同的电脑上的软件能够进行数据传递&#xff0c;即进程之间的通信。 二、IP地址的作用 用来标记唯一一台电脑…

Spark-TTS:基于大模型的文本语音合成工具

GitHub&#xff1a;https://github.com/SparkAudio/Spark-TTS Spark-TTS是一个先进的文本到语音系统&#xff0c;它利用大型语言模型&#xff08;LLM&#xff09;的强大功能进行高度准确和自然的语音合成&#xff1b;旨在高效、灵活、强大地用于研究和生产用途。 一、介绍 Sp…