Unity Dots

news2025/3/11 21:57:06

文章目录

    • 什么是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.coloradmin.cn/o/2313409.html

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

相关文章

设计模式-结构型模式-桥接模式

概述 桥接模式 &#xff1a;Bridge Pattern&#xff1a; 是一种结构型设计模式。 旨在将抽象部分与实现部分分离&#xff0c;使它们可以独立变化。 它通过组合代替继承&#xff0c;解决类爆炸问题&#xff0c;并提高系统的灵活性和可扩展性。 组成部分 【抽象部分】&#xff08…

Ultravox:融合whisper+llama实现audio2text交互

Ultravox是由Fixie AI开发的一种创新型多模态大语言模型,专为实时语音交互设计。与传统的语音交互系统不同,Ultravox无需单独的语音识别(ASR)阶段,可以直接理解文本和人类语音,实现更快速、更自然的交互体验。Ultravox v0.5在语音理解基准测试中超越了OpenAI的GPT-4o Realt…

clickhouse集群部署保姆级教程

ClickHouse安装 版本要求 23.8及之后的版本 硬件要求 三台机器 建议配置 磁盘 ssd 500G内存 32gcpu 16c 最低配置 磁盘 机械硬盘 50G内存 4gcpu 4c 容量规划 一亿条数据大约使用1TB磁盘容量 参考官方容量推荐 安装包准备 zookeeper安装 zookeeper需要java启动&…

驾培市场与低空经济无人机融合技术详解

随着科技的飞速发展和社会的不断进步&#xff0c;驾培市场正面临着前所未有的变革。传统汽车驾驶培训已不再是唯一的选择&#xff0c;无人机驾驶等新兴领域正逐渐成为驾培市场的重要组成部分。本报告旨在探讨驾培市场与低空经济的融合发展&#xff0c;特别是应用型人才培养与驾…

简单记录一下Oracle数据库与mysql数据库注入的不同。

Oracle数据库的注入比mysql较复制。 一确定注入点&#xff1a;与mysql一样。 and 11 -- #文章有出现. and 12 -- #文章不见了。 二。确定列数。 ’order by 1&#xff0c;2 -- #没问题 order by 1,2,3 -- #保错&#xff0c;所以有两列。 三&#xff0c;所有uni…

如何将本地已有的仓库上传到gitee (使用UGit)

1、登录Gitee。 2、点击个人头像旁边的加号&#xff0c;选择新建仓库&#xff1a; 3、填写仓库相关信息 4、复制Gitee仓库的地址 5、绑定我们的本地仓库与远程仓库 6、将本地仓库发布&#xff08;推送&#xff09;到远程仓库&#xff1a; 注意到此处报错&#xff…

Day04 模拟原生开发app过程 Androidstudio+逍遥模拟器

1、用Androidstudio打开已经写好了的music项目 2、逍遥模拟器打开apk后缀文件 3、在源文件搜索关键字 以后的测试中做资产收集

若依ry-vue分离板(完整版)前后端部署

目录 1.目标 2.准备工作 3.源码下载 4.整理前后端目录 5.先部署后端 &#xff08;1&#xff09;导入数据库 &#xff08;2&#xff09;改代码数据库配置 &#xff08;3&#xff09;运行redis &#xff08;4&#xff09;运行执行文件 &#xff08;5&#xff09;后端启…

【YOLOv8】YOLOv8改进系列(5)----替换主干网络之EfficientFormerV2

主页&#xff1a;HABUO&#x1f341;主页&#xff1a;HABUO &#x1f341;YOLOv8入门改进专栏&#x1f341; &#x1f341;如果再也不能见到你&#xff0c;祝你早安&#xff0c;午安&#xff0c;晚安&#x1f341; 【YOLOv8改进系列】&#xff1a; 【YOLOv8】YOLOv8结构解读…

北大一二三四版全套DeepSeek教学资料

DeepSeek学习资料合集&#xff1a;https://pan.quark.cn/s/bb6ebf0e9b4d DeepSeek实操变现指南&#xff1a;https://pan.quark.cn/s/76328991eaa2 你是否渴望深入探索人工智能的前沿领域&#xff1f;是否在寻找一份能引领你从理论到实践&#xff0c;全面掌握AI核心技术的学习…

【大模型】WPS 接入 DeepSeek-R1详解,打造全能AI办公助手

目录 一、前言 二、WPS接入AI工具优势​​​​​​​ 三、WPS接入AI工具两种方式 3.1 手动配置的方式 3.2 Office AI助手 四、WPS手动配置方式接入AI大模型 4.1 安装VBA插件 4.1.1 下载VBA插件并安装 4.2 配置WPS 4.3 WPS集成VB 4.4 AI助手效果测试 4.5 配置模板文…

STM32步进电机驱动全解析(上) | 零基础入门STM32第五十七步

主题内容教学目的/扩展视频步进电机电路原理&#xff0c;跳线设置&#xff0c;驱动程序&#xff0c;调用控制。熟悉驱动程序&#xff0c;能调用控制。 师从洋桃电子&#xff0c;杜洋老师 &#x1f4d1;文章目录 一、步进电机核心原理图解二、核心特性与优势三、关键驱动方式对比…

[NewStarCTF 2023 公开赛道]ez_sql1 【sqlmap使用/大小写绕过】

题目&#xff1a; 发现id处可以sql注入&#xff1a; 虽然输入id1;show databases;#没什么回显&#xff0c;但是知道这里是字符型注入了 这次利用sqlmap注入 --dbs&#xff1a;列出所有数据库名字 python .\sqlmap.py -u http://a40b2f0a-823f-4c99-b43c-08b94ed0abb2.node5.…

新能源汽车充电综合解决方案:安科瑞电气助力绿色出行

安科瑞 华楠 18706163979 随着新能源汽车的迅猛发展&#xff0c;充电基础设施的建设成为了推动行业进步的关键。然而&#xff0c;充电技术滞后、运营效率低下、车桩比失衡等问题&#xff0c;依然困扰着广大车主和运营商。今天&#xff0c;我们要为大家介绍一款新能源汽车充电…

蓝桥杯java-B组真题—动态规划

目录 一.什么是动态规划? 二.题目 第一种情况:集合本身之和为奇数 第二种情况:集合本身之和为偶数 下面是代码实现: 一.什么是动态规划? 这里就简单的解释一下&#xff0c;动态规划就是记录之前的计算结果&#xff0c;避免重复的计算之前已经计算过的结果&#xff0c;用…

网易邮箱如何用大数据任务调度实现海量邮件数据处理?Apache DolphinScheduler用户交流会上来揭秘!

你是否对大数据领域的前沿应用充满好奇&#xff1f;网易邮箱作为互联网大厂网易的重要业务线&#xff0c;在大数据应用方面有着诸多值得借鉴的实践经验。你是否渴望深入了解网易邮箱如何借助 Apache DolphinScheduler 实现海量邮件数据处理、用户行为分析、实时监控等核心业务场…

前端知识点---路由模式-实例模式和单例模式(ts)

在 ArkTS&#xff08;Ark UI 框架&#xff09;中&#xff0c;路由实例模式&#xff08;Standard Instance Mode&#xff09;主要用于管理页面跳转。当创建一个新页面时&#xff0c;可以选择标准实例模式&#xff08;Standard Mode&#xff09;或单实例模式&#xff08;Single M…

固定表头、首列 —— uniapp、vue 项目

项目实地&#xff1a;也可以在 【微信小程序】搜索体验&#xff1a;xny.handbook 另一个体验项目&#xff1a;官网 一、效果展示 二、代码展示 &#xff08;1&#xff09;html 部分 <view class"table"><view class"tr"><view class&quo…

langchain系列(九)- LangGraph 子图详解

目录 一、导读 二、原理说明 1、简介 2、子图图示 3、使用说明 三、基础代码实现 1、实现功能 2、Graph 图示 3、代码实现 4、输出 5、分析 四、人机交互 1、实现中断 2、历史状态&#xff08;父图&#xff09; 3、历史状态&#xff08;子图&#xff09; 4、历史…

搜索引擎是如何理解你的查询并提供精准结果的?

目录 一、搜索引擎简单介绍 二、搜索引擎整体架构和工作过程 &#xff08;一&#xff09;整体分析 &#xff08;二&#xff09;爬虫系统 三个基本点 爬虫系统的工作流程 关键考虑因素和挑战 &#xff08;三&#xff09;索引系统 网页处理阶段 预处理阶段 反作弊分析…